写点什么

Java Servlet 3.0 规范发布最终建议草案

  • 2009-06-12
  • 本文字数:2100 字

    阅读完需:约 7 分钟

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


译者简介:刘一鸣,目前在复旦大学攻读计算机软件与理论博士学位。主要从事分布式系统、分布式数据库、协同计算等领域的研究和开发工作。关注系统架构、云计算进展。希望自己的专业知识可以为更多人服务。业余时间大部分贡献给了书籍,希望将来可以有家自己的书店。给 InfoQ 中文站投稿或者参与内容翻译工作,请邮件至 editors[AT]cn.infoq.com

2009-06-12 10:163295

评论

发布
暂无评论
发现更多内容

3D视觉特效剪辑合成: Flame 2023 激活版

真大的脸盆

Mac Mac 软件 视频特效合成 视频特效工具

百度“文心一言”发布两天12家企业签约,申请测试企业破9万

科技热闻

PyTorch 深度学习实战 | 基于YOLO V3的安全帽佩戴检测

TiAmo

数据采集 PyTorch

强大的ai技术图像编辑器:Luminar Neo 激活版

真大的脸盆

图像编辑 编辑图像 图像处理工具

手把手教你Mac重装系统不再难:苹果电脑重装系统教程

互联网搬砖工作者

《C++编程规范-101条规则 准则与最佳实践》读书笔记

老王同学

c++ 读书笔记

简单的文件同步工具:SyncTime激活版

真大的脸盆

Mac Mac 软件 同步文件工具 同步工具

关于如何提升研发效能的一些思考

阿呆

SpringBoot 实现 MySQL 百万级数据量导出并避免 OOM 的解决方案

Java你猿哥

Java MySQL spring Spring Boot ssm

Golden Gate 发布项目白皮书,测试网络即将上线

股市老人

马士兵教育2023年全新Java架构师学习路线「首发版」

Java你猿哥

Java 学习 架构 面试 后端

站在工作的角度体验一下文心一言

IT蜗壳-Tango

IT蜗壳 ChatGPT 文心一言 文心一言测试

腾讯架构师手撸这份标星过万的"计算机网络协议笔记"全网爆火

Java你猿哥

架构 网络安全 ssm 架构师 分布式架构

三天吃透Spring Cloud面试八股文

程序员大彬

Java 面试 SpringCloud

如何重装mac系统,u盘安装苹果macos系统教程

互联网搬砖工作者

凭借这份阿里2023版Java架构师面试指南,我一周时间斩获了5个Offer!

Java永远的神

程序员 程序人生 后端 架构师 java面试

互联网工程师1000道Java面试题整理全集,助你一路绿灯

Java你猿哥

Java 面试 SSM框架 八股文 Java八股文

DUIN开源的镜像更新通知工具

mengzyou

container DevOps image

SpringBoot启动之准备系统环境environmentPrepared

石臻臻的杂货铺

spring springboot

域名备案不备案的区别是什么?

源字节1号

运维 软件开发 前端开发 后端开发 小程序开发

SpringBoot 集成 Druid 数据源

Java你猿哥

Java Spring Boot 后端 ssm Druid

霸榜牛客!阿里P8大牛整理的Java面试核心知识点竟如此霸道

Java你猿哥

Java 面试 ssm 面经 java核心知识

TGO笔记-AIGC分享之投资视角(61/100)

hackstoic

AI ChatGPT 创业投资

浅析三款大规模分布式文件系统架构设计

Java你猿哥

架构 分布式 架构设计 分布式架构 系统架构设计手册

战损版JavaAgent方法耗时统计工具实现

Java你猿哥

Java Spring Boot Java Agent ssm

Photoshop 2023 (版本 24.2)的新增功能和增强功能

互联网搬砖工作者

树状数组模板与练习

timerring

算法

欢迎来到 Python 入门级教程!

阿呆

Python

AlertDialog(对话框)详解

芯动大师

android AlertDialog 对话框

python中进程、线程、协程的实践

阿呆

2023金三银四Java高级工程师面试 1000 题+答案(全)

架构师之道

编程 程序员 java面试

Java Servlet 3.0 规范发布最终建议草案_Java_Charles Humble_InfoQ精选文章