Servlet 3.0规范的一个主要目标是无需手动修改应用程序web.xml文件,即可部署servlet,filter(过滤器)和listener(监听器)等。新的特征包括:
Annotation(注释)在filter和servlet中的使用,让部署它们时可以不用在web.xml中声明相关条目。
支持“web片段(fragment)”,由开发人员提供配置信息,无需手动编辑web.xml文件。XML片段放置于/META-INF/web-fragments.xml文件中,它包含大部分与web.xml描述符相同的元素。容器将在部署时处理这些XML片段,并配置最终的描述符。
源于ServletContextListeners的对filter和servlet的编程式配置,这些配置会被放在jar包中的/META-INF/*.tld文件里。
在早期草案审阅阶段,这些特征引起过一些争论。一些专家组成员担心会有严重的安全风险,诸如部署了非预期的filter和servlet,无论这是偶然的或是故意混淆的结果。专家组成员Greg Wilkins在他言辞激烈的博文中将这一规范描述为“糟糕的文档以及缺陷流程下工作不和谐的专家组的成果”。最终建议草案中讨论了大部分以上被关注的问题,包括指定多个jar文件的绝对顺序,以及允许排除个别jar文件。它以如下方式工作:借助META-INF/web-fragment.xml文件中的元素,WEB-INF/lib中的每个jar文件被赋予一个对应的名字。Web应用的WEB-INF/web.xml将包含元素,并以应用的顺序列出以上的片段名,同时它还有一个可选的元素,用于标识是否以及何时包含(include)那些未被命名的jar文件。部署者可以选择只部署那些列表中可信的jar文件,以防止意外部署的问题。此外,在找到web-fragment.xml文件之前,顺序的特性可以排除(exclude)那些不需要扫描的jar文件,因此加速了应用的部署。
除了支持片段以及使用注释,专家组所设定的另一个需求是可以插入框架共享副本,包括JAX-WS,JAX-RS和JSF等构建在Web容器之上的框架。公开评阅草稿中加入的ServletContainerInitializer正是用于处理这个用例。ServletContainerInitializers通过jar服务API被发现,另外它指定它所能处理的一系列类型。任何包含在WEB-INF/lib下jar文件里的的这些类型的类(Class),在发现后会被传递给ServletContainerInitializer,它能够使用与ServletContextListeners相同的编程式来配置APIs。尽管这点广受欢迎,但ServletContainerInitializer也的确引出了另一个新的问题,正如Wilkins在后续的博文中所强调的那样,目前仍不清晰的是使用绝对的顺序机制能否排除ServletContainerInitializer。他给出了一些自己的建议,以澄清这一点:
如果web.xml具有一个不包含元素的,那么只有在顺序中列出的包含片段的jar文件才可以通过注释和可插拔(Pluggability)特征实例化Filter、Listener和Servlet等。具体来说:
被排除的jar文件的web-fragment.xml不会被处理;
对于注释的servlet,filter或listener,被排除的jar文件不会被扫描。但是,如果一个源于被排除的jar的servlet,filter或者listener被列在了web.xml或者非排除性的web-fragment.xml中,除非它被metadata-complete所排除,那么这些注释将被采用。
在被排除的jar文件的TLD文件中所发现的ServletContextListeners将不能够通过编程式APIs配置filter和servlet。任何这样的尝试将导致IllegalStateException异常。
如果从被排除的jar文件中装载一个发现的ServletContainerInitializer,它将会被忽略。
在ServerletContainerInitializers处理类时,将不会扫描被排除的jar文件。
除了这些易于使用的特征,JSR-315还添加了对异步请求的支持,它允许线程提前返回容器并执行其他任务。这个特征备受争议,专家组试图利用已有的RequestDispatcher处理异步的重分发。讨论的结果是,新规范添加了20个方法和3个新的接口。由于其复杂性,在公开审阅阶段被广泛批评。最终建议草案定义了一个明确的分发类型:AsyncContext.dispatch,它被用于执行异步请求,并包含相当简化了的API。@WebServlet和@WebFilter注释具有一个boolean型的属性:asyncSupported,缺省为false。当它被设为true时,应用程序可以通过调用startAsync启动另一个分离的线程进行异步处理,同时传递给它到request(请求)和response(响应)对象的引用,之后从容器里的原线程退出。这意味着response将沿着与进来相同的路径反序遍历这些过滤器(或过滤器链)。当异步处理从request开始时,另一个线程或者回调(callback)也可以产生response并调用complete方法,或者通过AsyncContext.dispatch方法将request分发出去,以便它在容器的上下文环境中运行。
查看英文原文:Java Servlet 3.0 Specification Reaches Proposed Final Draft
分享到:
相关推荐
个人整理的JavaServlet 3.0的API,按Java6 API的风格整理
servlet 3.0 规范提案
Servlet 3.0规范JSR文档,英文文档.
servlet3.0使用手册,这里面有详细的api参考,使用很方便
最新发布的servlet-3.0规范,pdf格式。
JSR-315 专家组发布了规范的最终草案!glashfish v3 提供了全面支持,tomcat 7.0 jboss6.0 目前还在内测中;
Servlet 3.0 源码文件,可以在myeclipse中查看servlet的代码,方便编程
java web servlet 3.0.jar
Servlet 是 Java EE 规范体系的重要组成部分,也是 Java 开发人员必须具备的基础技能,Servlet 3.0 是 Servlet 规范的最新版本。本文主要介绍了 Servlet 3.0 引入的若干重要新特性,包括异步处理、新增的注解支持、...
java上传文件(servlet3.0)
servlet3.0jar下载,非常好用的控制器工具类包,servlet3.0jar下载,非常好用的控制器工具类包,
* @project servlet3.0 * servlet3.0的文件上传 * @date:2012-5-21 *在创建项目的时候首先添加Tomcat7.x的支持,然后把apache-tomcat-7.0.27\conf\web.xml拷贝到项目WEB-INF目录下 *把之前的web.xml覆盖.. 配置...
Servlet3.0新特性解析_03_Servlet3.0监听器、过滤器实现方式详解及Servlet的动态注册剖析
用servlet3.0异步技术,实现推送信息至客户端的聊天室
servlet3.0.zip
servlet 3,jar 包综合;用于javaEE servlet 3.0 开发使用。
基于servlet3.0手写springmvc,实现了IOC和处理器映射器以及处理器映射器功能。
Servlet3.0新特性解析_02_Servlet3.0的异步支持与反向Ajax深入详解Servlet3.0新特性解析_02_Servlet3.0的异步支持与反向Ajax深入详解
servlet3.0-demo, 上传文件demo,基于注解开发
这是最新的javaSERVLET贵发,包含了很多新的特性和功能,欢迎学习