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, однако можно быстро обойти эту проблему **_** это обеспечит желаемую функциональность

Другие вопросы по тегам