web-dev-qa-db-ja.com

Java Struts 1:アクションからアクションへ転送。ActionFormsを介してデータを渡す

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

問題は、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");
    }
}

そしてactionFormsは:

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>

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

私たちが試みた回避策は、リクエストを介して物事を渡すことでしたが、大きくて厄介になる可能性があります。

14
Tom

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

6

トム、あなたの解決策を使用し、 ActionRedirect と組み合わせて、Vincent Ramdhanieが提案しました。

コードはそのように単純で、アクションごとにフォームを分離することができます。

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

これは結局私の日を節約し、JSPでそれを直接変更する努力をしないようにするのに役立ちます。

10
lucasarruda

このような音は乱雑になる可能性があります。私はこれをシンプルに保ち、ActionFormを使用してRequestデータを格納するだけです。

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

Requestが送信されたら、ActionFormからデータを取り出し、セッションのどこかに直接またはセッション内のデータホルダーに入れて、この種の情報を維持します。

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にあまり投資していない場合は、Struts 2を見てみましょう。

0
Jon