15

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

有没有办法做到这一点?或者两种形式应该是一样的?

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

4

3 回答 3

11

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

代码就这么简单,它允许您为每个操作设置单独的表单。

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

这最终节省了我的时间并帮助我不必努力直接在 JSP 中更改它,这将是可怕的。

于 2010-02-18T21:24:06.557 回答
6

实现这一点的方法是对两个操作使用相同的操作表单。您需要两种不同的动作形式是否有特定的原因?如果不尝试将第二个动作映射修改为 name="formA" 并且动作本身使用 FormA 而不是 FormB。

于 2009-05-11T17:12:04.580 回答
0

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

于 2009-05-27T06:20:31.753 回答