NVIDIA 初创加速计划,免费加速您的创业启动 了解详情
写点什么

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

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

关注

评论

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

云桌面GPU技术方案

青椒云云电脑

图形工作站

LeetCode题解:7. 整数反转,迭代,JavaScript,详细注释

Lee Chen

JavaScript LeetCode

如何实现虚拟云桌面?

青椒云云电脑

桌面云 云桌面

不同构架云桌面的部署风险

青椒云云电脑

云桌面 青椒云云桌面

海外运营视频直播App,服务器放在哪?

山东布谷科技胡月

语音聊天APP源码 国际版语音直播APP 交友软件开发 海外直播App开发 直播交友源码

虚拟云桌面在实验教学中的应用与实践

青椒云云电脑

桌面云 云桌面

五点告诉我们云教室比传统机房好

青椒云云电脑

云教室

性能最佳实践

FunTester

WorkPlus——高效私有化办公平台,实现即时协作与信息安全的完美结合

WorkPlus

低代码是程序员“玩”出来的

这我可不懂

低代码 应用开发 造轮子

WorkPlus Meet白板和文档共享功能上线,私有化视频会议全新升级

WorkPlus

无障碍测试解读

QE_LAB

无障碍 测试技术干货 测试技术

云桌面在教学中的应用

青椒云云电脑

云桌面

使用云电脑9条注意事项

青椒云云电脑

云电脑

低代码平台:程序员的应用开发好帮手

高端章鱼哥

低代码 应用开发 企业级应用 JNPF

业务喜报丨九科信息成功签约四川中烟工业有限责任公司成都卷烟厂RPA项目

九科Ninetech

RPA RPAxAI

私有化部署即时通讯平台,完美替代飞书和钉钉的SaaS系统

WorkPlus

云桌面应用下的数据防护新思路

青椒云云电脑

云桌面

高性能存储 SIG 月度动态:erofs 新增支持多个重要特性,持续构建容器场景竞争力

OpenAnolis小助手

开源 容器 高性能存储 龙蜥社区 sig

腾讯云TDSQL- C Serverless 2.0版发布,多项核心技术首次公开解析

Geek_2d6073

云桌面跟PC相比能有哪些不一样的体验?

青椒云云电脑

桌面云 云桌面

【效率提升】手把手教你如何使用免费的 Amazon Code Whisperer 提升开发效率堪比 GitHub Copilot 平替

亚马逊云科技 (Amazon Web Services)

影响云桌面性能的三个重要因素是什么?

青椒云云电脑

云桌面

不同构架云桌面的部署风险

青椒云云电脑

云桌面

火热的低代码,是时候系统的来学一学了!

互联网工科生

低代码 应用开发 数字化工具

祝贺!Databend Cloud 入驻 AWS 云市场

Databend

WorkPlus打造统一用户管理平台,实现企业用户管理的一体化

WorkPlus

什么是云电脑?

青椒云云电脑

云电脑

虚拟云桌面和共享云桌面有啥区别

青椒云云电脑

云桌面

为什么要使用虚拟云桌面?

青椒云云电脑

云桌面 青椒云云桌面

八种十倍提升API性能的方式

树上有只程序猿

数据库 服务器 API 接口

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