Java Struts 1:вперед от действия к действию.Передача данных через ActionForms

StackOverflow https://stackoverflow.com/questions/849051

  •  21-08-2019
  •  | 
  •  

Вопрос

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top