Java Struts 1:вперед от действия к действию.Передача данных через ActionForms
Вопрос
Мы пытались перенаправить от одного действия к другому, надеясь, что данные будут передаваться между соответствующими ActionForm
бобы.Первое действие получает запрос от браузера, печатает поле данных и пересылает его другому действию, которое печатает то же поле и перенаправляет на 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>
Есть ли способ добиться этого?Или обе формы должны быть одинаковыми?
Обходной путь, который мы попробовали, заключался в передаче данных через запрос, но он может оказаться большим и запутанным.
Решение
Способ добиться этого — использовать одну и ту же форму действия для обоих действий.Есть ли конкретная причина, по которой вам нужны две разные формы действий?Если нет, попробуйте изменить второе сопоставление действий на name="formA" и само действие, чтобы использовать FormA, а не FormB.
Другие советы
Том, используя твое решение и комбинируя его с ДействиеПеренаправление, предложенное Винсентом Рамдхани, я тоже получил то, что вы хотели.
Код настолько прост, что позволяет вам иметь отдельные формы для каждого действия.
ActionRedirect redirect = new ActionRedirect(mapping.findForward("send"));
redirect.addParameter("commonInt", formA.getCommonInt());
return redirect;
formB.setCommonInt(request.getParameter("commonInt"));
В конечном итоге это сэкономило мне день и помогло мне не пытаться изменить это непосредственно в JSP, что было бы ужасно.
Звучит так, будто это может запутаться, я бы не усложнил задачу и использовал 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.