异步措置撑持:有了该特征,Servlet线程不再需要一向梗阻,直到营业措置完毕才能再输出响应,最后才竣事该Servlet线程。在领受到请求之后,Servlet线程可以将耗时的操作委派给另一个线程来完成,自己在不生成响应的情形下返回至容器。针对营业措置较耗时的情形,这将年夜年夜削减处事器资本的占用,而且提高并发措置速度。 新增的注解撑持:该版本新增了若干注解,用于简化Servlet、过滤器(Filter)和监听器(Listener)的声明,这使得 web.xml部署描述文件年夜该版本起头不再是必选的了。可插性撑持:熟悉Struts2的开发者必然会对其经由过程插件的体例与搜罗Spring在内的各类常用框架的整合特征记忆犹新。
3 f4 s+ b+ Y9 U0 r% F8 m, r- ^ 将响应的插件封装成JAR包并放在类路径下,Struts2运行时便能自动加载这些插件。此刻Servlet 3.0供给了近似的特征,开发者可以经由过程插件的体例很便利的扩充已有Web应用的功能,而不需要改削原有的应用。下面我们将一一讲解这些新特征,经由过程下面的进修,读者将能够了了体味Servlet 3.0的转变,并能够顺遂使用它进行日常的开发工作。0 W; ~2 {* |" o8 Y& N
异步措置撑持( B! k/ k u$ ~ Q" C- t- M
Servlet 3.0之前,一个通俗Servlet的首要工作流程年夜致如下:首先,Servlet领受到请求之后,可能需要对请求携带的数据进行一些预措置;接着,挪用营业接口的某些体例,以完成营业措置;最后,按照措置的结不美观提交响应,Servlet线程竣事。0 `6 \, Q' G5 R* U3 X8 ?
其中第二步的营业措置凡是是最耗时的,这首要表此刻数据库操作,以及其它的跨收集挪用等,在此过程中,Servlet线程一向处于梗阻状况,直到营业体例执行完毕。在措置营业的过程中,Servlet资本一向被占用而得不到释放,对于并发较年夜的应用,这有可能造成机能的瓶颈。对此,在以前凡是是采用私有解决方案来提前竣事Servlet线程,并实时释放资本。7 I) u* L' B2 u5 P
Servlet 3.0针对这个问题做了开创性的工作,此刻经由过程使用Servlet 3.0的异步措置撑持,之前的Servlet措置流程可根柢整为如下的过程:首先,Servlet领受到请求之后,可能首先需要对请求携带的数据进行一些预措置;接着,Servlet线程将请求转交给一个异步线程来执行营业措置,线程自己返回至容器,此时Servlet还没有生成响应数据,异步线程措置完营业往后,可以直接生成响应数据(异步线程拥有ServletRequest和ServletResponse对象的引用),或者将请求继续转发给其它 Servlet。如斯一来,Servlet线程不再是一向处于梗阻状况以期待营业逻辑的措置,而是启动异步线程之后可以当即返回。+ x9 G3 b$ x5 c% u% @
异步措置特征可以应用于Servlet和过滤器两种组件,因为异步措置的工作模式和通俗工作模式在实现上有着素质的区别,是以默认情形下,Servlet和过滤器并没有开启异步措置特征,如不美观但愿使用该特征,则必需按照如下的体例启用:9 O" @+ `7 i7 n. g4 A" N
对于使用传统的部署描述文件(web.xml)设置装备摆设Servlet和过滤器的情形,Servlet 3.0为和标签增添了子标签,该标签的默认取值为false,要启用异步措置撑持,则将其设为true即可。以Servlet为例,其设置装备摆设体例如下所示:
+ v9 C7 `+ g0 |+ `1 M 1.9 Z* D8 s k# x5 {5 u! L5 s1 Y" S4 e
2.DemoServlet6 f' T! Q- ^# I# w: H( t, k
3.footmark.servlet.DemoServlet: u4 c; E1 C6 W
4.true2 j$ ^; n- f$ v5 e" T
5.
3 P3 Y0 [* ]+ R: d' g) P 对于使用Servlet 3.0供给的@WebServlet和@WebFilter进行Servlet或过赂设置装备摆设的情形,这两个注解都供给了asyncSupported属性,默认该属性的取值为false,要启用异步措置撑持,只需将该属性设置为true即可。以@WebFilter为例,其设置装备摆设体例如下所示:
7 T7 N: R0 G% y- R 6.@WebFilter(urlPatterns="/demo",asyncSupported=true)
- \# B3 G& V3 L" n 7.publicclassDemoFilterimplementsFilter{...}: t. d/ ~& C$ M# {8 j2 N) _) V/ {
一个简单的模拟异步措置的Servlet示例如下:
& R, a: G- v+ h, q' x* s( h8 D+ k9 e7 a 8.@WebServlet(urlPatterns="/demo",asyncSupported=true)5 Q6 E! X4 V, D- `, q) r
9.publicclassAsyncDemoServletextendsHttpServlet{
" s5 _- V6 y+ e 10.@Override" s# ?9 \. q- n( @: ]+ A* T0 Y
11.publicvoiddoGet(HttpServletRequestreq,HttpServletResponseresp)8 P9 ^& ~ C* I. v7 S
12.throwsIOException,ServletException{$ L6 f1 [, V$ W+ o
13.resp.setContentType("text/html;charset=UTF-8");. c2 G- w2 d. e) u' L
14.PrintWriterout=resp.getWriter();
& m) R/ \3 G" s" } 15.out.println("进入Servlet的时刻:"+newDate()+".");6 ^! O: N. Q: T( X7 d2 U' K
! U4 |8 S% J9 G/ e, S
16.out.flush(); |