代码之家  ›  专栏  ›  技术社区  ›  Tom

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

  •  14
  • Tom  · 技术社区  · 16 年前

    我们一直在尝试将一个操作重定向到另一个操作,希望在相应的 ActionForm 豆。第一个操作接收来自浏览器的请求,打印一个数据字段,并将其转发给另一个操作,后者打印相同的字段并重定向到JSP。

    问题是 ActionTo 正在打印错误的值-its 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 回复  |  直到 8 年前
        1
  •  6
  •   Vincent Ramdhanie    16 年前

    实现这一点的方法是对两个操作使用相同的actionForm。你需要两种不同的行动形式有什么特别的原因吗?如果没有,请尝试将第二个动作映射修改为name=“forma”,并将动作本身修改为使用forma而不是formb。

        2
  •  10
  •   albfan    11 年前

    汤姆,使用你的解决方案,并结合 ActionRedirect 在文森特·拉姆达尼的建议下,我也得到了你想要的。

    代码就是这样简单,它允许您为每个操作使用不同的表单。

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

    这最终拯救了我的一天,并帮助我不必在JSP中直接改变这一点,那将是多么糟糕。

        3
  •  0
  •   Jasper wontondon    13 年前

    听起来可能会弄脏,我会保持这个简单,并使用 ActionForm 只存储 Request 数据。

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

    一旦 请求 已提交,从 动作形式 把它直接塞进会话的某个地方,或者塞进会话中的数据持有者中,以维护这种信息。

    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");
      }
    }
    

    理想情况下,如果您没有对Struts1进行大量投资,我会看一下Struts2。