问题描述
我希望将一个操作转发到下一个已配置的操作,但在此之前创建一个新的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”。
我只是希望,在某些流程中,在初始流程之前(这里称为“成功”)进入并进行一些计算,然后在成功[:-)]的情况下将流程转发到“成功”动作。
希望我的观点现在更加清晰。
1楼
假设在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实例并将其与转发的操作相关联?
2楼
在操作中,您可以更改传入参数的ActionForm的字段值,但不能创建新的ActionForm并将其与下一个JSP页面关联。
如果要在调用转发页面之间重置表单中的所有数据,可以执行类似“form.reset();”的操作。 或“form.clear();”,在Form类中创建此方法。
如果成功页面中的字段不在表单中,则可以使用“request”对象存储这些字段。
3楼
我自己管理。 也许我的解决方案会解释我在我的问题中无法确定的内容......
说这是我的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
的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;
}