有两个动作。*_*
位于**
前面(默认命名空间在特定命名空间之后完成其工作并不重要(除非特定命名空间扩展它) )
<package name="default" namespace="" extends="struts-default"></package>
<package name="admin" namespace="/admin" extends="default">
<global-results>
<result>/admin/result.jsp</result>
</global-results>
<action name="login" class="org.cc.action.AdminAction">
<result>/admin/admin.jsp</result>
</action>
<action name="*_*" class=org.cc.action.{1}Action" method="{2}">
</action>
</package>
<package name="error" namespace="" extends="default">
<action name="**" >
<result>/error.jsp</result>
</action>
</package>
我为跟踪不存在的操作定义了错误页面
然后我测试了
这样的动作localhost:8080/myProjectName/admin/AdminAction.action(it doesn't exist)
但它被名为"*_*"
的操作捕获,因为异常显示未找到AdminActionAction.class
。
然后我使用了*__*
(有两个'_'
)。它运作良好并显示error.jsp
。
像"*a*"
或"*#*"
这样的格式,即使行动名称中没有a和#,也无法捕捉任何操作。
我使用的struts版本是Struts 2.3.4。
*
和*
之间是否有任何文件说必须至少有两个字符,或者就像*
一样?
以下是异常的详细信息
Unable to instantiate Action, org.cc.action.AdminActionAction, defined for 'AdminAction' in namespace '/admin'org.cc.action.AdminActionAction
com.opensymphony.xwork2.DefaultActionInvocation.createAction(DefaultActionInvocation.java:319)
com.opensymphony.xwork2.DefaultActionInvocation.init(DefaultActionInvocation.java:400)
com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:194)
org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:63)
org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39)
com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:58)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:501)
org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
java.lang.ClassNotFoundException: org.cc.action.AdminActionAction
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1711)
org.apache.catalina.loader.WebappClassLoader.loadClass(WebappClassLoader.java:1556)
com.opensymphony.xwork2.util.ClassLoaderUtil.loadClass(ClassLoaderUtil.java:152)
com.opensymphony.xwork2.ObjectFactory.getClassInstance(ObjectFactory.java:108)
com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:161)
com.opensymphony.xwork2.ObjectFactory.buildBean(ObjectFactory.java:151)
com.opensymphony.xwork2.ObjectFactory.buildAction(ObjectFactory.java:121)
com.opensymphony.xwork2.DefaultActionInvocation.createAction(DefaultActionInvocation.java:300)
com.opensymphony.xwork2.DefaultActionInvocation.init(DefaultActionInvocation.java:400)
com.opensymphony.xwork2.DefaultActionProxy.prepare(DefaultActionProxy.java:194)
org.apache.struts2.impl.StrutsActionProxy.prepare(StrutsActionProxy.java:63)
org.apache.struts2.impl.StrutsActionProxyFactory.createActionProxy(StrutsActionProxyFactory.java:39)
com.opensymphony.xwork2.DefaultActionProxyFactory.createActionProxy(DefaultActionProxyFactory.java:58)
org.apache.struts2.dispatcher.Dispatcher.serviceAction(Dispatcher.java:501)
org.apache.struts2.dispatcher.ng.ExecuteOperations.executeAction(ExecuteOperations.java:77)
org.apache.struts2.dispatcher.ng.filter.StrutsPrepareAndExecuteFilter.doFilter(StrutsPrepareAndExecuteFilter.java:91)
很容易看到localhost:8080/myProjectName/admin/AdminAction.action(it doesn't exist)
<action name="*_*" class="net.org.cc.{1}Action" method="{2}">
答案 0 :(得分:2)
注册了一个错误https://issues.apache.org/jira/browse/WW-3985,但快速解决方法是使用**_**
这将提供所需的功能
答案 1 :(得分:1)
在上面的配置中,使用操作名称AdminAction
和命名空间/admin
创建了映射。这就是为什么你得到一个例外,因为动作配置匹配器找到了patten "*_*"
的动作配置。但是对于相同的动作名称,它无法找到模式"*__*"
。因此回退到默认命名空间""
,并在此命名空间中将"**"
模式与错误页面匹配。
实际上,对于此操作,名称创建了两个类似的匹配器,其中一个匹配。创建匹配器的内容和使用的模式是什么?
默认运行时配置实现使用硬编码为looseMatch
的参数true
。在javadoc中有desctiption
模式可以选择“松散地”匹配。当结束了 模式匹配* [^ *] * $(通配符,没有通配符,通配符),如果 模式失败,它也匹配,好像最后两个字符没有 存在。目标是支持遗留的“*!*”语法,其中“!*” 是可选的。
正如@Quaternion在评论中提到的那样,带有paterrn *
的匹配器已添加到列表中。如前所述的任何其他内容。