1、ClassNotFoundException StrutsPrepareAndExecuteFilter
工程中需要引入struts2的jar包,因为要建许多工程,为了避免重复复制jar包,所以用了建struts2 的user lib的方式,将user lib 引入每个工程就行了。
编译没啥问题,可是一到Tomcat上运行就出问题了,报错ClassNotFoundException StrutsPrepareAndExecuteFilter,将struts2的jar包复制到工程的lib文件夹下面,在buildpath中设置好后,
tomcat又成功运行了。
解决办法:
将jar包复制到lib下,或者部署到tomcat时指定lib(推荐)
2、Javassist library is missing in classpath! Please add missed dependency!
com.opensymphony.xwork2.util.logging.commons.CommonsLogger error严重: Dispatcher initialization failed
java.lang.RuntimeException: java.lang.reflect.InvocationTargetException
at com.opensymphony.xwork2.inject.ContainerImpl$MethodInjector.inject(Container
Impl.java:301)
Caused by: java.lang.IllegalArgumentException: Javassist library is missing in classpath! Please add missed dependency!
解决办法:
添加javassist-3.11.0.GA.jar
3、Bad version org...lang3.StringUtils
Exception starting filter struts2
java.lang.UnsupportedClassVersionError: Bad version number in .class file (unabl
e to load class org.apache.commons.lang3.StringUtils)
解决办法:
commons-lang3-3.2.jar里面的
org.apache.commons.lang3.StringUtils需要JDK1.6及以上
编译用1.6,jre也用1.6,同时
tomcat运行jdk也用1.6。
4、There is no Action mapped for action name indexs. - [unknown location]
There is no Action mapped for action name user. - [unknown location]com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:185) org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:63) org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:37) com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:58) org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:554) org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:81) org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:99) org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235) org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206) org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233) org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191) org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127) org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103) org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109) org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293) org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861) org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:620) org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489) java.lang.Thread.run(Thread.java:662)
反复检查,明明有这个Action,并且路径也是对的,就是报错找不到。
解决办法:
找到一个同名的package注释掉,就可以了。
最初误以为是同名Action问题。下例中不是同名Action,并且命名空间也不同,可是还是不能访问到方法二。
访问方法二:
http://localhost:8080/Struts2_040_ActionMethodDMI/dmi/test 报错,There is no Action mapped for action name test. - [unknown location]
<!-- DMI动态方法调用 -->
<!-- 方法一,常用 -->
<package name="test" namespace="/test" extends="struts-default">
<action name="user" class="org.h4x0r.struts2.action.dmi.UserAction">
<result>/user_add_success.jsp</result>
</action>
</package>
<!-- 方法二,不常用,有多少个方法,就得配多少个action-->
<package name="test" namespace="/dmi" extends="struts-default">
<action name="test" class="org.h4x0r.struts2.action.dmi.UserAction" method="userAdd">
<result>/user_add_success.jsp</result>
</action>
</package>
真正的问题在于,同一个package定义了2次。坑爹啊!!!!
改成:
<!-- DMI动态方法调用 -->
<!-- 方法一,常用 -->
<package name="test" namespace="/dmi" extends="struts-default">
<action name="user" class="org.h4x0r.struts2.action.dmi.UserAction">
<result>/user_add_success.jsp</result>
</action>
<!-- 方法二,不常用,有多少个方法,就得配多少个action-->
<action name="test" class="org.h4x0r.struts2.action.dmi.UserAction" method="userAdd">
<result>/user_add_success.jsp</result>
</action>
</package>
结论:在struts.xml中一个package的name必须是唯一的,多次定义同名的package会导致后面的package中的action都找不到。
并且需要注意同名action问题。同一个命名空间
不能有同名的Action。(注意不是同一个包!为什么?namespace是package的属性,一个package只能有一个namespace,但是多个package可以共用一个namespace)
同名Action验证
如果有同名的Action,找到的将会是最后一个,下面的访问方式及配置,会执行
UserAction2。
<package name="test" namespace="/test" extends="struts-default">
<action name="user" class="org.h4x0r.struts2.action.dmi.UserAction">
<result>/user_add_success.jsp</result>
</action>
<action name="user" class="org.h4x0r.struts2.action.dmi.UserAction2" method="userAdd">
<result>/user_add_success.jsp</result>
</action>
</package>
多包共用一个Action验证
<package name="test" namespace="/test" extends="struts-default">
<action name="user" class="org.h4x0r.struts2.action.dmi.UserAction">
<result>/user_add_success.jsp</result>
</action>
</package>
<package name="test2" namespace="/test" extends="struts-default">
<action name="user2" class="org.h4x0r.struts2.action.dmi.UserAction">
<result>/user_add_success.jsp</result>
</action>
</package>
访问
均成功。
参考资料:
尚学堂马士兵Struts2教程