Servlet3.0 新特性

相关主题
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

一、概述

Servlet 是Java EE 规范体系的重要组成部分,也是Java 开发人员必须具备的基础技能,Servlet 3.0 引入的若干重要新特性,包括异步处理、新增的注解支持、可插性支持等,为读者顺利向新版本过渡扫清障碍。

Tomcat 支持servlet版本

Servlet版本Tomcat版本Jdk最小版本JA V A EE版本

Servlet 2.5 Tomcat 6 1.5 Java EE5

Servlet 3.0 Tomcat7 1.6 Java EE6

servlet3.0 的新特性包括如下方面 :

1.异步处理支持:有了该特性,Servlet 线程不再需要一直阻塞,直到业务处理

完毕才能再输出响应,最后才结束该Servlet 线程。在接收到请求之后,Servlet 线程可以将耗时的操作委派给另一个线程来完成,自己在不生成响应的情况下返回至容器。针对业务处理较耗时的情况,这将大大减少服务器资源的占用,并且提高并发处理速度。

2.新增的注解支持:该版本新增了若干注解,用于简化Servlet、过滤器(Filter)

和监听器(Listener)的声明,这使得web.xml 部署描述文件从该版本开始不再是必选的了。

3.可插性支持:开发者可以通过插件的方式很方便的扩充已有Web 应用的功

能,而不需要修改原有的应用。

二、异步处理支持

异步处理特性可以应用于Servlet 和过滤器两种组件,由于异步处理的工作模式和普通工作模式在实现上有着本质的区别,因此默认情况下,Servlet 和过滤器并没有开启异步处理特性。

异步处理关键是在于将复杂业务处理另外开一个线程,而Servlet将执行好的业务先送往jsp输出,等到耗时业务做完后再送往JSP页面,即先显示一部分,好事业务处理完后再显示一部分。

1.对于使用传统的部署描述文件(web.xml) 配置Servlet 和过滤器的情况,

Servlet 3.0 为 标签增加了 子标

签,该标签的默认取值为false,要启用异步处理支持,则将其设为true 即可。以Servlet 为例,其配置方式如下所示:

DemoServlet

footmark.servlet.Demo Servlet

true

2.对于使用Servlet

3.0 提供的@WebServlet 和@WebFilter 进行Servlet 或

过滤器配置的情况,这两个注解都提供了asyncSupported 属性,默认该属性的取值为false,要启用异步处理支持,只需将该属性设置为true 即可。

以@WebFilter 为例,其配置方式如下所示:

@WebFilter(urlPatterns = "/demo",asyncSupported = true)

public class DemoFilter implements Filter{...}

同步情况例子:

@WebServlet(name = "syncServlet1", urlPatterns = "/sync1")

public class SyncServlet1 extends HttpServlet {

@Override

protected void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {

resp.setHeader("Connection", "Keep-Alive");

resp.setHeader("Proxy-Connection", "Keep-Alive");

resp.setContentType("text/html;charset=utf-8");

PrintWriter out = resp.getWriter();

out.write("hello sync");

out.write("
");

out.flush();

//假设是个耗时任务,此时必须等待

try {

Thread.sleep(2L * 1000);

} catch (InterruptedException e) {

e.printStackTrace();

}

out.write("over");

}

}

模拟异步处理的Servlet 示例:

@WebServlet(urlPatterns = "/demo", asyncSupported = true)

public class AsyncDemoServlet extends HttpServlet {

@Override

public void doGet(HttpServletRequest req, HttpServletResponse resp)

throws IOException, ServletException {

resp.setContentType("text/html;charset=UTF-8");

PrintWriter out = resp.getWriter();

out.println("进入Servlet的时间:" + new Date() + ".
");

out.flush();

//在子线程中执行业务调用,并由其负责输出响应,主线程退出

AsyncContext ctx = req.startAsync();

//设置超时时间

asyncContext.setTimeout(10L * 1000);

//开始任务

//new Thread(new Executor(ctx)).start();//

ctx.start(new Executor(ctx));//这样也可以

out.println("结束Servlet的时间:" + new Date() + ".
");

out.flush();

}

}

public class Executor implements Runnable {

private AsyncContext ctx = null;

public Executor(AsyncContext ctx){

this.ctx = ctx;

}

public void run(){

try {

//等待十秒钟,以模拟业务方法的执行

Thread.sleep(10000);

PrintWriter out = ctx.getResponse().getWriter();

out.println("业务处理完毕的时间:" + new Date() + ".
");

out.flush();

plete();

} catch (Exception e) {

e.printStackTrace();

}

}

}

相关文档
最新文档