BT

如何利用碎片时间提升技术认知与能力? 点击获取答案

Servlet 3.0新特性引发争论

| 作者 Charles Humble 关注 936 他的粉丝 ,译者 韩锴 关注 0 他的粉丝 发布于 2008年6月7日. 估计阅读时间: 6 分钟 | CNUTCon 了解国内外一线大厂50+智能运维最新实践案例。

大多数Java Web框架都构建于Servlet API之上,并且除了依赖于WEB-INF/lib目录之外,还需要你在应用程序的web.xml中配置一个或者多个Servlet、过滤器或监听器。JSR-315,即Servlet 3.0规范,计划将成为JEE 6的一部分。它在试图改变这种现状。规范目前还处于早期的草案阶段,可以在这里下载并审阅。

为了达到零配置和可插拔的目标,规范中建议了几种新特性,其中包括:

  1. Annotation(注释):Servlet 3.0规范引入了大量新的Annotation,比如@Servlet,它为Servlet提供了url-mapping信息——@Servlet(url-mapping=”/foo”);@ServletFilter,它与@FilterMapping一起使用,可以定义Web应用程序中的过滤器。
  2. 支持web.xml片段(flag):其中包含Servlet、过滤器和监听器的定义,可以与web.xml合并到一起,允许Web框架将所需的控件打包到一个jar中,这样使用起来可以更容易。

新规范使用一个metadata-complete(完全使用metadata的)标记来控制Annotation与web.xml片段的查找。这些特性在专家组内部正在引发激烈的争论,有些人担心这会带来严重的安全风险,比如无意或者故意地部署了非预期的Filter和Servlet。还有一些争论是围绕这些新特性是否足够灵活展开的。最后,专家组在等待来自社区的反馈。Greg Wilkins在他的Blog中详细描述了他所关心的问题,特别提到了Web片段的自动查找与合并,并列出了三种可能的方案之一:使用可选的<include> 选项了引导配置的自动发现行为。

“如果没有web.xml或者3.0 web.xml中没有列出任何包含项,在当前提议的草案中,默认情况下会完整查找WEB-INF以发现被标注过(annotated)的Servlet和Filter、TLD监听器和web.xml片段。但是,如果web.xml包含了<include>元素,发现过程将被改变,如下例所示:

<include src="WEB-INF/lib/dwr.jar"/>
<include src="WEB-INF/lib/cometd.jar"/>
<include src="WEB-INF/classes"/>

这些<include>表明只需要在dwr.jar和cometd.jar扫描Annotation、TLD片段和web.xml片段,而在WEB-INF/classes中扫描注释过的Servlet。容器不会再扫描其他的类或者jar,除非在web.xml的某个地方将它们列在include元素中。”

Rajiv Mordani对规范提出了质疑

“实际上,Greg Wilkins提出的include方案的好处非常有限,尤其是人们主要的关注点有时是在Servlet和Filter是否在用户没有预期的情况下被暴露出去。我认为确保没有特定类型的组件被暴露应该是框架开发者的工作,而不是框架使用者的事情。通过使用一个标签来控制查找,你可以有效地获得include机制的功能,唯一的例外是,你无法只针对某个特定的Jar包集合进行查找。不过,利用include机制列出你希望查找的jar,可能只会令描述符变得更复杂。”

在今年的JavaOne大会上,专家组讨论了另外两种可能的方案。其一是除了metadata-complete标记外,再引入第二个标记,用来激活/禁用web片段和启用/关闭Web片断的查找,以及其他Annotation的功能。但是,正如Rajiv Mordani指出的,Annotation机制已经可以通过web.xml文件被覆写,提供一个更合理的控制的级别:

“如果使用Annotation声明Servlet和Filter,相应的Servlet/Filter就必须有一个url-mapping/FilterMapping属性。按照这种方式,如果没有显式的映射,要暴露哪个Servlet,是没有任何约定的。同时,如果考虑到Java EE平台的其他部分,尤其是EJB和Web Service这类技术,那么部署描述符过去经常会覆盖Annotation中设置的信息...如果你不想让容器处理任何Annotation,而是想通过部署描述符确定所有的配置信息,那么就像Java EE 5平台的其他部分一样,我们的描述符中有一个metadata-complete元素。如果这个元素存在并且设置为‘true’,容器将不会处理任何Annotation的信息,仅仅使用描述符中指定的配置信息。处于性能和安全性的考量,这种方法可以关闭自动查找行为。”

另一个选择是提供一种机制在应用程序的web.xml中禁用Servlet和Filter,这样任何在生产环境中不需要的Servlet,都可以应用程序的主web.xml来禁用,例如:

  <servlet> 
<servlet-name>FrameworkServlet</servlet-name>
<enabled>false</enabled>
</servlet>

可以把你的反馈发送到专家组jsr-315-comments@jcp.org

查看英文原文Servlet 3.0 Features Spark Debate

评价本文

专业度
风格

您好,朋友!

您需要 注册一个InfoQ账号 或者 才能进行评论。在您完成注册后还需要进行一些设置。

获得来自InfoQ的更多体验。

告诉我们您的想法

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我
社区评论

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

允许的HTML标签: a,b,br,blockquote,i,li,pre,u,ul,p

当有人回复此评论时请E-mail通知我

讨论

登陆InfoQ,与你最关心的话题互动。


找回密码....

Follow

关注你最喜爱的话题和作者

快速浏览网站内你所感兴趣话题的精选内容。

Like

内容自由定制

选择想要阅读的主题和喜爱的作者定制自己的新闻源。

Notifications

获取更新

设置通知机制以获取内容更新对您而言是否重要

BT