Servlet3.0 新特性
- 格式:doc
- 大小:168.50 KB
- 文档页数:12
一、概述Servlet 是Java EE 规范体系的重要组成部分,也是Java 开发人员必须具备的基础技能,Servlet 3.0 引入的若干重要新特性,包括异步处理、新增的注解支持、可插性支持等,为读者顺利向新版本过渡扫清障碍。
Tomcat 支持servlet版本Servlet版本Tomcat版本Jdk最小版本JA V A EE版本Servlet 2.5 Tomcat 6 1.5 Java EE5Servlet 3.0 Tomcat7 1.6 Java EE6servlet3.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 为<servlet> 和<filter> 标签增加了<async-supported> 子标签,该标签的默认取值为false,要启用异步处理支持,则将其设为true 即可。
以Servlet 为例,其配置方式如下所示:<servlet><servlet-name>DemoServlet</servlet-name><servlet-class>footmark.servlet.Demo Servlet</servlet-class><async-supported>true</async-supported></servlet>2.对于使用Servlet3.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 {@Overrideprotected 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("<br/>");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 {@Overridepublic 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() + ".<br>");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() + ".<br>");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() + ".<br>");out.flush();plete();} catch (Exception e) {e.printStackTrace();}}}除此之外,Servlet 3.0 还为异步处理提供了一个监听器,使用AsyncListener 接口表示。
它可以监控如下四种事件:●异步线程开始时,调用AsyncListener 的onStartAsync(AsyncEvent event) 方法;●异步线程出错时,调用AsyncListener 的onError(AsyncEvent event) 方法;●异步线程执行超时,则调用AsyncListener 的onTimeout(AsyncEvent event) 方法;●异步执行完毕时,调用AsyncListener 的onComplete(AsyncEvent event) 方法;监听器例子:AsyncContext ctx = req.startAsync();ctx.addListener(new AsyncListener() {@Overridepublic void onComplete(AsyncEvent event) throws IOException {// TODO Auto-generated method stubSystem.out.println("--------complitet----");}@Overridepublic void onTimeout(AsyncEvent event) throws IOException {// TODO Auto-generated method stub}@Overridepublic void onStartAsync(AsyncEvent event) throws IOException {// TODO Auto-generated method stub}@Overridepublic void onError(AsyncEvent event) throws IOException {// TODO Auto-generated method stub}});三、新增注解支持Servlet3.0新增了@WebServlet、@WebFilter、@WebListener、@WebInitParam、@MultipartConfig注解。
Servlet 3.0 的部署描述文件web.xml 的顶层标签<web-app> 有一个metadata-complete 属性,该属性指定当前的部署描述文件是否是完全的。
metadata-complete默认值为false。
如果设置为true,则容器在部署时将只依赖部署描述文件,忽略所有的注解。
1.@WebServlet@WebServlet 用于将一个类声明为Servlet,该注解将会在部署时被容器处理,容器将根据具体的属性配置将相应的类部署为Servlet。
@WebServlet 主要属性列表:例子:@WebServlet(name = "servlet1", urlPatterns = {"/s1", "/s1/*"}, loadOnStartup = 1)public class Servlet1 extends HttpServlet {private String msg;public Servlet1() {System.out.println("load on startup");}@Overridepublic void init() throws ServletException {super.init();msg = this.getInitParameter("msg");}@Overrideprotected void doGet(final HttpServletRequest req, final HttpServletResponse resp) throws ServletException, IOException {System.out.println(msg);}}2.@WebInitParam该注解不单独使用,而是配合@WebServlet 或者@WebFilter 使用。