【发布时间】:2014-08-25 03:59:15
【问题描述】:
为什么 web.xml 从 servlet 3.0 中移除?现在是通过 Java 完成配置。
【问题讨论】:
-
它没有被删除。它已成为可选。
为什么 web.xml 从 servlet 3.0 中移除?现在是通过 Java 完成配置。
【问题讨论】:
Servlet 3.0 中并未删除对 web.xml 的支持,并且 (IMO) 在可预见的将来不太可能将其删除。
证据?如果你下载 Servlet 3.0 规范并搜索“web.xml”,你会看到很多对它的引用。
最有说服力的引述在 A6.6 中
"如果 Web 应用程序不包含任何 web.xml,则它不需要包含 Servlet、过滤器或侦听器组件。换句话说,一个应用程序只包含 静态文件或 JSP 页面不需要存在 web.xml。”
它的意思是允许 webapp 省略“web.xml”文件......但也允许包含一个。换句话说,它是可选的。
那么为什么他们允许你省略“web.xml”?我能想到几个原因:
以编程方式或通过注释进行配置通常更方便!
以不同的方式/位置进行配置是违反 DRY 原则的。如果您可以通过注解和/或显式调用在 Java 源代码中进行配置,为什么还要在 XML 中进行配置?
但归根结底,这是你的选择。
【讨论】:
在 Servlet 3 之前定义任何部署属性的唯一方法是使用部署描述符 (web.xml)。
从 Java EE 6 开始,引入了 @WebServlet、@WebFilter、@WebListener 等注解,它们允许您在 java 类本身中定义部署属性。 您不必在 web.xml 中提及它们。您可以在 web.xml 中提及的所有属性现在都可以使用 @WebSerlvet 注解来提供。
如您所见,不需要任何部署描述符。
所以现在生成的默认 web.xml 将只包含这个
<web-app xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd"
version="3.0">
这不会造成伤害
【讨论】:
一种看待它的方式是,现在注释提供的配置与之前由 Web 部署描述符 (web.xml) 提供的配置相同。实现相关规范的引擎(tomcat、junit 等)会读取和理解注解或 xml。因此总体而言,它们提供相同的功能。
Xml 配置将代码与配置分离。但它们可能会被污染,难以维护。您可能会听到诸如约定优于配置等内容。我并不是说所有这些缺点都适用于 web.xml。但一般来说,它们是关于 xml 配置的。 xmls 可能会变得混乱。大多数时候,它们是手写的,容易出现拼写错误。由于在撰写本文时未编译 (?)/检查它们的语法正确性,因此它们可能在运行时失败。
注释具有将代码及其配置保持在一起的优势。所以配置更接近它所属的位置。只需查看一个类或方法,您就可以立即了解很多关于代码及其配置的信息。
现在 - 即 Java 5 之后 - 许多框架和规范都采用注释方式。例如,hibernate、spring、REST(jax rs) 等。据我所知,它们仍然提供了一种通过使用 xmls 来管理配置的方法。我的一些同事仍然更喜欢 xml,例如在 spring 框架的情况下。我更倾向于注释。这是一个偏好和团队风格的问题。
至于为什么java ee团队决定继续做注解,我想一定是考虑到这些因素才做出的决定。
【讨论】:
在 Servlet 3.0 中仍然存在 web.xml,但是您可以通过从 Servlet 3.0 添加的注释方法来管理您的应用程序。这样做的原因只是从那里删除 xml 文件......
【讨论】: