Java Struts 1:从动作转向动作。通过ActionForms传递数据

时间:2009-05-11 17:05:06

标签: java struts-1

我们一直在尝试从一个操作重定向到另一个操作,希望数据将在相应的ActionForm bean之间传递。第一个操作接收来自浏览器的请求,打印数据字段,并将其转发到另一个操作,该操作打印相同的字段并重定向到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");
    }
}

动作表格是:

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>

有没有办法实现这个目标?或者两种形式都应该相同?

我们尝试的解决方法是通过请求传递内容,但它可能变得庞大而混乱。

3 个答案:

答案 0 :(得分:10)

Tom,使用你的解决方案并结合ActionRedirect,Vincent Ramdhanie建议,我也得到了你想要的东西。

代码很简单,它允许您为每个Action分别使用表单。

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

这样可以节省我的时间并帮助我不要在JSP中直接更改它,这将是非常糟糕的。

答案 1 :(得分:6)

实现此目的的方法是对两个操作使用相同的actionform。是否有特定原因需要两种不同的动作形式?如果没有尝试修改第二个动作映射到name =“formA”,并且动作本身使用FormA而不是FormB。

答案 2 :(得分:0)

听起来这可能会变得混乱,我会保持这个简单,只使用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。