web-dev-qa-db-fra.com

Java Struts 1: transférer d’action en action. Passing data via ActionForms

Nous essayons de rediriger une action sur une autre, en espérant que les données seraient transmises entre les beans ActionForm correspondants. La première action reçoit une demande du navigateur, imprime un champ de données et la transmet à une autre action, qui imprime le même champ et est redirigé vers un JSP. 

Le problème est que ActionTo imprime une valeur incorrecte - sa commonInt a une valeur par défaut de 0, alors que nous nous attendons à 35.

Voici un exemple représentatif:

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

Et actionForms sont:

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

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

Mappages:

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

Y a-t-il un moyen d'accomplir cela? Ou les deux formes devraient être les mêmes?

La solution de contournement que nous avons essayée était de transmettre les demandes, mais cela peut devenir volumineux et compliqué.

14
Tom

Pour ce faire, utilisez le même actionform pour les deux actions. Y a-t-il une raison spécifique pour laquelle vous avez besoin de deux actionsforms différents? Si ce n'est pas le cas, essayez de modifier le mappage de la deuxième action en nom = "formA" et l'action elle-même pour utiliser FormA plutôt que FormB.

6

Tom, en utilisant votre solution et en combinant avec ActionRedirect , suggéré par Vincent Ramdhanie, j'ai aussi ce que vous vouliez.

Le code est aussi simple que cela et vous permet d’avoir des formulaires séparés pour chaque action.

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

Cela finit par sauver ma journée et m'aider à ne pas avoir l'effort de changer cela directement dans le JSP, ce qui serait terrible.

10
lucasarruda

On dirait que cela pourrait devenir compliqué, je garderais cela simple et n’utiliserais la variable ActionForm que pour stocker les données Request

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

Une fois que la Request a été soumise, extrayez les données de la ActionForm et insérez-les dans la session quelque part, directement ou dans un support de données dans la session pour gérer ce type d'informations. 

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

Idéalement, si vous n’êtes pas fortement investi dans Struts 1, je jetterais un coup d’œil à Struts 2.

0
Jon