发现问题了: web.xml的doctype定义应该是不对的,因为Web Application 2.2代表着只支持servlet2.2(我猜想),而filter是servlet2.3的特性,所以我果断更改了dtd,Web Application 版本改为2.3,现在是:
<!DOCTYPE web-app
  PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN"
  "http://java.sun.com/dtd/web-app_2_3.dtd">再查看http://java.sun.com/dtd/web-app_2_3.dtd,果然发现filter定义其中,但是新的问题出来了:2004-4-6 16:01:40 org.apache.commons.digester.Digester error
严重: Parse Error at line 126 column 11: The content of element type "web-app" must match "(icon?,di
splay-name?,description?,distributable?,context-param*,filter*,filter-mapping*,listener*,servlet*,se
rvlet-mapping*,session-config?,mime-mapping*,welcome-file-list?,error-page*,taglib*,resource-env-ref
*,resource-ref*,security-constraint*,login-config?,security-role*,env-entry*,ejb-ref*,ejb-local-ref*
)".
org.xml.sax.SAXParseException: The content of element type "web-app" must match "(icon?,display-name
?,description?,distributable?,context-param*,filter*,filter-mapping*,listener*,servlet*,servlet-mapp
ing*,session-config?,mime-mapping*,welcome-file-list?,error-page*,taglib*,resource-env-ref*,resource
-ref*,security-constraint*,login-config?,security-role*,env-entry*,ejb-ref*,ejb-local-ref*)".
        at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
        at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
这种情况我也遇到过,肯定是web.xml中某些标签没有正确结束或书写,但是查遍了,却没找到漏洞,气愤中,请大家帮忙找找看:

解决方案 »

  1.   

    搞定了,错误原因有二:
    1、dtd引用错,应该使用http://java.sun.com/dtd/web-app_2_3.dtd
    2、因为使用了一个标签:  <display-name>Struts JLL Application</display-name>
    结果导致标签匹配出错,把filter段移动到该标签相邻的下方,即不报错,否则无论移到哪里,都报错,原因未知。出错web.xml如下(省去了部分):
    <?xml version="1.0" encoding="ISO-8859-1"?><!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>Struts JLL Application</display-name>  <!-- Standard Action Servlet Configuration (with debugging) -->
      <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
        <init-param>
          <param-name>config</param-name>
          <param-value>/WEB-INF/struts-config.xml</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
      </servlet>
      <!-- Standard Action Servlet Mapping -->
      <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
      </servlet-mapping>
      <!-- The Usual Welcome File List -->
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
      <!-- Struts Tag Library Descriptors -->
      <taglib>
        <taglib-uri>/tags/struts-bean</taglib-uri>
        <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
      </taglib>  <filter>
    <filter-name>Set Character Encoding</filter-name>
    <filter-class>com.zhiss.JLLPro.common.SetCharacterEncodingFilter</filter-class>

    <init-param>
      <param-name>encoding</param-name>
      <param-value>GB2312</param-value>
    </init-param> <init-param>
      <param-name>ignore</param-name>
      <param-value>true</param-value>
    </init-param>  </filter>  <filter-mapping>
    <filter-name>Set Character Encoding</filter-name>
    <servlet-name>action</servlet-name>
    <!-- <url-pattern>*.do</url-pattern> -->
      </filter-mapping></web-app>
      

  2.   

    看来部署描述符的确要符合一定的顺序//这种帖子我喜欢,起码有引人入胜的debug情节
      

  3.   

    哈,喜欢楼主那种精神:)
    Filter 确实是是到 2.3 才有的东东:)
      

  4.   

    Filter的配置需要放到web.xml中对应的位置
    你可以参照dtd中的声明
    <!ELEMENT web-app (icon?, display-name?, description?, distributable?,
    context-param*, filter*, filter-mapping*, listener*, servlet*,
    servlet-mapping*, session-config?, mime-mapping*, welcome-file-list?,
    error-page*, taglib*, resource-env-ref*, resource-ref*, security-constraint*,
    login-config?, security-role*, env-entry*, ejb-ref*,  ejb-local-ref*)>也就是说如果你的web.xml如果出现filter的话应改是在context-param(如果有的话)和listener(如果有的话)之间的你把filter的配置的位置调整一下就应改可以了
    ====================================
    <?xml version="1.0" encoding="ISO-8859-1"?><!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>Struts JLL Application</display-name>  <filter>
    <filter-name>Set Character Encoding</filter-name>
    <filter-class>com.zhiss.JLLPro.common.SetCharacterEncodingFilter</filter-class>

    <init-param>
      <param-name>encoding</param-name>
      <param-value>GB2312</param-value>
    </init-param> <init-param>
      <param-name>ignore</param-name>
      <param-value>true</param-value>
    </init-param>  </filter>  <filter-mapping>
    <filter-name>Set Character Encoding</filter-name>
    <servlet-name>action</servlet-name>
    <!-- <url-pattern>*.do</url-pattern> -->
      </filter-mapping>
      <!-- Standard Action Servlet Configuration (with debugging) -->
      <servlet>
        <servlet-name>action</servlet-name>
        <servlet-class>org.apache.struts.action.ActionServlet</servlet-class>
        <init-param>
          <param-name>config</param-name>
          <param-value>/WEB-INF/struts-config.xml</param-value>
        </init-param>
        <load-on-startup>2</load-on-startup>
      </servlet>
      <!-- Standard Action Servlet Mapping -->
      <servlet-mapping>
        <servlet-name>action</servlet-name>
        <url-pattern>*.do</url-pattern>
      </servlet-mapping>
      <!-- The Usual Welcome File List -->
      <welcome-file-list>
        <welcome-file>index.jsp</welcome-file>
      </welcome-file-list>
      <!-- Struts Tag Library Descriptors -->
      <taglib>
        <taglib-uri>/tags/struts-bean</taglib-uri>
        <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
      </taglib>
    </web-app>
      

  5.   

    问题出在tomcat对web。xml文件的处理上,tomcat要求必须严格按照servlet规范书写servlet和filter等,而resin等则可以自由一点,因此如果将resin上的程序移植到tomcat上常常出这类错误,而且resin在默认状态下启动时即加载filter,而tomcat则不会,因此也会有一些问题我的解决办法是用eclipse的easystruts等插件来写webxml和struts-config xmlgood luck:)
      

  6.   

    问题出在tomcat对web。xml文件的处理上,tomcat要求必须严格按照servlet规范书写servlet和filter等,而resin等则可以自由一点,因此如果将resin上的程序移植到tomcat上常常出这类错误,而且resin在默认状态下启动时即加载filter,而tomcat则不会,因此也会有一些问题我的解决办法是用eclipse的easystruts等插件来写webxml和struts-config xmlgood luck:)
      

  7.   

    虽说问题解决了,但是还是有疑问啊,为何有个
    <display-name>Struts JLL Application</display-name>
    就非得把filter部分放在它下面才行呢,唉,不明所以啊
      

  8.   

    这个定义的顺序可能也和dtd相关,找找看。
      

  9.   

    你看dtd中的声明,你得xml文件必须符合dtd才可以
      

  10.   

    TO  l_walker(靡不有初,鲜克有终!)  :
       我也试试,谢谢TO sagittarius1979(射手爱狮子):
       这个也会有顺序吗? 我找找先,呵呵
      

  11.   

    web.xml中的DTD中规定了顺序的http://java.sun.com/dtd/web-app_2_3.dtd 你用IE打开这页就可以看到什么样的顺序了。
      

  12.   

    好的,谢谢 CoolAbu(阿卜-Never Stop)