【问题标题】:Why web.xml is removed from servlet 3.0为什么从 servlet 3.0 中删除 web.xml
【发布时间】:2014-08-25 03:59:15
【问题描述】:

为什么 web.xml 从 servlet 3.0 中移除?现在是通过 Java 完成配置。

【问题讨论】:

标签: java servlets web


【解决方案1】:

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 中进行配置?

但归根结底,这是你的选择

【讨论】:

  • 很高兴知道它现在是可选的!
  • 如果没有 web.xml,你会如何定义
  • 我不知道。容器特定的 API?但这不是重点。
【解决方案2】:

在 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">

这不会造成伤害

【讨论】:

    【解决方案3】:

    一种看待它的方式是,现在注释提供的配置与之前由 Web 部署描述符 (web.xml) 提供的配置相同。实现相关规范的引擎(tomcat、junit 等)会读取和理解注解或 xml。因此总体而言,它们提供相同的功能。

    Xml 配置将代码与配置分离。但它们可能会被污染,难以维护。您可能会听到诸如约定优于配置等内容。我并不是说所有这些缺点都适用于 web.xml。但一般来说,它们是关于 xml 配置的。 xmls 可能会变得混乱。大多数时候,它们是手写的,容易出现拼写错误。由于在撰写本文时未编译 (?)/检查它们的语法正确性,因此它们可能在运行时失败。

    注释具有将代码及其配置保持在一起的优势。所以配置更接近它所属的位置。只需查看一个类或方法,您就可以立即了解很多关于代码及其配置的信息。

    现在 - 即 Java 5 之后 - 许多框架和规范都采用注释方式。例如,hibernate、spring、REST(jax rs) 等。据我所知,它们仍然提供了一种通过使用 xmls 来管理配置的方法。我的一些同事仍然更喜欢 xml,例如在 spring 框架的情况下。我更倾向于注释。这是一个偏好和团队风格的问题。

    至于为什么java ee团队决定继续做注解,我想一定是考虑到这些因素才做出的决定。

    【讨论】:

      【解决方案4】:

      在 Servlet 3.0 中仍然存在 web.xml,但是您可以通过从 Servlet 3.0 添加的注释方法来管理您的应用程序。这样做的原因只是从那里删除 xml 文件......

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2010-09-30
        • 2019-08-07
        • 2017-01-19
        • 2011-04-29
        • 2016-02-05
        相关资源
        最近更新 更多