5.4 Servlet 3.0新特性
Servlet 3.0在前一版本(Servlet 2.5)的基础上提供了若干新特性用于简化Web应用的开发和部署,其中有几项特性值得特别注意。
● 异步处理支持:通过该特性,Servlet线程在接收到请求之后,可以将耗时的操作委派给另一个线程来完成,自己在不生成响应的情况下返回至容器。针对业务处理较耗时的情况,这将大大减少服务器资源的占用,并且提高并发处理速度。
● 注解支持:通过该特性,可以用于简化Servlet、过滤器(Filter)和监听器(Listener)的声明,这使得web.xml部署描述文件从该版本开始不再是必选的。
● 可插性支持:通过该特性,可以很方便地扩充已有Web应用的功能,而不需要修改原有的应用。
5.4.1 支持异步处理
通过前面的章节可以知道,Servlet在处理业务时是最耗时的,主要体现在数据库操作及其他的跨网络调用等。在处理过程中,Servlet线程一直处于阻塞状态,直到业务方法执行完毕。在处理业务的过程中,Servlet资源一直被占用而得不到释放,对于并发较大的应用,这有可能造成性能的瓶颈。对此,在Servlet 3.0版本之前,通常是采用私有解决方案来提前结束Servlet线程,并及时释放资源。
由于Servlet 3.0支持异步处理,因此可以从根源上解决上述问题,这主要是由于Servlet 3.0处理流程调整为如下的过程:
01 Servlet接收到请求之后,可以先对请求携带的数据进行一些预处理。
02 Servlet线程接着会将请求转交给一个异步线程来执行业务处理,而该线程本身返回至容器。此时由于Servlet还没有生成响应数据,因此必须等异步线程处理完业务以后,才可以直接生成响应数据,或者将请求继续转发给其他Servlet。
通过上述的执行流程可以发现,Servlet线程不再是一直处于阻塞状态以等待业务逻辑的处理,而是启动异步线程之后可以立即返回。
查看Servlet 3.0帮助文档,异步处理特性可以应用于Servlet和过滤器两种组件,由于异步处理的工作模式和普通工作模式在实现上有着本质的区别,因此默认情况下,Servlet和过滤器并没有开启异步处理特性,如果希望使用该特性,则需要按一定方式启用。
5.4.2 支持注解
在Servlet 3.0的部署描述文件web.xml中,在顶层标签<web-app>中存在一个名为metadata-complete的属性,该属性主要用来实现指定当前部署描述文件是否完整。如果该属性设置为true,则容器在部署时将只依赖部署描述文件,忽略所有的注解;如果不配置该属性,或者将其设置为false,则表示启用注解支持。
下面将详细介绍Servlet中常见的几种注解。
1.声明为Servlet注解——@WebServlet
@WebServlet注解主要用于将一个类声明为Servlet程序,在具体运行时,该注解将会在部署时被容器处理,容器根据具体的属性配置将相应的类部署为Servlet程序。@WebServlet注解的常用属性如表5.1所示。
表5.1 @WebServlet注解的属性
2.初始化参数注解——@WebInitParam
@WebInitParam注解主要用于为Servlet或者Filter指定初始化参数,这等价于web.xml文件中<servlet>和<filter>标签的<init-param>子标签。该注解主要配合@WebServlet或者@WebFilter使用。@WebInitParam注解的常用属性如表5.2所示。
表5.2 @WebInitParam注解的属性
3.声明为过滤器注解——@WebFilter
@WebFilter用于将一个类声明为过滤器,在具体运行时,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为过滤器。@WebFilter注解的常用属性如表5.3所示。
表5.3 @WebFilter注解的属性
5.4.3 支持可插性(pluggability)
通过Servlet 3.0版本新增的注解可以简化Servlet、过滤器和监听器的声明,从而使得web.xml配置文件变为可选配置。而对于Servlet 3.0新增的可插性支持则将Servlet配置的灵活性提升到了新的高度,即在可以不修改已有Web应用的前提下,只需将按照一定格式打成的JAR包放到WEB-INF/lib目录下,即可实现新功能的扩充,不需要额外的配置。
为了支持可插性,Servlet 3.0版本引入了称为“Web模块部署描述符片段”的web-fragment.xml部署描述文件,该文件必须存放在JAR文件的META-INF目录下,该部署描述文件可以包含一切可以在web.xml文件中定义的内容。