1

我希望将一个动作转发到下一个配置的动作,但在此之前创建一个新的 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。

我只是希望,在某些流程中,在初始流程(这里称为“成功”)之前进入并进行一些计算,然后在成功的情况下 [:-)] 将流程转发到“成功”操作。

希望我的观点现在更清楚了。

4

3 回答 3

2

假设在 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并抢尽风头)。这就是为什么我不会告诉你怎么做。

我建议你做的是尽可能多地分离这两个动作。每个动作都会做自己的事情,任何动作都不会依赖于另一个动作预先填充的数据。

为此,请在您的第二个操作中移动您的“魔术”代码,并在您到达那里后执行操作。如果您来自操作 1,则只需要执行操作 2 中的操作,那么您可以在配置中添加一个标志:

<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 实例并将其与转发的操作相关联?

于 2010-06-30T10:32:23.367 回答
1

在动作中,您可以更改传入参数的ActionForm 的字段值,但不能创建新的ActionForm 并将其与下一个JSP 页面关联。

如果您想在调用转发页面之间重置表单中的所有数据,您可以执行“form.reset();”之类的操作 或“form.clear();”,在您的 Form 类中创建此方法。

如果您需要成功页面中不在表单中的字段,您可以使用“请求”对象来存储这些字段。

于 2010-06-30T10:19:26.100 回答
1

我已经自己解决了。也许我的解决方案将解释我不确定在我的问题中能够做到的事情......

假设这是我的 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;
}
于 2010-06-30T12:30:42.013 回答