2009-05-11 4 views
14

対応するActionFormの間でデータがやり取りされることを期待して、あるアクションから別のアクションにリダイレクトしようとしました。最初のアクションはブラウザから要求を受け取り、データフィールドを出力し、別のアクションに転送します。別のアクションは、同じフィールドを出力してJSPにリダイレクトします。Java Struts 1:アクションからアクションに進む。 ActionFormsを介したデータの受け渡し

ActionToが正しくない値を出力しています。そのcommonIntのデフォルト値は0ですが、35と予想しています。ここで

は代表例です。

public class ActionFrom extends DispatchableAction{ 

    public ActionForward send(ActionMapping mapping, ActionForm form, HttpServletRequest request,HttpServletResponse response){ 
     FormA formA = (FormA)form; 

     formA.commonInt = 35; 
     System.out.println("sent: "+formA.commonInt); 
     return mapping.findForward("send"); 
    } 
} 

public class ActionTo extends DispatchableAction{ 

    public ActionForward recv(ActionMapping mapping, ActionForm form, HttpServletRequest request,HttpServletResponse response){ 
     FormB formB = (FormB)form; 

     System.out.println("recv= "+formB.commonInt); 

     return mapping.findForward("send"); 
    } 
} 

およびActionFormは、以下のとおりです。

public class FormA extends ActionForm { 
    public int intA; 
    public int commonInt; 
} 

public class FormB extends ActionForm{ 
    public int intB; 
    public int commonInt; 
} 

マッピング:

<action path="/from" type="EXPERIMENT.ActionFrom" name="formA" scope="request" 
     input="something.jsp" parameter="dispatch" unknown="false" validate="false"> 
<forward name="send" path="/to.do?dispatch=recv" redirect="false"/> 
</action> 

<action path="/to" type="EXPERIMENT.ActionTo" name="formB" scope="request" 
     input="something.jsp" parameter="dispatch" unknown="false" validate="false"> 
     <forward name="send" path="/login.do" redirect="false"/> 
</action> 

はこれを達成する方法はありますか?または両方の形式が同じである必要がありますか?

私たちが試した回避策は、要求を通過させることでしたが、大きくなり、乱雑になる可能性があります。

+0

私はこれの長さをお詫び申し上げます。 – Tom

答えて

6

これを達成する方法は、両方のアクションで同じactionformを使用することです。 2つの異なるアクションフォームが必要な具体的な理由はありますか?そうでない場合は、2番目のアクションマッピングをname = "formA"に変更し、アクション自体をFormBではなくFormAを使用するように修正してください。

+0

ここでの「こと」は、既存の機能にいくつかのモジュールを追加しようとしていることです。両方の形式はかなり大きく、多くのフィールドが共通していません。私たちは物事をきれいにし、非常に大きなフォームを作成しないようにしたかったのです。 – Tom

+3

その場合、おそらくActionredirectクラスを見たいでしょう。次のアクションに送るパラメータを追加できます。 Struts 1.2.7以降。 –

0

このようなサウンドは乱雑になる可能性がありますが、この単純なままにしてActionFormのデータのみを使用してRequestデータを保存してください。

public class FormA extends ActionForm { 
    public int intA; 
    public int commonInt; 
} 

Requestが提出された後は、ActionFormからデータを取得し、この種の情報を維持するために、直接、またはセッション内のデータホルダーに、どこかのセッションにそれを詰め込みます。ヴィンセントRamdhanieによって提案

public class ActionTo extends DispatchableAction { 
    public ActionForward recv(ActionMapping mapping, ActionForm form, HttpServletRequest request,HttpServletResponse response) { 
    FormA form = (FormA)form; 

    DataHolder dataHolder = request.getSession().getAttribute("dataHolder"); 
    dataHolder.setCommonInt(commonInt); 
    dataHolder.setIntA(intA); 

    return mapping.findForward("send"); 
    } 
} 

あなたが重くStrutsの1に投資していない場合は理想的には、私はあなたのソリューションを使用してActionRedirectと組み合わせて、Strutsの2

10

トムを見てみたいが、私が得ましたあなたが望んでいたもの。

コードは単純なので、アクションごとにフォームを区切ることができます。

ActionRedirect redirect = new ActionRedirect(mapping.findForward("send")); 
redirect.addParameter("commonInt", formA.getCommonInt()); 
return redirect; 
formB.setCommonInt(request.getParameter("commonInt")); 

このendendアップ私の一日を節約し、JSPに直接それを変更するための努力を持っていない私を助けて、ひどい何でしょう。

関連する問題