2009-07-01 12 views
10

結果が、別のクラスの別のアクションへのredirectActionであるアクションを持っている場合、結果のアクションに表示される検証エラーを得ることは可能ですか?例えば。次の例では、ユーザーがactionA(これに関連付けられたビューを持たない)を実行し、エラーがある場合、actionBの結果(foo.jsp)にこれらのエラーを表示する方法はありますか?それとも、私は完全に間違った方法でこれについて行きますか?さまざまなアクションクラス間でstruts2 ActionErrorsを伝播できますか?

<package name="a" extends="struts-default" namespace="/a"> 
    <action name="actionA" class="actionAClass"> 
     <result name="input" type="redirectAction"> 
      <param name="actionName">actionB</param> 
      <param name="namespace">/b</param> 
     </result> 
     <result type="redirectAction"> 
      <param name="actionName">actionB</param> 
      <param name="namespace">/b</param> 
     </result> 
    </action> 
</package> 
<package name="b" extends="struts-default" namespace="/b"> 
    <action name="actionB" class="actionBClass"> 
     <result>/foo.jsp</result> 
    </action> 
</package> 
+0

はMessageStoreインターセプタを使用してみてください - http://struts.apache.org/release/2.3.x/docs/message-store-interceptor.html –

答えて

4

これを行う方法があるかもしれませんが、私はそれがストラットを使用する非常に良い方法だとは思いません。 actionAの検証に失敗した場合は、エラーを示す非リダイレクト入力結果を表示するか、エラーを表示できるグローバルエラーページを表示するかのどちらかを選択します。

リダイレクトの間にセッションのようなアクションエラーを格納することができますが、実際にフレームワークをどのように設計したのかはわかりません。

0

この機能は、デフォルトでStruts2ではサポートされていません。しかし解決策は存在します(セッション内にメッセージを格納する単純なstrutsインターセプタによって行われます)。

solution with source code

7

基本的にあなたがoperationModeかかりストアと呼ばれる事前に定義されたインターセプタを使用する必要があります格納および取得:デフォルトで

<package name="a" extends="struts-default" namespace="/a"> 
    <action name="actionA" class="actionAClass"> 
     <!-- Here you are storing the Error messages --> 
     <interceptor-ref name="store"> 
      <param name="operationMode">STORE</param> 
     </interceptor-ref> 

     <!-- include your default stack in case you need to load other interceptors --> 
     <interceptor-ref name="defaultStack" /> 

     <result name="input" type="redirectAction"> 
      <param name="actionName">actionB</param> 
      <param name="namespace">/b</param> 
     </result> 
     <result type="redirectAction"> 
      <param name="actionName">actionB</param> 
      <param name="namespace">/b</param> 
     </result> 
    </action> 
</package> 
<package name="b" extends="struts-default" namespace="/b"> 
    <action name="actionB" class="actionBClass"> 

     <interceptor-ref name="store"> 
      <param name="operationMode">RETRIEVE</param> 
     </interceptor-ref> 

     <!-- include your default stack in case you need to load other interceptors --> 
     <interceptor-ref name="defaultStack" /> 

     <result>/foo.jsp</result> 
    </action> 
</package> 
10

Struts2のは、店のインターセプタがあります。 STOREモードではactionMessages、actionErrors、fieldErrorsをセッションに格納し、RETRIEVEモードで同じインタセプタを使用することで、次のリダイレクトで同じアクションを取得できます。詳細は、最初のアクションで使用ActionContext.getContext().getSession().put(key, value)

2

hereを発見し、それはあなたが結果の型「チェーン」を使用することができ、メインのアクション

+0

私はMessageStoreInterceptorがはるかに良い方法だろうと思います。 –

+0

MessageStoreInterceptor - http://struts.apache.org/release/2.3.x/docs/message-store-interceptor.html –

0

redirectedActionaddActionErrorsActionContext.getContext().getSession().get(key)を使用して取得することができます。

<action name="delete" class="com.example.Delete"> 
    <result name="error" type="chain"> 
     <param name="actionName">show</param> 
    </result>   
</action> 
<action name="show" class="com.example.Show"> 
    <result name="success" type="dispatcher">/jsp/show.jsp</result>      
</action> 

はshow.jspにあなたは私がactionRedirect結果のタイプにアクションエラーとメッセージを渡すために、より良い解決策を見つける削除アクション

+0

「チェーン」の使用はお勧めしません。 –

6

に設定されたアクションのエラーやアクションメッセージを表示することができます。それは私のために働いています。あなたはstruts.xmlやstruts.propertiesファイルに次なければ

<action name="action1" class="action.Action1" > 
    <result>/abc.jsp</result> 
    <result name="input" type="redirectAction"> 
    <param name="actionName">action2</param> 
    <param name="param1">${param1}</param> 
    <param name="param2">${param2}</param> 
    <param name="actionErrors">${actionErrors}</param> 
    </result> 
    </action> 
    <action name="action2" class="action.Action2" > 
    <result>/def.jsp</result> 
    <result name="input">/def.jsp</result> 
    </action/> 

これだ.....ハッピーコーディング

+0

' $ {actionErrors}'これはすべての魔法を行います。 – Jibran

+0

これはアクションエラーとメッセージの両方を渡しますか、 ' $ {actionMessages}'メッセージを渡す必要がありますか? – ponder275

+1

' $ {actionMessages}'はメッセージを渡しません。ありがとう! – ponder275

3

結果タイプチェーンは行動を結果にメッセージ/エラーをコピーします -

struts.xwork.chaining.copyErrors - set to true to copy Action Errors 
struts.xwork.chaining.copyFieldErrors - set to true to copy Field Errors 
struts.xwork.chaining.copyMessages - set to true to copy Action Messages 

例(struts.xml) -

<constant name="struts.xwork.chaining.copyErrors" value="true"/> 
0

私の中でこの作品

この行をstrutsに追加します。XML:

<constant name="struts.xwork.chaining.copyErrors" value="true"/> 
<constant name="struts.xwork.chaining.copyMessages" value="true"/> 

使用結果種別 "チェーン" と名称 "入力" との結果を追加します。

<package name="a" extends="struts-default" namespace="/a"> 
    <action name="actionA" class="actionAClass"> 
     <result name="input" type="chain"> 
      <param name="actionName">actionB</param> 
      <param name="namespace">/b</param> 
     </result> 
     <result type="chain"> 
      <param name="actionName">actionB</param> 
      <param name="namespace">/b</param> 
     </result> 
    </action> 
</package> 
<package name="b" extends="struts-default" namespace="/b"> 
    <action name="actionB" class="actionBClass"> 
     <result>/foo.jsp</result> 
     <result name="input">/foo.jsp</result> 
    </action> 
</package> 
1

ストアインターセプター(MessageStoreInterceptor)はactionMessagesfieldErrorsactionErrorsを格納および検索するために使用することができます。

あなたがアクションに operationModeパラメータを渡すことで、その場で店舗インターセプタの動作を変更することができます

http://localhost/sample.action?operationMode=STORE

あなたはに、すべてのアクションメッセージを可能にあなたのデフォルトのスタックにSTOREモードでの店舗インターセプタを設定することができますセッションに格納されます。

<interceptor-ref name="store"> 
      <param name="operationMode">STORE</param> 
    </interceptor-ref> 

あなたはこれらのメッセージを必要とする特定のアクションにRETRIEVEモードでstoreインターセプタを追加する必要がメッセージを取得します。

これは、このアクションは、私たちがそれにstoreインターセプタを追加するときactionErrorsfieldErrorsactionMessagesを読み、RETRIEVEoperationModeを設定することができ、にリダイレクトされたサンプルグローバルエラーページです:

@Action(value = "error-page" , 
       interceptorRefs = 
        {@InterceptorRef(value = "store", params = {"operationMode", "RETRIEVE"})} 
      ) 
public String execute() throws Exception {  
    LOG.error("An error accrued during action ActionErrors '{}' , FieldErrors '{}' " , getActionErrors() , getFieldErrors()); 
    //Rest of the code 
} 

MessageStoreInterceptor削除新しいエラーを追加する前に以前のエラーが発生しました。

デフォルトのスタックでAUTOMATICにストアを設定することができます。このようにして、すべてのメッセージは常に保存され、アクション結果がタイプServletRedirectResultである場合に自動的に再試行されます(たとえば、アクション 'redirectAction'、 'redirect'の場合)RETRIEVEモードで明示的なstoreインターセプタを定義する必要はありません。

しかし、これは良いアプローチではありませんが、これらのキーを使用してセッション内のストアメッセージにアクセスできます。

session.get(MessageStoreInterceptor.fieldErrorsSessionKey) 
session.get(MessageStoreInterceptor.actionErrorsSessionKey) 
session.get(MessageStoreInterceptor.actionMessagesSessionKey) 
関連する問題