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