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

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

Код Псуэдо следует:

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 ответа

Решение

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

Скажи, что это мой файл 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 "s 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;
}

Предполагая простую конфигурацию в 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 и связывать его с перенаправленным действием?

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

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

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

Другие вопросы по тегам