Java支柱1:从一个动作前进到另一个动作。通过操作表单传递数据

2022-09-03 14:22:03

我们一直在尝试从一个操作重定向到另一个操作,希望数据可以在相应的bean之间传递。第一个操作接收来自浏览器的请求,打印一个数据字段,并将其转发到另一个操作,该操作打印相同的字段并重定向到 JSP。ActionForm

问题是打印的值不正确 - 它的默认值为 ,而我们期望 。ActionTocommonInt035

下面是一个表示示例:

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>

有没有办法做到这一点?还是两种形式应该相同?

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


答案 1

汤姆,使用你的解决方案,并与Vincent Ramdhanie建议的ActionRedirect相结合,我也得到了你想要的。

代码就这么简单,它允许您为每个操作使用单独的窗体。

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

这最终节省了我的一天,并帮助我没有努力直接在JSP中改变这一点,这将是可怕的。


答案 2

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


推荐