菜鸟学习Struts2遇到的问题

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教程
阅读更多
个人分类: Struts2
上一篇BigDecimal除法精确计算及坑点
下一篇fortran使用netcdf 读写NC文件
想对作者说点什么? 我来说一句

没有更多推荐了,返回首页

关闭
关闭