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.