出现错误:元素类型“web-app”的内容必须匹配。

39

当我在Eclipse Helios Service Release 2中构建我的项目时,我遇到了一个在web.xml中的错误。请建议我该怎么做。在我的项目中,我正在使用DTD 2.2。错误如下。

"web-app"元素类型的内容必须匹配"(icon?,display-name?,description?,distributable?,context-param*,servlet*,servlet-mapping*,session-config?,mime-mapping*,welcome-file-list?,error-page*,taglib*,resource-ref*,security-constraint*,login-config?,security-role*,env-entry*,ejb-ref*)"。

(说明:这是一个关于web.xml文件语法错误的问题,需要进一步检查web.xml文件中是否有缺少或多余的元素,并按照规范进行修改。)

2
除非您将 web.xml 文件实际展示给我们,否则我们无法告诉您出了什么问题。 - skaffman
3个回答

79
错误信息详细说明了元素的排序顺序和允许的数量。换句话说,您的web.xml中内元素的顺序或数量不正确。例如,根据错误消息,servlet需要放在servlet-mapping之前。问号后缀表示它们可能有零个或一个。星号后缀表示它们可能有零个或多个。
因此,下面的示例是无效的:
<servlet>...</servlet>
<servlet-mapping>...</servlet-mapping>

<servlet>...</servlet>
<servlet-mapping>...</servlet-mapping>

<servlet>...</servlet>
<servlet-mapping>...</servlet-mapping>

虽然以下示例是有效的

<servlet>...</servlet>
<servlet>...</servlet>
<servlet>...</servlet>

<servlet-mapping>...</servlet-mapping>
<servlet-mapping>...</servlet-mapping>
<servlet-mapping>...</servlet-mapping>

谢谢, <servlet><servlet-mapping> 的顺序是我的问题! - aorcsik
谢谢。我遇到了完全不同的错误,但知道这些错误是在说我的标签(?)没有按正确顺序排列是非常有帮助的。 - Lan
我曾经遇到过类似的错误。我的过滤器在上下文参数之前,改变了它们的顺序,这有所帮助。谢谢。 - Hiren
尝试在Eclipse中使用设计视图而不是源代码视图进行配置。这样会起作用。 - Derrick

4

当我在Eclipse中将spring集成到struts2时,遇到了相同的问题。经过一些测试,我发现这是web.xml文件中标签顺序的问题。以下文件存在错误:

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Archetype Created Web Application</display-name>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <filter>
        <filter-name>struts</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        <init-param>
            <param-name>struts.devMode</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>struts</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
</web-app>

如果我改变了顺序为

<!DOCTYPE web-app PUBLIC
 "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
 "http://java.sun.com/dtd/web-app_2_3.dtd" >

<web-app>
    <display-name>Archetype Created Web Application</display-name>
    <filter>
        <filter-name>struts</filter-name>
        <filter-class>org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter</filter-class>
        <init-param>
            <param-name>struts.devMode</param-name>
            <param-value>true</param-value>
        </init-param>
    </filter>

    <filter-mapping>
        <filter-name>struts</filter-name>
        <url-pattern>/*</url-pattern>
    </filter-mapping>
    <listener>
        <listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    </listener>
    <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
    </welcome-file-list>
</web-app>

错误将被消除。

希望这对遇到同样问题的人有所帮助。


4
如果有人感兴趣,我也遇到了同样与错误页面相关的异常。这个节点需要放在servlet之后,但在servlet-mapping之前。

2
我曾经遇到过类似的问题,其中<welcome-file-list>需要放在<servlet><servlet-mapping>之后。 - bobtheowl2

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