2

有两个动作,*_*前面是**(默认命名空间在特定命名空间之后才起作用(除非特定命名空间扩展它),这无关紧要)

<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

(它不存在)

但它被命名的操作捕获,"*_*"因为显示AdminActionAction.class未找到异常。

然后我用了*__*(有两个'_')。它运行良好并显示了error.jsp.

格式喜欢"*a*""*#*"不起作用,即使#在动作的名称中没有 a 和,他们也会捕捉到任何动作。

我使用 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

(它不存在)被抓住了

<action name="*_*" class="net.org.cc.{1}Action" method="{2}">
4

2 回答 2

2

注册了一个错误https://issues.apache.org/jira/browse/WW-3985,但是快速解决方法是使用**_**它将提供所需的功能

于 2013-02-17T21:44:54.350 回答
1

在上面的配置中,映射是使用操作名称AdminAction和命名空间创建的/admin。这就是为什么你得到一个异常的原因,因为动作配置匹配器找到了 patten 的动作配置"*_*"。但它找不到"*__*"相同动作名称的模式。因此回退到默认命名空间"",并且在这个命名空间中它匹配"**"模式作为错误页面的结果。

实际上对于这个动作名称创建了两个相似的匹配器,其中一个匹配。创建什么匹配器以及使用什么模式?

默认运行时配置实现使用looseMatch硬编码为true. javadoc中有描述

模式可以选择“松散地”匹配。当模式的结尾匹配*[^*]*$(通配符,无通配符,通配​​符)时,如果模式失败,它也被匹配,就好像最后两个字符不存在一样。目标是支持传统的“*!*”语法,其中“!*”是可选的。

正如评论中提到的@Quaternion,带有paterrn 的匹配器已*添加到列表中。如前所述的任何其他内容。

于 2013-02-16T21:28:15.023 回答