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