Java Struts 1: вперед от действия к действию. Передача данных через ActionForms - PullRequest
14 голосов
/ 11 мая 2009

Мы пытались перенаправить с одного действия на другое, надеясь, что данные будут передаваться между соответствующими 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>

Есть ли способ сделать это? Или обе формы должны быть одинаковыми?

Обходной путь, который мы попробовали, состоял в том, чтобы передать вещи через запрос, но он может стать большим и грязным.

Ответы [ 3 ]

10 голосов
/ 19 февраля 2010

Том, используя ваше решение и комбинируя с ActionRedirect , предложенным Винсентом Рамдани, я тоже получил то, что вы хотели.

Код очень прост и позволяет вам разделять Формы для каждого Действия.

ActionRedirect redirect = new ActionRedirect(mapping.findForward("send"));
redirect.addParameter("commonInt", formA.getCommonInt());
return redirect;
formB.setCommonInt(request.getParameter("commonInt"));

Это в конечном итоге спасает мой день и помогает мне не пытаться изменить это непосредственно в JSP, что было бы ужасно.

6 голосов
/ 11 мая 2009

Способ сделать это - использовать одну и ту же форму действия для обоих действий. Есть ли конкретная причина, почему вам нужны две разные формы действий? Если нет, попробуйте изменить отображение второго действия на name = "formA" и само действие, чтобы использовать FormA, а не FormB.

0 голосов
/ 27 мая 2009

Звучит так, как будто это может запутаться, я бы оставил это простым и использовал 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.

...