2009-05-11 14 views
14

Hemos intentado redirigir de una acción a otra, esperando que los datos se pasen entre los correspondientes beans ActionForm. La primera acción recibe una solicitud del navegador, imprime un campo de datos y lo reenvía a otra acción, que imprime el mismo campo y lo redirecciona a un JSP.Java Struts 1: reenvía de la acción a la acción. Pasar datos a través de ActionForms

El problema es que ActionTo está imprimiendo un valor incorrecto - su commonInt tiene un valor predeterminado de 0, mientras esperamos 35.

Aquí está un ejemplo que representa:

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

Y ActionForms son:

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

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

Asignaciones:

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

¿Hay una manera de lograr esto? O ambas formas deben ser iguales?

La solución que probamos fue pasar las cosas a través de la solicitud, pero puede ser grande y complicado.

+0

Pido disculpas por la longitud de esto. – Tom

Respuesta

6

La forma de lograr esto es utilizar la misma forma de acción para ambas acciones. ¿Hay alguna razón específica por la que necesita dos formas de acción diferentes? Si no, intente modificar el segundo mapeo de acción para name = "formA" y la acción misma para usar FormA en lugar de FormB.

+0

La 'cosa' aquí es que estamos tratando de agregar algunos módulos a la funcionalidad existente. Ambas formas son bastante grandes y no tienen muchos campos en común. Queríamos mantener las cosas ordenadas y no crear una forma muy grande. – Tom

+3

En ese caso, probablemente quiera mirar la clase Actionredirect entonces. Puede agregar parámetros para enviar a la siguiente acción. Desde struts 1.2.7. –

0

Suena como esto podría ser complicado, lo mantendría simple y usar el ActionForm solo para almacenar Request de datos.

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

Una vez que el Request se ha presentado toman los datos de la ActionForm y esas cosas en la sesión en alguna parte, ya sea directamente, o en un soporte de datos dentro de la sesión para mantener este tipo de información.

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

Idealmente, si usted no está fuertemente invertido en Struts1 me gustaría echar un vistazo a Struts 2.

10

Tom, usando la solución y la combinación con ActionRedirect, sugerido por Vincent Ramdhanie, llegué lo que querías también

El código es simple y le permite tener Formularios separados para cada Acción.

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

Este endend ahorrando mi día y me ayuda a no tener el esfuerzo para cambiar eso directamente en la JSP, lo que sería horrible.

Cuestiones relacionadas