什么是Web应用程序版本?它会对什么产生影响?

31

在Java Web应用程序中,有一个名为 web.xml 的文件,它具有版本控制。

这是什么?它有什么用途?

这里 是关于 web.xml 的 SO wiki。但它并没有真正解释清楚。

它允许您定义、声明和配置基于Servlet API的实现,如servlet、过滤器和监听器。

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个回答

37

Web.xml是定义Web应用程序配置的中心位置。例如,您可以在那里指定:

我还建议研究Servlet 3.0规范,其中许多参数可以通过注释设置。

版本控制

版本控制是指您的web.xml文件语法必须遵守的XML模式版本。更重要的是,它还表示您的应用程序实现的Servlet规范的版本。Servlet 3.0兼容的web.xml的示例应如下所示:

<web-app version="3.0" 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">

大多数IDE将自动生成web.xml的那一部分。如果出于某些原因您要手动更改它,请注意匹配web-appxsd的版本。

有关web.xml的具体示例,请参见:


1
这个文件的版本有什么重要性? - Koray Tugay
这是告诉容器我正在使用哪个实现吗?那么我已经拥有了实现版本3的Java Servlet类方法吗?所以我可以将我的Web应用声明为版本3,但如果我不使用引入Servlet 3.0 API的任何方法,我可以使用Tomcat 5并且可以正常工作吗? - Koray Tugay
@KorayTugay 是的,你没问题。但是,如果在web.xml中混合使用版本(即放置web-app version="2.5"xsi:schemaLocation="..web-app_3_0.xsd"),你将无法构建应用程序。 - Miljen Mikic

6
从Servlet 3.0开始,Web.xml是可选的,您可以使用@WebServlet注释代替。如果您正在使用Spring,则可以使用org.springframework.web.WebApplicationInitializer代替或与web.xml一起使用。
WebApplicationInitializer:在Servlet 3.0+环境中实现的接口,用于以编程方式配置ServletContext,而不是(或可能与)传统的基于web.xml的方法。
回答您下面的问题。
web.xml版本控制:
但是,如果应用程序中存在WEB-INF / web.xml,则其version属性必须设置为“3.0”或更高版本,否则servlet容器将忽略ServletContainerInitializer引导。
你可以在这里阅读WebApplicationInitializer的完整Java文档here

这里似乎有很多匿名的恶意投票者,为什么没有人在点踩时留下评论呢? - Sundararaj Govindasamy

2
从web.xml中,尤其是web-app version="3.0"部分,我理解到你的servlet版本。因此,我将限制我的答案在servlet版本以及它为何如此重要方面。正如您所知,当您使用Java EE进行编程时,您的servlet版本控制大多数其他标准。
例如,
JSF 2.0需要SERVLET 2.5,它随JAVA EE5一起提供,WEBLOGIC 10.3.X支持所有这些技术,对于其他容器,您应该检查发行说明。 其次, JSF 2.1需要SERVLET 3.0,它随JAVA EE6一起提供,WEBLOGIC 12c支持所有这些技术。 当然,向后兼容性得到了保证,但在大多数情况下,可能会出现一些问题。
当我们查看Weblogic 12c发行说明时,我突出显示了与servlet版本一起支持的最重要的技术。我希望这也对您有用,再加上Miljen Mikic的绝佳答案。
Standard    Version
Contexts and Dependency Injection for Java EE   1.0
Dependency Injection for Java EE    1.0
Expression Language (EL)    2.2, 2.1, 2.0
Only JSP 2.0 and greater supports Expression Language 2.x.
JAAS    1.0 Full
JASPIC  1.0
Java API for XML-Based Web Services (JAX-WS)    2.2, 2.1, 2.0
Java API for RESTful Web Services (JAX-RS)  1.1
Java Authorization Contract for Containers (JACC)   1.4
**Java EE   6.0**
Java EE Application Deployment  1.2
Java EE Bean Validation 1.1
Jave EE Common Annotations  1.0
Java EE Connector Architecture  1.6
Java EE EJB 3.1
Java EE Enterprise Web Services 1.3, 1.2, 1.1
Jave EE Interceptors    1.1
**Java EE JDBC  4.0, 3.0**
Java EE JMS 1.1, 1.0.2b
Java EE JNDI    1.2
**Java EE JSF   2.1, 2.0, 1.2, 1.1**
Java EE JSP 2.2, 2.1, 2.0, 1.2, and 1.1
JSP 1.2. and 1.1 include Expression Language (EL), but do not support EL 2.x or greater.
Java EE Managed Beans   1.0
**Java EE Servlet   3.0, 2.5, 2.4, 2.3, and 2.2**
Java RMI    1.0
JavaMail    1.4
JAX-B   2.2, 2.1, 2.0
JAX-P   1.3, 1.2, 1.1
JAX-R   1.0
JAX-RPC 1.1
JCE 1.4
**JDKs  6.0 (aka 1.6), 5.0 (aka 1.5, clients only)**
JMX 1.2, 1.0
JPA 2.0, 1.0
JSR 77: Java EE Management  1.1
JSTL    1.2
Managed Beans   1.0
OTS/JTA OTS 1.2 and JTA 1.1
RMI/IIOP    1.0
SOAP Attachments for Java (SAAJ)    1.3, 1.2
Streaming API for XML (StAX)    1.0
Web Services Metadata for the Java Platform 2.0, 1.1

一个servlet不是Java类吗?它如何由我们在web.xml中提供的版本确定?这不取决于我们使用的实现吗?你说:其次,JSF 2.1需要SERVLET 3.0,但我已经成功地使用了jsf-impl-2.1.19,而我的版本是2.5在我的web-xml中。 - Koray Tugay
是的,你可能是对的,但我注意到当web.xml根据你的servlet版本创建时。你的应用程序中是否使用了任何旧版本jsf不支持的jsf 2.1功能? - berkay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接