Servlet3.0 新特性
- 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
- 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
- 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 为例,其配置方式如下所示:
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();
}
}
}