gpt4 book ai didi

java - 为什么 Action 映射 "*_*"像 "*"一样工作?

转载 作者:行者123 更新时间:2023-12-04 05:11:16 26 4
gpt4 key购买 nike

有两个 Action 和*_***前面(默认命名空间在特定命名空间之后工作并不重要(除非特定命名空间扩展了它))

<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>
我定义了一个错误页面来捕获不存在的操作
然后我测试了这样的 Action
localhost:8080/myProjectName/admin/AdminAction.action
(它不存在)
但是它被名为 "*_*" 的 Action 捕获了。因为异常显示 AdminActionAction.class没有找到。
然后我用了 *__* (有两个 '_' )。它运行良好并显示 error.jsp .
格式如 "*a*""*#*"即使没有 a 和 # 他们也会捕捉到任何 Action 也不起作用以行动的名义。
我使用 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}">

最佳答案

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

实际上为此 Action 名称创建了两个相似的匹配器,其中一个匹配。创建什么匹配器以及使用什么模式?

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

Patterns can optionally be matched "loosely". When the end of the pattern matches *[^*]*$ (wildcard, no wildcard, wildcard), if the pattern fails, it is also matched as if the last two characters didn't exist. The goal is to support the legacy "*!*" syntax, where the "!*" is optional.



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

关于java - 为什么 Action 映射 "*_*"像 "*"一样工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14913560/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com