在javaEE6出现之后,servlet3.0也随之的出现了,可以说servlet3.0的出现实现了一个巨大的突破,随着servlet3.0的出现,传统的采用web.xml来进行javaWeb开发部署的方式已经被逐渐抛弃,新的方式则是采用相应的annotation机制来运行。
在这里如果读者发现自己所搭建的servlet不能够支持annotation这种机制的话,有可能是以下的几种版本不匹配的原因:(在这里我用的服务器是tomcat)
1.Java EE6版本出现后才开始支持servlet3.0
2.tomcat7.0开始才支持servlet3.0
3.jdk1.6开始才支持servlet3.0
servlet3.0的最大优点就是简化了web的应用开发和部署,该版本新增了若干注解用于简化 Servlet、过滤器(Filter)和监听器(Listener)的声明,这使得 web.xml 部署描述文件从该版本开始不再是必选的了。
对于servlet3.0里面出现了的新的声明主要为以下几个内容:
@WebFilter
相应的主要属性有:
name 等价于 servlet-name标签
value 等价于 urlPatterns 标签
urlPatterns 等价于 url-pattern 标签
loadOnStartup 等价于 load-on-startup 标签
initParams 等价于 init-param 标签
asyncSupported 等价于 async-supported 标签
description 等价于 description 标签
displayName 等价于 display-name 标签
@WebInitParam
相应的主要属性有:
name 等价于 param-name标签
value 等价于 param-value标签
description 等价于 description标签
@WebFilter
相应的主要属性有:
filterName 等价于 filter-name标签
value 等价于 urlPatterns 标签
urlPatterns 等价于url-pattern标签
简单的servlet代码操作:
package com.sise.lh.test; import java.io.IOException; import java.io.PrintWriter; import javax.jws.soap.InitParam; import javax.servlet.FilterConfig; import javax.servlet.ServletConfig; import javax.servlet.ServletException; import javax.servlet.annotation.WebInitParam; import javax.servlet.annotation.WebServlet; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; @WebServlet(name="servlet_001",urlPatterns="/servlet_002", initParams={@WebInitParam(name="path",value="this is a path")}) public class servlet_001 extends HttpServlet { private static final long serialVersionUID = 1L; @Override public void destroy() { // TODO Auto-generated method stub super.destroy(); } public servlet_001() { super(); } protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doPost(request, response); } protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out=response.getWriter(); out.print("servlet3.0test!!"); ServletConfig config=this.getServletConfig(); String content=config.getInitParameter("path"); System.out.println("request:"+content); out.close(); } } 复制代码
网页结果截图:
这个时候你会发现实际在网址处显示的路径结尾并不是servlet_001,这是因为在servlet3.0里面新增了相应的声明标志,将正式的servlet的urlPatterns参数值对路径名进行了调整,这样做的好处不会暴露出真实的servlet的路径名称,能够提高网页的安全性。
结合上边所提及的servlet,我编写了一个非常简单的过滤器做测试:
package com.sise.lh.test; import java.io.IOException; import javax.servlet.Filter; import javax.servlet.FilterChain; import javax.servlet.FilterConfig; import javax.servlet.ServletException; import javax.servlet.ServletRequest; import javax.servlet.ServletResponse; import javax.servlet.annotation.WebFilter; /** * Servlet Filter implementation class filter_test */ /*这里的标签声明该过滤器是针对所有的servlet都有效果的*/ @WebFilter(filterName="filtertest",urlPatterns="/*") public class filter_test implements Filter { public filter_test() { } public void destroy() { } public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("this is a test!"); chain.doFilter(request, response); } public void init(FilterConfig fConfig) throws ServletException { } } 复制代码
由于上方的servlet采用的@WebInitParam声明,所以会将相应的path变量进行了初始化赋值,
而在@WebFilter里面,我们使用了urlPatterns=”/*”,这一句的意思是指针对同一个项目下方的每一个servlet文件而言,每当访问一次servlet,都会进行一次过滤操作,因此在控制台窗口我们也会见到如下的结果
@WebListener
它相当于旧版本的servlet里面的监听器,
其所含有的属性值value是指该监听器的描述信息。
在这里我也写了一个简单小程序让初学者来理解一下它的含义:
package com.sise.lh.test; import javax.servlet.ServletContextEvent; import javax.servlet.ServletContextListener; import javax.servlet.annotation.WebListener; /*监听器是在服务器开启和关闭的时候启动的*/ @WebListener public class ListenerTest implements ServletContextListener { @Override public void contextDestroyed(ServletContextEvent arg0) { // TODO Auto-generated method stub System.out.println("------服务器刚刚关闭了-------"); } @Override public void contextInitialized(ServletContextEvent arg0) { // TODO Auto-generated method stub System.out.println("------服务器刚刚开启了-------"); } } 复制代码
代码敲好之后直接运行服务器,楼主运行的是tomcat8.0版本,因此截图如下所示:
当服务器开启的时候:
当服务器关闭的时候:
@MultipartConfig
该标志主要是声明servlet可以对请求的MIME类型是 multipart/form-data的页面进行相应的处理,使用该声明还可以简化相应的文件上传代码量。
其相应的主要属性有:
fileSizeThreshold int 这是指当数据量大于该值时,内容将被写入文件。
location 这是指文件上传的地址
maxFileSize 这是指允许上传的文件最大值。默认值为 -1,表示没有限制。
maxRequestSize 是 针对该 multipart/form-data 请求的最大数量,默认值为 -1,表示没有限制。