写点什么

Java EE 6 Web 层综述:Servlet 获得异步支持、扩展性改善

  • 2010-01-19
  • 本文字数:2166 字

    阅读完需:约 7 分钟

很多 Java Web 应用都是基于某个框架的,如 Apache Wicket、Java ServerFaces、Struts 或是 Spring MVC 等等。要想使用框架,开发者需要在应用的 web.xml 配置文件中注册框架的切入代码,如 Servlet、Filter 或是 Listener。这么做的后果就是部署描述符变得很庞大,同时导致框架所用的 XML 与特定于应用的 XML 混杂在了一起。Servlet 3.0 规范的一个主要目标就是让开发者无需编辑 web.xml 部署描述符就能部署 Servlet、Filter 和 Listener,同时可以将 web.xml 文件拆分成多个模块。为了实现这一点,Servlet 3.0 规范增加了基于注解的配置(@WebServlet、@ServletFilter 以及 @WebServletContextListener),这使得我们可以不再需要 web.xml 文件,同时规范还引入了一个新的概念:Web 片段(Web Fragment)。

Web 片段可以将框架的“样板”XML 与应用的其他配置分开,并且能够实现应用的自我注册。Web 片段必须放在名为 web-fragment.xml 的文件中,该文件只要位于 Web 应用的 classpath 下即可,但通常都将其放到 META-INF 目录下或是框架的 jar 文件中。XML 以元素开始,里面包含的元素与 web.xml 部署描述符大同小异。如下代码所示:

复制代码
<web-fragment>
<filter>
<filter-name>MyXSSFilter</filter-name>
<filter-class> MyXssFilter</filter-class>
</filter>
<servlet>
<servlet-name>myFrameworkServlet</servlet-name>
<servlet-class> MyFrameworkServlet</servlet-class>
</servlet>
<listener>
<listener-class> MyFrameworkListener</listener-class>
</listener>
</web-fragment>

容器在部署时会处理 XML 片段并组装成最终的部署描述符。由于容器负责组装 web.xml 文件,因此如果需要按照特定的顺序来调用框架的 Servlet、Listener 或 Filter 时就可能产生问题。为了避免这个问题,Servlet 3.0 API 支持绝对与相对顺序的部署描述符。我们可以在 web.xml 文件中使用元素指定绝对顺序,这样WEB-INF/lib 下的每个jar 都可以通过META-INF/web-fragment.xml 文件的元素获得一个名字。接下来,Web 应用的WEB-INF/web.xml 文件可以通过元素按照顺序列举出这些片段名,这个顺序就是jar 的调用顺序,同时还有一个可选的元素用于指定是否以及何时包含那些未命名的jar 文件。由于部署者可以选择只列出那些受信任的jar 以进行部署,这样就可以避免意外情况的发生。除此之外,通过顺序还可以排除那些不需要被扫描的jar,这样就可以加快应用的部署速度。最后,如果你不想在产品环境下看到自我注册的情况发生,那就可以在web.xml 文件中使用元素,这会告诉Web 容器只去寻找注解而非Web 片段。

由于既支持片段,又可以使用注解作为另一种配置机制,Servlet 3.0 可以插入框架的共享拷贝,比如JAX-WS、JAX-RS 以及JSF 等,他们都构建在Web 容器之上,使用了ServletContainerInitializers。这些框架是通过jar services API 被检测到的,同时还可以指定其处理的类型列表。对于WEB-INF/lib 下的任何jar 来说,只要其中包含的类被检测到都会传递给ServletContainerInitializer。这样,我们还可以将同样的API 作为ServletContextListeners。

从Servlet API 首次发布以来,构建Web 应用的方法发生了翻天覆地的变化,尤其是使用越来越多的异步Web 技术。这些技术(一般统称为Ajax 或是Web 2.0)对于Web 客户端(比如浏览器)与服务器端之间的传输机制产生了重要的影响,因为客户端会在一个页面中向服务器端发出更多的请求而不是每次请求都刷新一次页面。

长时间的服务器端处理会恶化这一情况,比如等待JDBC 连接池中的连接,或是等待JMS 队列中的消息等。在Servlet 中等待实在是太低效了,因为这种阻塞会消耗线程以及其他有限的系统资源。鉴于此,Servlet 3.0 引入了异步处理请求的功能,这样线程就可以返回到容器中并执行其他任务。在请求上的异步处理开始时,其他线程或是回调既可以生成响应,也可以分发请求以便通过AsyncContext.dispatch 方法在容器上下文中执行请求。

由于异步Servlet 的行为与同步的差别非常大,因此Servlet 3.0 要求开发者指定asyncSupported=true 以表示Servlet 支持异步请求。不仅是Servlet,Filter 也可以异步执行。Servlet 3.0 通过新的ServletRequest 方法来支持异步处理,比如startAsync() 会返回一个AsyncContext 对象,该对象用于持有传递给方法的request 与response 对象。这里,处理原始请求的线程还可以执行其他操作。此外,API 还引入了一个新的Listener 类:AsyncListener,它会告诉我们异步操作何时结束或者是否超时了。AsyncContext 类拥有一个complete() 方法,凭借该方法我们可以在异步操作结束后提交响应。AsyncListener 类拥有一个dispatch() 方法,它会将异步请求转发给容器,这样其他框架(比如JSP)就可以生成响应了。

除了引入大量的新技术和新方法外,Servlet 3.0 规范还对其他地方进行了大量的增强:HttpServletRequest 终于获得对multipart/form-data MIME 类型的内置支持了、Cookie 类开始支持“HttpOnly” cookie 以避免某些跨站点的脚本攻击、ServletContext API 也得到了更新,我们可以通过编程的方式将Servlet 和Filter 加到上下文中了。

查看英文原文: The Java EE 6 Web Tier: Servlets Gain Asynchronous Support, Improved Extensibility

2010-01-19 02:332968
用户头像

发布了 88 篇内容, 共 263.2 次阅读, 收获喜欢 8 次。

关注

评论

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

多模态大模型活动 | 使用 PAI×LLaMA Factory 搭建文旅问答机器人

阿里云大数据AI技术

人工智能 LLM PAI 问答机器人

Navicat Premium 数据库管理 --Navicat Premium中文汉化包

Rose

火山引擎数据飞轮线上研讨会即将开启,助力消费品牌双十一造爆款

字节跳动数据平台

拼多多详情API接口的获取与应用

科普小能手

拼多多 API 接口 API 测试 pinduoduo API 拼多多数据

Taro 鸿蒙技术内幕系列(一):如何将 React 代码跑在 ArkUI 上

京东零售技术

taro 鸿蒙 前端

生成式AI时代的内容安全与系统构建:合合信息文档图像篡改检测创新方案

海拥(haiyong.site)

人工智能

Sketch:专业设计工具首选,成就非凡视觉

Rose

高效的剪辑和渲染能力 Final Cut Pro X简体中文安装包

Rose

Stability AI一口气推出3款图像生成模型系列!升级版Claude 3.5 Sonnet能像人类一样操控电脑|AI日报

可信AI进展

CST如何选择时域求解器的频率范围

思茂信息

cst使用教程 电磁仿真 频率

PaddleNLP上新!浪潮信息源2.0全面接入,大模型生态加速进化!

百度Geek说

百度 数据 大模型

鸿蒙网络编程系列34-Wifi热点扫描及连接示例

长弓三石

DevEco Studio 开发实例 HarmonyOS NEXT 网络与连接

如何处理海量数据?基于Milvus向量数据库的高度可扩展性

Zilliz

人工智能 Milvus 大模型 Zilliz 向量数据库

Photoshop 2024对电脑配置有什么要求?ps2024破解安装包分享

Rose

如CGI一般的分子动力学,让科学家看到了3D渲染后的分子运动「影片」

新消费日报

氢健康用品展|2025第36届广州国际大健康博览会

秋硕展览

浅谈活动中台系统技术债管理实践

vivo互联网技术

技术债 效能提升 项目质量 系统稳定

AlDente——Mac 电池管理大师,续航无忧!

Rose

Visual Studio Code:专业编程工具首选,成就卓越代码!

Rose

macOS Big Sur(苹果macos11系统)安装包分享及安装教程

Rose

非凸科技银牌赞助GOSIM CHINA 2024,并受邀出席Rust分论坛

非凸科技

开源 rust

WiFi7 Module Main Chips: QCN9274, QCN6274, QCN6224, QCN9224-how to choose?in-Depth Analysis them

wifi6-yiyi

5G wifi 6G

【论文速读】| 攻击图谱:从实践者的角度看生成式人工智能红队测试中的挑战与陷阱

云起无垠

ai2021安装包 及 Illustrator 2021安装教程

Rose

NocoBase 本周更新汇总:子表格支持分页、工作流优化等

NocoBase

开源 低代码 无代码 产品更新

增长在流量规则巡检的探索实践|得物技术

得物技术

测试 质量保障 流量巡检

商场LED透明屏:选择参考分析

Dylan

品牌 LED display LED显示屏 零售电商市场

1024|京东零售技术人的N种可能

京东零售技术

1024

京东商品详情API详解:全面掌握返回值字段

代码忍者

API 接口 pinduoduo API

MicrosoftOffice2019密钥 office2019激活教程

Rose

鸿蒙网络编程系列35-通过数据包结束标志解决TCP粘包问题

长弓三石

DevEco Studio 开发实例 HarmonyOS NEXT 网络与连接

Java EE 6 Web层综述:Servlet获得异步支持、扩展性改善_Java_Charles Humble_InfoQ精选文章