写点什么

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

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

关注

评论

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

PLG公司的机遇和挑战

LigaAI

SaaS LigaAI PLG

中国SaaS的增长真相|ToB大师课

ToB行业头条

适合中小企业的知识库软件有哪些?

小炮

知识管理

【Zeekr_Tech】汽车软件敏捷开发和分支管理

Zeekr_Tech

敏捷开发 智能驾驶

在线XML转JSON工具

入门小站

工具

提升职场竞争力!低代码开发师(高级)认证发布

一只大光圈

低代码 数字化 钉钉宜搭 宜搭

Apache flink - PartitionNotFoundException

李印

flink 消费 kafak 错误排查

linux之ssh命令

入门小站

Linux

netty系列之:netty中的核心解码器json

程序那些事

Java Netty 程序那些事 4月月更

Redis集群架构剖析(5):复制与故障转移

非晓为骁

主从复制 redis cluster master

领域驱动设计(DDD)靠谱么?

架构精进之路

DDD 4月日更 4月月更

无需编程,基于甲骨文oracle数据库零代码生成CRUD增删改查RESTful API接口

crudapi

oracle 零代码 API crud 增删改查

圆桌派来啦!与行业大咖聊聊Dapr的发展与实践

行云创新

云原生 dapr

云上MongoDB常见索引问题及最优索引规则大全

MongoDB中文社区

mongodb

C++11 智能指针之shared_ptr<void>

轻口味

c++ android 4月月更

C++后端开发进阶学习大纲指南

赖猫

c++

《数字经济全景白皮书》Z世代用户洞察篇(1)重磅发布!

易观分析

Z世代

智能化时代的数据集成技术革新

Apache SeaTunnel

大数据 开源 数据同步 Meetup Apache SeaTunnel

足不出户,搞定交付——独家交付秘籍(第二回)

阿里巴巴云原生

【高并发】解密导致并发问题的第三个幕后黑手——有序性问题

冰河

并发编程 多线程 协程 异步编程 精通高并发系列

微信朋友圈的高性能复杂度

哈喽

「架构实战营」

HertzBeat入GVP啦,并 v1.0.beta.7 发布,易用友好的云监控系统

TanCloud探云

开源 APM angular java;

EMQ 映云科技为抗疫项目提供全托管 MQTT 云服务免费使用

EMQ映云科技

物联网 IoT mqtt emq 抗疫

数字产业化快于产业数字化?

BeeWorks

我真不信,这年头还有人能懂SpringBoot的ClassLoader加载机制

Java工程师

Java spring 程序员 科技

怒肝 JavaScript 数据结构 — 栈篇(二)

杨成功

数据结构 4月月更

传统链游的革新,PlatoFarm用实际行动回馈Dao社区

西柚子

博睿数据首批加入云科通明湖生态联盟,赋能信创生态谋未来

博睿数据

预约中,2022京东云产业融合新品发布会线上开启

京东科技开发者

云计算 京东云 产品发布会 直播预约

传统链游的革新,PlatoFarm用实际行动回馈Dao社区

BlockChain先知

互联网的下一站,大概率是能源

脑极体

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