Java 为什么从servlet 3.0中删除web.xml

Java 为什么从servlet 3.0中删除web.xml,java,servlets,web,Java,Servlets,Web,为什么从servlet 3.0中删除web.xml?,现在,配置是通过Java完成的。在Servlet 3.0中仍然有web.xml,但您可以通过从Servlet 3.0添加的注释方法来管理应用程序。这样做的原因只是从中删除xml文件……在Servlet 3之前,定义任何部署属性的唯一方法是使用部署描述符(web.xml) 从JavaEE6开始,引入了@WebServlet、@WebFilter、@WebListener等注释,这些注释允许您在Java类本身中定义部署属性。 您不必在web.xm

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

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

在Servlet 3之前,定义任何部署属性的唯一方法是使用部署描述符(web.xml)

从JavaEE6开始,引入了@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)先前提供的配置相同的配置。注释或xml由实现相关规范的引擎(tomcat、junit等)读取和理解,因此总体上它们提供相同的功能

Xml配置将代码与配置分离。但它们会被污染,很难维持。您可能会听到诸如约定优于配置等问题。我并不是说所有这些缺点都适用于web.xml。但它们通常是关于xml配置的。XML可能会变得混乱。大多数时候,它们都是手写的,而且容易出现打字错误。由于在编写语法正确性时未对它们进行编译(?)/检查,因此它们可能在运行时失败

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

如今,也就是java 5之后,许多框架和规范都朝着注释的方向发展。例如,hibernate、spring、REST(jax-rs)等。据我所知,它们仍然提供了一种使用xmls管理配置的方法。例如,在spring框架中,我的一些同事仍然更喜欢xml。我更倾向于注释。这是一个偏好和团队风格的问题


至于java ee团队为什么决定继续使用注释,我认为这一定是考虑了这些因素后做出的决定。

Servlet 3.0中没有删除对web.xml的支持,而且(IMO)在可预见的将来不太可能删除它

证据?如果您下载Servlet3.0规范并搜索“web.xml”,您将看到很多对它的引用

最有说服力的引用是A6.6

“如果web应用程序不包含任何web.xml,则不要求它包含web.xml Servlet、筛选器或侦听器组件。换句话说,应用程序只包含 静态文件或JSP页面不需要存在web.xml。”

它的意思是允许一个webapp省略“web.xml”文件。。。但它也被允许包括一个。换句话说,它是可选的


那么,为什么他们允许您省略“web.xml”?我可以想到几个原因:

  • 通过编程或通过注释进行配置通常更方便

  • 以不同的方式/地点进行配置违反了DRY原则。如果可以通过注释和/或显式调用在Java源代码中进行配置,那么为什么还要在XML中进行配置呢


但底线是,它是您的选择。

请参考此选项,它不会被删除。它变成了可选的。很高兴知道它现在是可选的!如果没有web.xml,您将如何定义?我不知道。特定于容器的API?但这与问题无关。