Java Struts 1: переход от действия к действию. Передача данных через ActionForms
Мы пытались перенаправить одно действие на другое, надеясь, что данные будут переданы между соответствующими ActionForm
beans. Первое действие получает запрос от браузера, печатает поле данных и перенаправляет его на другое действие, которое печатает одно и то же поле и перенаправляет на JSP.
Проблема заключается в том, что ActionTo
печатает неверное значение - его commonInt
имеет значение по умолчанию 0
, а мы ожидаем 35
.
Вот пример представления:
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");
}
}
И actionForms:
public class FormA extends ActionForm {
public int intA;
public int commonInt;
}
public class FormB extends ActionForm{
public int intB;
public int commonInt;
}
Отображения:
<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>
Есть ли способ сделать это? Или обе формы должны быть одинаковыми?
Обходной путь, который мы пробовали, состоял в том, чтобы передавать данные через запрос, но он может стать большим и беспорядочным.
Ответы
Ответ 1
Способ достижения этого - использовать ту же самую форму действий для обоих действий. Есть ли конкретная причина, по которой вам нужны две разные формы действий? Если не пытаться изменить второе действие, отображаемое в name= "formA", и самому действию использовать FormA, а не FormB.
Ответ 2
Том, используя ваше решение и объединяясь с ActionRedirect, предложенный Винсентом Рамдхани, я получил то, что вы тоже хотели.
Код прост как это, и он позволяет вам иметь отдельные формы для каждого действия.
ActionRedirect redirect = new ActionRedirect(mapping.findForward("send"));
redirect.addParameter("commonInt", formA.getCommonInt());
return redirect;
formB.setCommonInt(request.getParameter("commonInt"));
Это поможет сохранить мой день и помочь мне не пытаться изменить это непосредственно в JSP, что было бы ужасно.
Ответ 3
Похоже, что это может стать беспорядочным, я бы сохранил это просто и использовал ActionForm
только для хранения данных Request
.
public class FormA extends ActionForm {
public int intA;
public int commonInt;
}
Как только Request
был отправлен, выньте данные из ActionForm
и внесите его в сеанс где-нибудь, прямо или в держатель данных в сеансе, чтобы поддерживать такую информацию.
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");
}
}
В идеале, если вы не сильно инвестируете в Struts 1, я бы посмотрел на Struts 2.