如何以编程方式设置要执行的下一个Action的FormBean?

时间:2010-06-30 08:50:51

标签: java struts struts-1 actionform

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

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

希望我的观点现在更加明确。

3 个答案:

答案 0 :(得分: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)都被绑定到具有指定名称的指定范围,但这将干扰Struts正常流程,它是一个不好的做法(你必须真正了解Struts如何在踩踏并偷走节目之前)。这就是为什么我不会告诉你如何做到这一点。

我建议你做的是尽可能多地解耦两个动作。每个操作都会执行其操作,任何操作都不会依赖于由另一个操作预先填充的数据。

要做到这一点,请在第二个动作中移动“魔法”代码,并在到达后执行操作。如果您只需要执行操作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实例并将其与转发的操作相关联?

答案 1 :(得分:1)

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

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

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

答案 2 :(得分: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的{​​{1}}执行以下操作:

execute()