为什么我们必须在web.xml文件中指定<web-app>标记的属性?</web-app>

时间:2015-01-02 13:59:33

标签: java servlets web.xml

考虑两个web.xml文件: 1。

<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
 xmlns="http://java.sun.com/xml/ns/javaee" 
 xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" 
 version="3.0">

  <display-name>app</display-name>
  <servlet>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <servlet-name>dispatcher</servlet-name>
  </servlet>

  <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

2

<web-app>

  <display-name>app</display-name>
  <servlet>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <servlet-name>dispatcher</servlet-name>
  </servlet>

  <servlet-mapping>
    <servlet-name>dispatcher</servlet-name>
    <url-pattern>/</url-pattern>
  </servlet-mapping>
</web-app>

它们之间的区别在于web-app标记包含第一个中的属性而第二个不包含。问题是如果我们应用第二个web.xml,我们将无法使用像

这样的表达式
${attrName}

在我们的jsp页面中。它们不会被相应的值替换,在model的情况下会添加到Controller的{​​{1}}。

我想,我们指定Spring MVC属性的唯一目的是验证我们的schemaLocation - 文件(获取xml - 架构)。属性如何实际起作用?

1 个答案:

答案 0 :(得分:1)

第一个web.xml指定了webapp所需的Servlet API版本(3.0),而第二个不指定。

在第二种情况下,servlet容器将这意味着它是为较旧版本的Servlet API编写的,特别是来自未使用version属性或严格定义的命名空间的Servlet API版本。那些旧版本是JSP-2.0之前的版本,因此不支持JSP表达式语言。这意味着您的表达式不会被替换(您不希望使用该表达式语法的旧应用程序出于某种其他原因突然让容器按照作者不打算的方式对它们进行评估)。

对于现代Web应用程序 - 您应该始终指定所需的Servlet API版本。

schemaVersion版本本身并不相关,只是说现代版本的Servlet API需要定义它们。