2

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見つからなかったことを示したため、名前の付いたアクションによってキャッチされました。

次に、*__*(2つあります'_')を使用しました。それはうまく機能し、を示しましたerror.jsp

アクションの名前にaがなくても、アクションをキャッチするような形式"*a*"または"*#*"機能しなかった形式。#

Struts2.3.4を使用しています。

*間にある文書はありますか?*少なくとも2つの文字が必要です。そうでない場合は、次のようになり*ますか?

例外の詳細は次のとおりです

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。アクション構成マッチャーがパッテンのアクション構成を見つけたため、例外が発生したのはそのためです"*_*""*__*"ただし、同じアクション名のパターンでは見つかりません。したがって、デフォルトの名前空間にフォールバックし、この名前空間では、エラーページの結果としてパターン""と一致します。"**"

実際、このアクション名は2つの類似したマッチャーを作成し、そのうちの1つは一致しました。どのマッチャーが作成され、どのパターンが使用されますか?

デフォルトのランタイム構成の実装では、looseMatchにハードコードされたパラメーターを使用しますtrue。javadocに説明があります

パターンは、オプションで「大まかに」一致させることができます。パターンの終わりが*[^*] * $(ワイルドカード、ワイルドカードなし、ワイルドカード)と一致する場合、パターンが失敗すると、最後の2文字が存在しないかのように一致します。目標は、「!*」がオプションである従来の「*!*」構文をサポートすることです。

コメントで@Quaternionが言及しているように、paterrnを使用したマッチャーが*リストに追加されました。前述のその他のもの。

于 2013-02-16T21:28:15.023 に答える