我们一直在尝试从一个操作重定向到另一个操作,希望数据将在相应的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>
有没有办法实现这个目标?或者两种形式都应该相同?
我们尝试的解决方法是通过请求传递内容,但它可能变得庞大而混乱。
答案 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。