写点什么

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:333042
用户头像

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

关注

评论

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

0基础架构入门 - 3(学生管理系统 - 详细架构设计文档)

felix

架构实战营 0基础架构入门

架构实战营 - 模块三作业

Alex.Wu

Go 专栏|并发编程:goroutine,channel 和 sync

AlwaysBeta

Go 语言

CSS交互动画指南之keyframes

devpoint

CSS css3 9月日更

云智一体破解AI落地“最后一公里”难题,企业智能化转型再获新利器

百度大脑

人工智能

二本Java菜鸟9面字节遭虐,苦修数月深造这份 Java面试宝典,终进阿里

Java 程序员 架构 面试 计算机

模块三作业:学生管理系统架构设计文档

apple

直播预告丨走进云溪数据库之高可用方案

云计算

Android的Ftp断点上传---Aria使用笔记

Changing Lin

9月日更

架构实战营-模块三作业

南山先生

「架构实战营」

【架构训练营】【模块三】【作业】【学生管理系统架构文档】

简直走不拐弯

作业 架构训练营

南京主题展2021国际大数据产业展会/论坛会

南京专业智博会

大数据 智博会 南京智博会

物联世界2021南京物联网展览会

南京专业智博会

物联网展览会 物联网论坛会 物联网智博会

什么是数据字典?

奔向架构师

数据库 9月日更

交Y所K线机器人系统开发功能介绍(源码搭建)

量化系统19942438797

机器人 k线

内网渗透横向攻击流程

网络安全学海

黑客 网络安全 信息安全 渗透测试 WEB安全

不会 Lua?Python 助你快速上手 Apache APISIX 插件开发

API7.ai 技术团队

Python Apache 开源 API网关 APISIX

区块链“牵手”金融 面临诸多挑战

CECBC

联邦学习框架浅析

趣链科技

2021南京国际智慧工地装备展览会

南京专业智博会

智博会 智慧工地展览会 智慧工地论坛会

2021年第十四届南京智慧城市展览会

南京专业智博会

智博会 智慧城市展览会 智慧城市论坛会

乘风破浪携手共赢——博睿数据深圳渠道大会圆满落幕

博睿数据

面试官zookeeper 是如何实现一致性的?我大意了,让我回去等通知

Java 面试 分布式 后端

(AL智博会)2021南京国际人工智能主题展

南京专业智博会

人工智能展览会 人工智能论坛会 人工智能智博会

雪花算法,什么情况下发生 ID 冲突?

Java 架构 分布式 算法

架构实战营第二期-模块三作业

娜酱

#架构实战营

中原银行分布式缓存实践

中原银行

redis 中间件 分布式缓存 中原银行

Opus从入门到精通(一):简介

轻口味

android 音视频 9月日更

存储中间件架构梳理

十二万伏特皮卡丘

JavaScript 进阶(二)下

Augus

JavaScript 9月日更

《中国梦》打造数亿中产阶级!疯了,疯了,全涨疯了!!

CECBC

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