a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 139|回复: 1

[其他] JAVA技巧:剖析简化Web应用开发Servlet3.0特性

[复制链接]
发表于 2012-8-4 12:28:23 | 显示全部楼层 |阅读模式
异步措置撑持:有了该特征,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();
回复

使用道具 举报

 楼主| 发表于 2012-8-4 12:28:24 | 显示全部楼层

JAVA技巧:剖析简化Web应用开发Servlet3.0特性

</p>  17.
& B+ s0 Z) d# I, E) J  18.//在子线程中执行营业挪用,并由其负责输出响应,主线程退出4 J9 h/ L' i6 ]; ]- l8 [3 ?
  19.AsyncContextctx=req.startAsync();5 n( Z; X, b2 x2 o* l) u
  20.newThread(newExecutor(ctx)).start();
+ F' O& y& n0 K  \% R8 h  21.out.println("竣事Servlet的时刻:"+newDate()+".");: E+ w8 M: A. j+ s
  22.out.flush();
, c" B- c/ D: q  23.}
% l3 [' @  O9 q9 s7 m, a  24.}+ X  X) O% A. A
  25.publicclassExecutorimplementsRunnable{
, K0 R; Z5 B8 n3 l  z1 P  26.privateAsyncContextctx=null;
4 [8 ~! ^3 }* ?/ |% r2 a  27.publicExecutor(AsyncContextctx){
4 P8 F- `6 J% P; U3 \) I) ^  28.this.ctx=ctx;) @/ d% p: O5 b8 f
  29.}
9 U+ z0 ~% F$ r+ H) b: h/ Q  30.4 \) J" C) S9 {3 Y: N' |: H* ^
  31.publicvoidrun(){. _( J9 w8 G9 t
  32.try{
: X- z3 f9 N5 a' D5 {0 C8 @; f2 t  33.//期待十秒钟,以模拟营业体例的执行8 Q& b1 V( w/ V' ?& y6 Q
  34.Thread.sleep(10000);
* n! Q, }9 S$ i8 x1 S5 C& u  35.PrintWriterout=ctx.getResponse().getWriter();* B9 [% v% y) M: k: |
  36.out.println("营业措置完毕的时刻:"+newDate()+".");: {; L. T6 X+ \( n6 b
  37.out.flush();% w+ }1 T! D% N$ l
  38.ctx.complete();
/ s8 L/ J- }! N4 h  39.}catch(Exceptione){
7 e4 U! F# }. Z: T% U' L  40.e.printStackTrace();# }2 M4 Q3 l' \4 L4 V' b
  41.}* ?( g( Y; ^( O: n  b9 ^5 C
  42.}) J, S9 I/ u. |* p
  43.}) s; u5 y' R& @0 _# ~4 L
  除此之外,Servlet 3.0还为异步措置供给了一个监听器,使用AsyncListener接口暗示。它可以监控如下四种事务:4 o% Q* |) m' r0 F
  1.异步线程起头时,挪用AsyncListener的onStartAsync(AsyncEventevent)体例;' ]# h8 |; z# S; V) j0 j5 ?
  2.异步线程犯错时,挪用AsyncListener的onError(AsyncEventevent)体例;
* }! i7 i' f. r# K  3.异步线程执行超时,则挪用AsyncListener的onTimeout(AsyncEventevent)体例;$ X: E; H" K4 K  a; }
  4.异步执行完毕时,挪用AsyncListener的onComplete(AsyncEventevent)体例;
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

Archiver|手机版|小黑屋|Woexam.Com ( 湘ICP备18023104号 )

GMT+8, 2024-5-4 00:38 , Processed in 0.289431 second(s), 23 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

快速回复 返回顶部 返回列表