在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,表示没有限制。