2009-05-11 11 views
14

Wir haben versucht, von einer Aktion zu einer anderen umzuleiten, in der Hoffnung, dass Daten zwischen entsprechenden ActionForm Beans übergeben werden. Die erste Aktion empfängt eine Anforderung vom Browser, druckt ein Datenfeld und leitet sie an eine andere Aktion weiter, die dasselbe Feld druckt und zu einer JSP weiterleitet.Java Struts 1: Von Aktion zu Aktion weiterleiten. Übergeben von Daten über ActionForms

Das Problem ist, dass ActionTo einen falschen Wert gedruckt wird - sein commonInt hat einen Standardwert von 0, während wir 35 erwarten.

Hier ist ein Beispiel darstellt:

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

Und Action sind:

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> 

Gibt es eine Möglichkeit, dies zu erreichen? Oder beide Formen sollten gleich sein?

Der Workaround, den wir ausprobiert haben, bestand darin, die Dinge durch die Anfrage zu leiten, aber es kann groß und unordentlich werden.

+0

Ich entschuldige mich für die Dauer dieser. – Tom

Antwort

6

Der Weg, dies zu erreichen, besteht darin, für beide Aktionen dasselbe Aktionsformular zu verwenden. Gibt es einen bestimmten Grund, warum Sie zwei verschiedene Aktionsformen benötigen? Wenn nicht, versuchen Sie, das Mapping der zweiten Aktion auf name = "formA" und die Aktion selbst so zu ändern, dass sie FormA statt FormB verwendet.

+0

Das "Ding" hier ist, dass wir versuchen, einige Module zur vorhandenen Funktionalität hinzuzufügen. Beide Formen sind ziemlich groß und haben nicht viele Felder gemeinsam. Wir wollten die Dinge sauber halten und keine sehr große Form schaffen. – Tom

+3

In diesem Fall möchten Sie dann wahrscheinlich ActionRirect-Klasse betrachten. Sie können Parameter hinzufügen, die an die nächste Aktion gesendet werden. Seit Struts 1.2.7. –

0

Klingt wie das könnte chaotisch werden, würde ich dies einfach halten und verwenden Sie die ActionForm nur Request Daten zu speichern.

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

Sobald die Request vorgelegt worden ist, damit die Daten aus den ActionForm und stopft es in die Sitzung irgendwo, entweder direkt oder in einen Datenbehälter in der Sitzung, diese Art von Informationen zu erhalten.

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

Idealfall, wenn Sie in Struts 1 Ich würde einen Blick auf Struts 2.

10

Tom, indem Sie Lösung und die Kombination mit ActionRedirect, vorgeschlagen von Vincent Ramdhanie investieren nicht stark sind, habe ich was du auch wolltest.

Der Code ist so einfach und erlaubt Ihnen, Formulare für jede Aktion getrennt zu haben.

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

Diese endend bis meinen Tag zu sparen und hilft mir nicht die Mühe zu haben, dass in der JSP direkt zu ändern, was wäre schrecklich sein.