Java 为什么要绘制动作图*_*&引用;工作原理就像*&引用;?

Java 为什么要绘制动作图*_*&引用;工作原理就像*&引用;?,java,struts2,struts,url-mapping,wildcard-mapping,Java,Struts2,Struts,Url Mapping,Wildcard Mapping,有两个操作,*.*位于***前面(默认名称空间在特定名称空间之后工作并不重要(除非特定名称空间扩展了它)) /admin/result.jsp /admin/admin.jsp 在上面的配置中,映射是使用操作名AdminAction和名称空间/admin创建的。这就是为什么会出现异常的原因,因为操作配置匹配器为模式“*.*.*.找到了一个操作配置。但是,它无法为模式“*.*.*”找到它用于相同的操作名称。因此,回退到默认名称空间”,并且在此名称空间中,它匹配“**”模式,作为错误页面的结果 实

有两个操作,
*.*
位于
***
前面(默认名称空间在特定名称空间之后工作并不重要(除非特定名称空间扩展了它))


/admin/result.jsp
/admin/admin.jsp

在上面的配置中,映射是使用操作名
AdminAction
和名称空间
/admin
创建的。这就是为什么会出现异常的原因,因为操作配置匹配器为模式
“*.*.*.
找到了一个操作配置。但是,它无法为模式
“*.*.*”找到它
用于相同的操作名称。因此,回退到默认名称空间
,并且在此名称空间中,它匹配
“**”
模式,作为错误页面的结果

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

默认运行时配置实现使用参数
looseMatch
,该参数被硬编码为
true

可以选择“松散地”匹配模式 如果 模式失败,它也会匹配,就像最后两个字符没有匹配一样 存在。目标是支持遗留的“*!*”语法,其中“!*” 是可选的


正如@Quaternion在评论中提到的,带有patern的matcher
*
被添加到列表中。如前所述的任何其他内容。

注册了一个bug,但是快速解决方法是使用
***
,这将提供所需的功能

,但是在列表中没有
确实令人困惑
AdminAction.action
但它仍然与
*.*.
@RomanC匹配。重点是模式
*.*.*.
,被解析为
*.
没有预期的行为。搜索“”是有文档记录的。Thx很多。你能给我看一下你得到的URL以了解更多详细信息吗。我在网站上读了,但没有发现任何有用的东西,今天我在源代码中找到了它。还有来自XWork API文档的,请显示完整的stacktrace/错误消息以及完整的struts.xml(如果您定义了大量操作,最好使用最小的struts.xml来生成此错误)。还要提及struts2 conventions插件是否已就位或任何其他插件。这听起来很像
com.opensymphony.xwork2.util.WildcardHelper
(默认模式匹配器)的问题,这个包已经过很好的测试,但是我创建了一个新的测试来保证没有问题,具有您特定需求的测试通过了。问题不在那里,它可以像预期的那样处理这些模式。在您的情况下,哪个模式在另一个模式之前并不重要,因为它们在单独的包中。我认为包“”应该是第一个,因为将始终首先搜索更具体的包,然后它将返回到“”。包因此,它是一种包罗万象的行为,所以首先让它提醒你它的非典型行为。当然,这不会解决你的问题,只是澄清一个无关的误解。现在我使用
Admin*
而不是
*.*
来匹配像
Admin添加.action
Admin del.action
之类的操作。当我点击
localh时ost:8080/myProjectName/admin/AdminAction.action(它不存在)
,它可以很好地显示error.jsp。但我的问题是为什么
*.*
可以匹配“AdminAction.action(不存在)”。这似乎是一个bug。我也得到了同样的行为……奇怪。这个问题也会影响到2.3.8。
localhost:8080/myProjectName/admin/AdminAction.action
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}">