Java Struts 1: forward from action to action. Passing data through ActionForms

76,253

Solution 1

The way to accomplish this is to use the same actionform for both actions. Is there a specific reason why you need two different actionforms? If not try modifying the second action mapping to name="formA" and the action itself to use FormA rather than FormB.

Solution 2

Tom, using you solution and combining with ActionRedirect, suggested by Vincent Ramdhanie, I got what you wanted too.

The code is simple as that and it allow you to have separated Forms for each Action.

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

This endend up saving my day and helping me not to have the effort to change that directly in the JSP, what would be awful.

Share:
76,253
Tom
Author by

Tom

Updated on March 18, 2020

Comments

  • Tom
    Tom about 4 years

    We've been trying to redirect from one action to another, hoping that data would be passed between corresponding ActionForm beans. The first action receives a request from the browser, prints a data field, and forwards it to another action, which prints the same field and redirects to a JSP.

    The problem is that ActionTo is printing an incorrect value - its commonInt has a default value of 0, while we expect 35.

    Here is a representing example:

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

    And actionForms are:

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

    Mappings:

    <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>
    

    Is there a way to accomplish this? Or both forms should be the same?

    The workaround we tried was to pass things through request, but it can get large and messy.