2009-05-11 7 views
14

Мы пытались перенаправить одно действие на другое, надеясь, что данные будут переданы между соответствующими фанами ActionForm. Первое действие получает запрос от браузера, печатает поле данных и перенаправляет его на другое действие, которое печатает одно и то же поле и перенаправляет на JSP.Java Struts 1: переход от действия к действию. Передача данных через ActionForms

Проблема заключается в том, что 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> 

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

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

+0

Прошу прощения за это. – Tom

ответ

6

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

+0

«Дело» в том, что мы пытаемся добавить некоторые модули к существующей функциональности. Обе формы довольно велики и не имеют много общих полей. Мы хотели держать вещи в порядке и не создавать очень большую форму. – Tom

+3

В таком случае вы, вероятно, захотите посмотреть на класс Actionredirect. Вы можете добавить параметры для отправки в следующее действие. Так как стойки 1.2.7. –

0

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

10

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

Код прост как это, и он позволяет вам иметь отдельные формы для каждого действия.

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

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