tomcat中,web.xml配置filter出错

马行空牛耕田 2004-04-06 03:03:07
环境:win2000 pro , tomcat 4.1.24 ,mysql 4.0.18,struts 1.1

根据网上流行的解决struts中文问题的方案,在web.xml中添加过滤器,如下:
<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>
</filter-mapping>

问题:启动tomcat时,报错,错误信息如下:
Starting service Tomcat-Standalone
Apache Tomcat/4.1.24
2004-4-6 14:35:08 org.apache.commons.digester.Digester error
严重: Parse Error at line 9 column 12: Element type "filter" must be declared.
org.xml.sax.SAXParseException: Element type "filter" must be declared.
at org.apache.xerces.util.ErrorHandlerWrapper.createSAXParseException(Unknown Source)
at org.apache.xerces.util.ErrorHandlerWrapper.error(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.XMLErrorReporter.reportError(Unknown Source)
at org.apache.xerces.impl.dtd.XMLDTDValidator.handleStartElement(Unknown Source)
at org.apache.xerces.impl.dtd.XMLDTDValidator.startElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanStartElement(Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl$FragmentContentDispatcher.dispatch(
Unknown Source)
at org.apache.xerces.impl.XMLDocumentFragmentScannerImpl.scanDocument(Unknown Source)
at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
at org.apache.xerces.parsers.DTDConfiguration.parse(Unknown Source)
at org.apache.xerces.parsers.XMLParser.parse(Unknown Source)
at org.apache.xerces.parsers.AbstractSAXParser.parse(Unknown Source)

尝试解决方案如下,均告失败:
1、因为是org.apache.commons.digester.Digester error,所以在apache.org重新下载了最新的digester包,替换本地tomcat 的 server/lib下的解析xml的包,无效;
2、打开web.xml,发现doctype定义如下:
<!DOCTYPE web-app
PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.2//EN"
"http://java.sun.com/j2ee/dtds/web-app_2_2.dtd">
直接使用http://java.sun.com/j2ee/dtds/web-app_2_2.dtd访问该dtd,发现无filter的定义,疑惑中……
3、使用tomcat 5.0以上版本则正确。

怎么办,请大侠指点迷津!!!!
...全文
1456 14 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
14 条回复
切换为时间正序
请发表友善的回复…
发表回复
look4u 2004-09-10
  • 打赏
  • 举报
回复
GZ!
马行空牛耕田 2004-04-09
  • 打赏
  • 举报
回复
好的,谢谢 CoolAbu(阿卜-Never Stop)
CoolAbu 2004-04-08
  • 打赏
  • 举报
回复
web.xml中的DTD中规定了顺序的

http://java.sun.com/dtd/web-app_2_3.dtd 你用IE打开这页就可以看到什么样的顺序了。
马行空牛耕田 2004-04-08
  • 打赏
  • 举报
回复
TO l_walker(靡不有初,鲜克有终!) :
我也试试,谢谢

TO sagittarius1979(射手爱狮子):
这个也会有顺序吗? 我找找先,呵呵
awaysrain 2004-04-08
  • 打赏
  • 举报
回复
你看dtd中的声明,你得xml文件必须符合dtd才可以
awaysrain 2004-04-07
  • 打赏
  • 举报
回复
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>

sagittarius1979 2004-04-07
  • 打赏
  • 举报
回复
这个定义的顺序可能也和dtd相关,找找看。
马行空牛耕田 2004-04-07
  • 打赏
  • 举报
回复
虽说问题解决了,但是还是有疑问啊,为何有个
<display-name>Struts JLL Application</display-name>
就非得把filter部分放在它下面才行呢,唉,不明所以啊
l_walker 2004-04-07
  • 打赏
  • 举报
回复
问题出在tomcat对web。xml文件的处理上,tomcat要求必须严格按照servlet规范书写servlet和filter等,而resin等则可以自由一点,因此如果将resin上的程序移植到tomcat上常常出这类错误,

而且resin在默认状态下启动时即加载filter,而tomcat则不会,因此也会有一些问题

我的解决办法是用eclipse的easystruts等插件来写webxml和struts-config xml

good luck:)
l_walker 2004-04-07
  • 打赏
  • 举报
回复
问题出在tomcat对web。xml文件的处理上,tomcat要求必须严格按照servlet规范书写servlet和filter等,而resin等则可以自由一点,因此如果将resin上的程序移植到tomcat上常常出这类错误,

而且resin在默认状态下启动时即加载filter,而tomcat则不会,因此也会有一些问题

我的解决办法是用eclipse的easystruts等插件来写webxml和struts-config xml

good luck:)
老土豆T 2004-04-06
  • 打赏
  • 举报
回复
哈,喜欢楼主那种精神:)


Filter 确实是是到 2.3 才有的东东:)
marrio 2004-04-06
  • 打赏
  • 举报
回复
看来部署描述符的确要符合一定的顺序

//这种帖子我喜欢,起码有引人入胜的debug情节
马行空牛耕田 2004-04-06
  • 打赏
  • 举报
回复
搞定了,错误原因有二:
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>
马行空牛耕田 2004-04-06
  • 打赏
  • 举报
回复
发现问题了: 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中某些标签没有正确结束或书写,但是查遍了,却没找到漏洞,气愤中,请大家帮忙找找看:

67,550

社区成员

发帖
与我相关
我的任务
社区描述
J2EE只是Java企业应用。我们需要一个跨J2SE/WEB/EJB的微容器,保护我们的业务核心组件(中间件),以延续它的生命力,而不是依赖J2SE/J2EE版本。
社区管理员
  • Java EE
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧