【问题标题】:Why do we have to specify attributes of the <web-app> tag in the web.xml file?为什么我们必须在 web.xml 文件中指定 <web-app> 标签的属性?
【发布时间】:2015-01-02 13:59:32
【问题描述】:

考虑两个 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-pages 中。它们不会被相应的值替换,在Controller 的情况下添加到model 中的Spring MVC

我想,我们指定schemaLocation 属性的唯一目的是验证我们的xml-文件(以获取XSD-schema)。这些属性实际上是如何工作的?

【问题讨论】:

    标签: java servlets web.xml


    【解决方案1】:

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

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

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

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

    【讨论】:

      猜你喜欢
      • 2019-02-05
      • 2010-10-14
      • 1970-01-01
      • 2014-08-28
      • 1970-01-01
      • 1970-01-01
      • 2020-09-05
      • 1970-01-01
      • 2014-12-13
      相关资源
      最近更新 更多