Как программно установить FormBean следующего действия, которое будет выполнено? - PullRequest
1 голос
/ 30 июня 2010

Я хочу переслать действие следующему сконфигурированному действию, но перед этим создать новый экземпляр ActionForm и связать его с перенаправленным действием:

Код Psuedo следует:

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

    ActionForward forwardPage = mapping.findForward("success");


    // Some Code....
    ....
    ....

    // finally
    MyActionForm form = new MyActionForm();

    form.setSomeProp(...);
    form.setAnotherProp(...);

    forwardPage.doSomeMagicAndAssociateWith(form);

    return forwardPage;

}

Извините, если это глупый вопрос, я новичок во всем этом и не смог найти ответ ...

Спасибо

РЕДАКТ. 1:

Просто для пояснения: ActionForwarded для "успеха" существовал до новой функции, которую я теперь должен добавить.

Я просто хочу, чтобы в определенных потоках входить до начального потока (здесь называемого «успех») и делать некоторые вычисления, после которых в случае успеха [:-)] перенаправить поток в действие «успех» .

Надеюсь, теперь моя точка зрения прояснится.

Ответы [ 3 ]

2 голосов
/ 30 июня 2010

Предполагается простая конфигурация в struts-config, подобная следующей:

<action path="/action1"
  type="...."
  name="form1"
  scope="...">
    <forward name="success" path="/action2.do"/>
</action>

<action path="/action2"
  type="...."
  name="form2"
  scope="...">
        ...
</action>

Чтобы перейти ко второму действию, вы просто используете return mapping.findForward("success");, и поток будет перенаправлен на второе действие. Предполагая, что у вас есть несколько конфигов, таких как следующие для каждой ActionForm:

<form-beans>
  <form-bean name="form1" type="..." />
  <form-bean name="form2" type="..." />
</form-beans>

тогда вам нужно набрать руку form2 и заполнить ее данными, прежде чем идти вперед.

Конечно, это можно сделать, поскольку каждая форма (будь то form1 или form2) ограничена указанной областью с указанным именем, но это будет мешать нормальному потоку Struts, и это плохая практика ( Вы должны действительно знать, как работает Struts, прежде чем войти и украсть шоу). Вот почему я не скажу вам, как это сделать.

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

Чтобы сделать это, переместите свой «магический» код во второе действие и выполните операции, как только вы окажетесь там. Если вам нужно выполнить операции в действии 2, только если вы вышли из действия 1, вы можете добавить флаг в конфигурацию:

<forward name="success" path="/action2.do?theFlag"/>

и проверьте это в действии 2 (например, request.getParameter("theFlag") != null). Таким образом, у вас есть два действия, связанные только флагом.

Еще одна вещь, которую вы можете сделать, это использовать DispatchAction классы. Это коллекция методов выполнения, которые могут совместно использовать одну и ту же форму, поэтому вы можете переходить от одного метода к другому, не имея нескольких форм для управления.

РЕДАКТИРОВАТЬ: Исходя из вашего комментария: "... моя новая функция должна выполнить некоторую логику до нее и только в случае успеха продолжить выполнение" оригинального "действия." Вы имеете в виду вам просто нужно что-то вроде этого:

public ActionForward execute(ActionMapping mapping, ActionForm form, 
          HttpServletRequest request, HttpServletResponse response) throws Exception {
  ActionForward forwardPage = mapping.findForward("success");

  // Some Code....

  boolean isSuccess = runLogicAndReturnStatus();

  if (isSuccess) {
    return forwardPage;
  } else {
    return mapping.findForward("error"); // or return to the same page (input page)
  }
}

Если это так, зачем вам нужно создавать новый экземпляр ActionForm и связывать его с перенаправленным действием?

1 голос
/ 30 июня 2010

Я справился самостоятельно. Возможно, мое решение объяснит то, что я не уверен, что смог в моем вопросе ...

Скажите, что это мой файл struts-config.xml:

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE struts-config PUBLIC "-//Apache Software Foundation//DTD Struts Configuration 1.2//EN" "http://struts.apache.org/dtds/struts-config_1_2.dtd">
<struts-config>
    <data-sources>
    </data-sources>
    <!-- ================== Form Beans ================ -->
    <form-beans>
        <form-bean name="FirstForm"
            type="com.blahblah.forms.FirstForm" />  
        <form-bean name="SecondForm"
            type="com.blahblah.forms.SecondForm" />

            <form-bean name="NewForm"
            type="com.blahblah.forms.NewForm" />
    </form-beans>   
    <!-- ================== Action Mapping Definitions ================ -->
    <action-mappings>       
        <action path="/pages/First" name="FirstForm"
            type="org.springframework.web.struts.DelegatingActionProxy" scope="request">
            <forward name="success" path="/pages/Second.do" />
        </action>
        <action path="/pages/Second" name="SecondForm"
            type="org.springframework.web.struts.DelegatingActionProxy" scope="request">
            <forward name="doSomthing" path="/pages/DoSomthing.jsp" />
        </action>

        <action path="/pages/New" name="NewForm"
            type="org.springframework.web.struts.DelegatingActionProxy" scope="request">
            <forward name="success" path="/pages/First.do" />
        </action>
    </action-mappings>
</struts-config>

FirstForm, FirstAction, SecondForm and SecondAction существовал до моей функции, и у меня было НЕТ желание вмешаться в их код ...

NewAction execute() выполняет следующие действия:

public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception {

    ActionForward forwardPage = mapping.findForward("success");

    // do some coding

    FirstForm firstForm = new FirstForm();
    firstForm.setX(...);
    firstForm.setY(...);
    request.setAttribute("FirstForm", firstForm);

    return forwardPage;
}
1 голос
/ 30 июня 2010

В действии вы можете изменить значения полей ActionForm, переданных в параметре, но вы не можете создать новую ActionForm и связать ее со следующей страницей JSP.

Если вы хотите сбросить все данные в форме между вызовами перенаправленной страницы, вы можете сделать что-то вроде «form.reset ();» или "form.clear ();", создавая этот метод в вашем классе Form.

Если вам нужны поля на странице успеха, которых нет в форме, вы можете использовать объект запроса для хранения этих тезисов.

...