当前位置: 代码迷 >> java >> 如何以编程方式设置要执行的下一个Action的FormBean?
  详细解决方案

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

热度:18   发布时间:2023-07-31 11:18:54.0

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

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

希望我的观点现在更加清晰。

假设在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 )。 这样,您只有标志绑定了两个动作。

您可以做的另一件事是使用类。 这是一组执行方法,它们可以共享相同的表单,因此您可以从一种方法转发到另一种方法,而无需管理多个表单。

编辑:根据你的评论:“...我的新功能,需要在它之前执行一些逻辑,只有成功继续执行”原始“动作。”你的意思是你只需要这样的东西:

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类中创建此方法。

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

我自己管理。 也许我的解决方案会解释我在我的问题中无法确定的内容......

说这是我的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在我的功能之前就存在了,我希望在他们的代码中进行干预......

NewActionexecute()以下操作:

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;
}
  相关解决方案