tags:

views:

4835

answers:

4

Hi,

We've been trying to redirect from one action to another, hoping that data would pass itself from ActionForm to ActionForm. Basically, we have to actions. The first action receives a request from the browser, prints some data field, and forwards it to another action, that prints the same fiend and redirects to a jsp. The thing is that the second print is printing an incorrect value (its not null because its an int, but it's a dissapointing 0, and it should be 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>

We expected the System.out.println("recv= "+formB.commonInt); to print out 35, but it printed out 0. 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.

+1  A: 

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.

Vincent Ramdhanie
The 'thing' here is that we are trying to add some modules to existing functionality. Both forms are quite large, and dont have many fields in common. We wanted to keep things tidy and not create a very large form.
Tom
In that case you probably want to look at Actionredirect class then. You can add parameters to be sent to the next action. Since struts 1.2.7.
Vincent Ramdhanie
A: 

Can i see the jsp file? How you redirect the content from 1st jsp to 2nd jsp

Shashi Bhushan
A: 

Sounds like this could get messy, I'd keep this simple and use the ActionForm only to store Request data.

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

Once the Request has been submitted take the data out of the ActionForm and stuff it into the session somewhere, either directly, or into a data holder within the session to maintain this kind of information.

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

}

Ideally, if you're not heavily invested in Struts 1 I'd take a look at Struts 2.

Jon
A: 

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("fwd.send"));

redirect.addParameter("dispatch", "rev");

redirect.addParameter("commonInt", Integer.parseInt(request.getParameter("commonInt")));

return redirect;

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.

lucasarruda