Puntales de Java 1:avanzar de una acción a otra.Pasar datos a través de ActionForms

StackOverflow https://stackoverflow.com/questions/849051

  •  21-08-2019
  •  | 
  •  

Pregunta

Hemos estado intentando redirigir de una acción a otra, esperando que los datos se pasen entre las acciones correspondientes. ActionForm frijoles.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 redirige a un JSP.

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

A continuación se muestra un ejemplo representativo:

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 los formularios de acción son:

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

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

Mapeos:

<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 alguna manera de lograr esto?¿O ambas formas deberían ser iguales?

La solución que probamos fue pasar las cosas a través de una solicitud, pero puede volverse grande y confuso.

¿Fue útil?

Solución

La manera de lograr esto es utilizar el mismo ActionForm para ambas acciones. ¿Hay alguna razón específica por la cual se necesitan dos ActionForms diferentes? Si no intenta modificar la segunda asignación de acciones a name = "forma" y la acción misma de usar FormA en lugar de FormB.

Otros consejos

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

El código es simple como eso y que le permiten tener formas separadas para cada acción.

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

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

Parece que esto podría resultar complicado, lo mantendría simple y usaría el ActionForm solo para almacenar Request datos.

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

Una vez el Request ha sido enviado, saque los datos del ActionForm e introducirlo en la sesión en algún lugar, ya sea directamente o en un contenedor 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 no has invertido mucho en Struts 1, echaría un vistazo a Struts 2.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top