Struts2 действие "*_*" работает так же, как "*"
Есть два действия. И *_*
перед **
(Не имеет значения, что пространство имен по умолчанию выполняет свою работу после определенного пространства имен (если только конкретное пространство имен не расширяет его))
<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*"
или же "*#*"
не сработало и то, что они поймали бы какое-либо действие, даже если в названии действия не было бы символов # и #.
Версия 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}">
2 ответа
В приведенной выше конфигурации было создано сопоставление с именем действия AdminAction
и пространство имен /admin
, Вот почему вы получили исключение, потому что сопоставители конфигурации действий нашли конфигурацию действий для patten "*_*"
, Но он не может найти его по шаблону "*__*"
для того же имени действия. Таким образом, откат к пространству имен по умолчанию ""
и в этом пространстве имен это соответствует "**"
шаблон в результате на страницу ошибки.
На самом деле для этого действия имя создало два одинаковых совпадения и один из них соответствовал. Какой совпадатель создан и какой шаблон используется?
Реализация конфигурации по умолчанию во время выполнения использует параметр looseMatch
это жестко true
, Там есть описание в Javadoc
Образцы могут быть опционально сопоставлены "свободно". Если конец шаблона совпадает с *[^*]*$ (подстановочный знак, без подстановочного знака, подстановочный знак), если шаблон не работает, он также сопоставляется, как если бы последние два символа не существовали. Цель состоит в том, чтобы поддержать устаревший синтаксис "*!*", Где "!*" Является необязательным.
И как @Quaternion упомянул в комментарии, совпадение с paterrn *
добавлен в список. Все остальное, как описано ранее.
Зарегистрирован баг https://issues.apache.org/jira/browse/WW-3985, однако можно быстро обойти эту проблему **_**
это обеспечит желаемую функциональность