Java Struts 1: avanti dall'azione all'azione. Passando dati attraverso ActionForms
Domanda
Abbiamo cercato di reindirizzare da un'azione all'altra, sperando che i dati sarebbero passati tra corrispondenti ActionForm
fagioli. La prima azione riceve una richiesta dal browser, stampa un campo di dati, e l'inoltra a un'altra azione, che stampa lo stesso campo e reindirizza ad una JSP.
Il problema è che è la stampa ActionTo
un valore non corretto -. La sua commonInt
ha un valore predefinito di 0
, mentre ci aspettiamo che 35
Ecco un esempio che rappresenta:
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");
}
}
E ActionForms sono:
public class FormA extends ActionForm {
public int intA;
public int commonInt;
}
public class FormB extends ActionForm{
public int intB;
public int commonInt;
}
Mapping:
<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>
C'è un modo per ottenere questo risultato? O entrambe le forme dovrebbero essere gli stessi?
La soluzione che abbiamo provato era di passare attraverso le cose richiesta, ma si può ottenere grande e disordinato.
Soluzione
Il modo per farlo è quello di utilizzare lo stesso ActionForm per entrambe le azioni. C'è una ragione specifica per cui avete bisogno di due ActionForms differenti? Se non provare modificare la seconda mappatura azione per name = "forma" e l'azione stessa di usare FormA piuttosto che FormB.
Altri suggerimenti
Tom, usando la soluzione e la combinazione con ActionRedirect , suggerito da Vincent Ramdhanie, ho ottenuto quello che volevi troppo.
Il codice è semplice come sembra e ti permettono di avere forme separate per ogni azione.
ActionRedirect redirect = new ActionRedirect(mapping.findForward("send"));
redirect.addParameter("commonInt", formA.getCommonInt());
return redirect;
formB.setCommonInt(request.getParameter("commonInt"));
Questa endend per salvare il mio giorno e mi aiuta a non avere lo sforzo di cambiare che direttamente in JSP, quello che sarebbe stato terribile.
Sembra che questo potrebbe essere un casino, mi piacerebbe mantenere questo semplice e utilizzare il solo per memorizzare i dati ActionForm
Request
.
public class FormA extends ActionForm {
public int intA;
public int commonInt;
}
Una volta che il <=> è stata presentata prendere i dati fuori dal <=> e roba nella sessione da qualche parte, direttamente o in un supporto di dati all'interno della sessione di mantenere questo tipo di informazioni.
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");
}
}
In teoria, se non si è pesantemente investito in Struts 1 Mi piacerebbe dare un'occhiata a Struts 2.