我希望将操作转发到下一个已配置的操作,但在此之前创建一个新的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”。
我只是希望,在某些流程中,在初始流程之前进入(这里称为“成功”)并进行一些计算,然后在成功[:-)]的情况下将流程转发到“成功”动作
希望我的观点现在更加明确。
答案 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()