a我考网

 找回密码
 立即注册

QQ登录

只需一步,快速开始

扫一扫,访问微社区

查看: 140|回复: 1

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

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

使用道具 举报

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

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

</p>  17.) A% N9 C5 y" M4 q( f  g& `
  18.//在子线程中执行营业挪用,并由其负责输出响应,主线程退出
+ B  n( K; z  j$ r  19.AsyncContextctx=req.startAsync();
" t4 j( U8 z* I7 s  |4 G  20.newThread(newExecutor(ctx)).start();+ t' K/ P  a0 F1 Y1 I
  21.out.println("竣事Servlet的时刻:"+newDate()+".");5 X4 ?$ D" l& r9 W( T8 X6 o
  22.out.flush();5 n3 H/ f6 ^8 }9 c4 \& H. j# J7 t
  23.}) v* @" o; K( n& V+ m
  24.}
8 X! B, i# r, x- v+ j  25.publicclassExecutorimplementsRunnable{
( _$ K7 L1 M5 x  26.privateAsyncContextctx=null;  o8 j' `. d7 C- Y1 [. M
  27.publicExecutor(AsyncContextctx){) g+ M3 Q$ C' i. j3 Z
  28.this.ctx=ctx;
) Z$ ?  G2 O: f7 G  29.}/ p9 g; L1 D! f- a  l* H
  30.
' \; U# c" \% k! G) ]) s  31.publicvoidrun(){/ |, K8 N5 W7 w$ p
  32.try{
4 V! z. Y1 E6 p5 t; h2 a. d0 h  33.//期待十秒钟,以模拟营业体例的执行
& C3 |( u8 A) }. z  c" R+ J3 K9 H0 Q  34.Thread.sleep(10000);
- o' P" z, i  I, ]4 y0 T  35.PrintWriterout=ctx.getResponse().getWriter();+ Q" u# X8 [, @+ x" C& p
  36.out.println("营业措置完毕的时刻:"+newDate()+".");
  H# L5 @: Y$ T3 \+ V  37.out.flush();! l7 Z9 O7 O0 Z  d3 x
  38.ctx.complete();% O0 q5 |* B7 J+ c6 r+ o
  39.}catch(Exceptione){) W2 _# q0 i9 B) N8 W
  40.e.printStackTrace();: u1 g4 {- A5 r% o, W) _) H, t1 e
  41.}3 C* j/ R7 h2 W4 x
  42.}
/ O+ r* ?" H+ U  43.}- N) `- L, Z( \7 _. k1 o1 O
  除此之外,Servlet 3.0还为异步措置供给了一个监听器,使用AsyncListener接口暗示。它可以监控如下四种事务:" d! q2 G9 Z& ]  F) R0 a/ x
  1.异步线程起头时,挪用AsyncListener的onStartAsync(AsyncEventevent)体例;6 \+ b5 V2 N7 v+ y% M& o& ]' d
  2.异步线程犯错时,挪用AsyncListener的onError(AsyncEventevent)体例;
0 P  W5 L" q* l3 ^7 \' m, U  3.异步线程执行超时,则挪用AsyncListener的onTimeout(AsyncEventevent)体例;) \" \! N; c' o
  4.异步执行完毕时,挪用AsyncListener的onComplete(AsyncEventevent)体例;
回复 支持 反对

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-6-9 01:47 , Processed in 0.277500 second(s), 24 queries .

Powered by Discuz! X3.4 Licensed

© 2001-2017 Comsenz Inc.

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