Servlet 3.0 作为 Java EE 6 规范体系中一员,随着 Java EE 6 规范一起发布。该版本在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化 Web 应用的开发和部署。其中有几项特性的引入让开发者感到非常兴奋,同时也获得了 Java 社区的一片赞誉之声:
- 新增的注解支持:该版本新增了若干注解,用于简化 Servlet、过滤器(Filter)和监听器(Listener)的声明,这使得 web.xml 部署描述文件从该版本开始不再是必选的了。
- 文件上传API简化:从该版本开始,极大地简化了文件上传的操作。
- 异步处理支持: 有了该特性,Servlet 线程不再需要一直阻塞,直到业务处理完毕才能再输出响应,最后才结束该 Servlet 线程。在接收到请求之后,Servlet 线程可以将耗时的操作委派给另一个线程来完成,自己在不生成响应的情况下返回至容器。针对业务处理较耗时的情况,这将大大减少服务器资源的占用,并且提高并发处理速度。
- 动态注册组件: 在初始化ServletContext容器的时候,可以支持动态注册三大组件。
- 可插性支持: 如果说 3.0 版本新增的注解支持是为了简化 Servlet/ 过滤器 / 监听器的声明,从而使得 web.xml 变为可选配置, 那么新增的可插性 (pluggability) 支持则将 Servlet 配置的灵活性提升到了新的高度。
熟悉 Struts2 的开发者都知道,Struts2 通过插件的形式提供了对包括 Spring 在内的各种开发框架的支持,开发者甚至可以自己为 Struts2 开发插件,而 Servlet 的可插性支持正是基于这样的理念而产生的。使用该特性,现在我们可以在不修改已有 Web 应用的前提下,只需将按照一定格式打成的 JAR 包放到 WEB-INF/lib 目录下,即可实现新功能的扩充,不需要额外的配置。
servlet注解
@WebServlet(
name = "AnnotationServlet",
value = {"/AnnotationServlet"},
loadOnStartup = 2,
initParams = {@WebInitParam(name = "user",value = "zhangsan")},
asyncSupported = false
)
public class AnnotationServlet extends HttpServlet {
protected void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("doPost ...");
}
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
System.out.println("doGet ...");
}
}
属性列表: 测试: 打开浏览器输入:http://localhost:8080/AnnotationServlet
检测控制台输出:
filter注解
@WebFilter(
filterName = "AnnotationFilter",
value = {"/*"},
dispatcherTypes = {DispatcherType.REQUEST},
initParams = {@WebInitParam(name = "user", value = "zhansan")},
asyncSupported = false,
servletNames = {"AnnotationServlet"}
)
public class AnnotationFilter implements Filter {
public void init(FilterConfig config) throws ServletException {
}
public void doFilter(ServletRequest req, ServletResponse resp, FilterChain chain)
throws ServletException, IOException {
System.out.println("doFilter ...");
chain.doFilter(req, resp);
}
public void destroy() {
}
}
属性列表:
listener注解
@WebListener()
public class AnnotationListener implements ServletContextListener {
@Override
public void contextInitialized(ServletContextEvent servletContextEvent) {
System.out.println("contextInitialized ...");
}
@Override
public void contextDestroyed(ServletContextEvent servletContextEvent) {
System.out.println("contextDestroyed ...");
}
}
两种配置同时存在
对于servlet来说:
- 若两种配置方式的url-pattern值相同,则应用无法启动。
- 若两种配置方式的url-pattern值相同,那么相当该servlet具有两个映射url-pattern。
对于filter来说: - 无论两种配置方式的url-pattern值是否相同,其都是作为独立的filter出现的。
对于listener来说: - 如果两种配置方式都进行了同一个listener注册,那么也只能算一个listener。
如何禁用注解组件 如果只想要使用web.xml中的配置而忽略注解注册的组件,只需要在web.xml跟标签添加一个属性即可。
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_4_0.xsd"
version="4.0" metadata-complete="false">
</web-app>
metadata-complete=“false”:表示web.xml配置和注解配置同时生效,默认是false。
metadata-complete=“true”:表示web.xml配置有效,而注解配置则被忽略。
|