Struts Java 1: Atacante da ação para a ação. Passando dados através ActionForms
Pergunta
Estamos tentando redirecionar a partir de uma ação para outra, na esperança de que os dados seriam passados ??entre correspondentes feijão ActionForm
. A primeira ação recebe uma solicitação do navegador, imprime um campo de dados e encaminha para outra ação, que imprime o mesmo campo e redireciona para um JSP.
O problema é que ActionTo
está imprimindo um valor incorreto -. Sua commonInt
tem um valor padrão de 0
, enquanto esperamos 35
Aqui está um exemplo 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");
}
}
E ActionForms são:
public class FormA extends ActionForm {
public int intA;
public int commonInt;
}
public class FormB extends ActionForm{
public int intB;
public int commonInt;
}
mapeamentos:
<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>
Existe uma maneira de conseguir isso? Ou ambas as formas devem ser os mesmos?
A solução que tentamos foi para passar as coisas através de solicitação, mas ele pode ficar grande e confuso.
Solução
A maneira de fazer isso é usar o mesmo ActionForm para ambas as ações. Existe uma razão específica para que você precisa de duas ActionForms diferentes? Se não tentar modificar o segundo mapeamento ação para name = "forma" e da própria ação para usar FormA em vez de FormB.
Outras dicas
Tom, usando você solução e combinando com ActionRedirect , sugerido por Vincent Ramdhanie, eu tenho o que você queria também.
O código é simples como isso e permitir que você se separaram formulários para cada acção.
ActionRedirect redirect = new ActionRedirect(mapping.findForward("send"));
redirect.addParameter("commonInt", formA.getCommonInt());
return redirect;
formB.setCommonInt(request.getParameter("commonInt"));
Esta endend salvando meu dia e me ajudando a não ter o esforço de mudança que diretamente na JSP, o que seria terrível.
Parece que isso poderia ficar confuso, eu manter este simples e usar o ActionForm
apenas para armazenar dados Request
.
public class FormA extends ActionForm {
public int intA;
public int commonInt;
}
Uma vez que o Request
foi submetido pegar os dados fora do ActionForm
e enchê-lo em algum lugar da sessão, diretamente, ou em um suporte de dados dentro da sessão de manter este tipo de informação.
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");
}
}
O ideal é que se você não está investido fortemente em Struts 1 eu dar uma olhada em Struts 2.