Java 如何以编程方式设置要执行的下一个操作的FormBean?
我希望将一个操作转发到下一个配置的操作,但在此之前创建一个新的ActionForm实例并将其与转发的操作关联: Psuedo代码如下:Java 如何以编程方式设置要执行的下一个操作的FormBean?,java,struts,struts-1,actionform,Java,Struts,Struts 1,Actionform,我希望将一个操作转发到下一个配置的操作,但在此之前创建一个新的ActionForm实例并将其与转发的操作关联: Psuedo代码如下: public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response) throws Exception { ActionForward forwardPage = map
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
我只希望在某些流中,在初始流(这里称为“success”)之前进行一些计算,然后在成功的情况下[:-)]将流转发到“success”操作
希望我的观点现在更清楚。在操作中,可以更改传入参数的ActionForm字段值,但不能创建新的ActionForm并将其与下一个JSP页面关联 如果要在调用转发页面时重置表单中的所有数据,可以执行“form.reset();”或“form.clear();”之类的操作,在表单类中创建此方法
如果在成功页面中需要表单中没有的字段,可以使用“请求”对象存储这些字段。在操作中,可以更改传入参数的ActionForm的字段值,但不能创建新的ActionForm并将其与下一个JSP页面相关联 如果要在调用转发页面时重置表单中的所有数据,可以执行“form.reset();”或“form.clear();”之类的操作,在表单类中创建此方法
如果您需要成功页面中不在表单中的字段,可以使用“请求”对象存储这些字段。假设在struts配置中进行如下简单配置:
<action path="/action1"
type="...."
name="form1"
scope="...">
<forward name="success" path="/action2.do"/>
</action>
<action path="/action2"
type="...."
name="form2"
scope="...">
...
</action>
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;
}
然后,您需要的是在进行转发之前,将手放在form2
上并用数据填充它
您当然可以这样做,因为每个表单(无论是form1
还是form2
)都用指定的名称绑定到指定的范围内,但这会干扰Struts的正常流程,这是一种不好的做法(您必须在介入并窃取节目之前真正了解Struts的工作原理)。这就是为什么我不会告诉你怎么做
我建议您做的是尽可能地解耦这两个动作。每个操作都会完成它的任务,没有任何操作将依赖于另一个操作预先填充的数据
要做到这一点,请在第二个操作中移动“魔法”代码,并在到达后执行操作。如果您只需要执行操作2中的操作(如果您来自操作1),则可以向配置添加一个标志:
<forward name="success" path="/action2.do?theFlag"/>
如果是这样,为什么需要创建新的ActionForm实例并将其与转发的操作关联?假设在struts配置中进行如下简单配置:
<action path="/action1"
type="...."
name="form1"
scope="...">
<forward name="success" path="/action2.do"/>
</action>
<action path="/action2"
type="...."
name="form2"
scope="...">
...
</action>
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;
}
然后,您需要的是在进行转发之前,将手放在form2
上并用数据填充它
您当然可以这样做,因为每个表单(无论是form1
还是form2
)都用指定的名称绑定到指定的范围内,但这会干扰Struts的正常流程,这是一种不好的做法(您必须在介入并窃取节目之前真正了解Struts的工作原理)。这就是为什么我不会告诉你怎么做
我建议您做的是尽可能地解耦这两个动作。每个操作都会完成它的任务,没有任何操作将依赖于另一个操作预先填充的数据
要做到这一点,请在第二个操作中移动“魔法”代码,并在到达后执行操作。如果您只需要执行操作2中的操作(如果您来自操作1),则可以向配置添加一个标志:
<forward name="success" path="/action2.do?theFlag"/>
如果是这样,为什么您需要创建一个新的ActionForm实例并将其与转发的操作关联起来?我自己管理。也许我的解决方案可以解释我不确定我在我的问题中能解释什么 假设这是我的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>
我自己管理。也许我的解决方案可以解释我不确定我在我的问题中能解释什么 假设这是我的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>
我不是说要抢节目。请看一下我添加到问题中的新编辑。也许这对我们双方都有帮助。同样感谢您冗长的回答。@Yaneeve:您所说的[ActionForwarded to“success”在我现在必须添加的新功能之前就已经存在了,这是什么意思?你是说mapping.findForward吗?这不是你的转发发生的地方,而是你的转发目的地被检索的地方。在返回forwardPage很久之后,Forward将在ActionServlet中发生。我不确定我是否理解你想要做什么。我的意思是,很久以前,它是为一个特定的目的而写的。现在,我的新特性需要在它之前执行一些逻辑,并且只有在成功的情况下才能继续执行“原创性的”行动。意识到我的问题听起来很愚蠢,最终无意中得到了我想要的答案,我把它作为答案贴了下来。请随意评论……我不是说要抢节目。请看一下我添加到问题中的新编辑。也许这对我们双方都有帮助。同样感谢您冗长的回答。@Yaneeve:您所说的[ActionForwarded to“success”在我现在必须添加的新功能之前就已经存在了,这是什么意思?你是说mapping.findForward吗?这不是你的转发发生的地方,而是你的转发目的地被检索的地方。在返回forwardPage很久之后,Forward将在ActionServlet中发生。我不确定我是否理解你想要做什么。我的意思是,很久以前,它是为一个特定的目的而写的。现在,我的新功能需要在它之前执行一些逻辑,并且只有在成功的情况下才能继续执行“原始”操作