我们正在使用struts 1.2.2并且在这里有一个情况。 所以我们有两种形式FormA和FormB。 我们还有2个动作ActionA和ActionB。
现在调用ActionA时,它将FormA作为提交的bean。它执行所有处理,保存表单,创建OrderId,如果成功,则转发给ActionB。 ActionB然后根据OrderId填充FormB,然后转发到下一个jsp。
我们不希望2个动作共享表单,因为内容非常不同,我们希望表单只表示它在jsp页面上代表的内容。同样在每个页面上我们都在Db上保存内容。流程有5页,一页可以在2页后离开 - 再次返回并从第1页开始。但是第1页和第2页应该从数据库中检索数据并显示。因此,如果存在orderID,我们通过从DB中获取数据来基于该orderId填充表单。
但是,我找不到将此orderId从一个动作传递到另一个动作的简单方法。
我无法在ActionA结束时使用request.setAttribute()
,因为当控件到达ActionB时,它现在有一个全新的请求对象。我猜测从一个动作到另一个动作发生的转发请求得到刷新。但是,如果它转发到jsp,则保留请求。
不希望将orderId作为session.setAttribute()
存储在会话中,因为有人可能会尝试添加书签的URL,然后该页面只会在会话中获取最后存储的OrderId并尝试处理它。
我们也不能把它放在formbeans中,因为那是不共享的。
一种选择是将其作为参数传递到URL中,例如ActionB?OrderId = 89。然而,缺点是有人可以更改URL中的orderId并尝试获取该随机orderId的数据。虽然我们总是可以进行检查以防止某人未被授权查看属于另一个客户的订单,但目前这是一个复杂的过程。同样在Struts 1.2.2中我想我必须以编程方式创建一个新的ActionForward对象,然后在当前路径的末尾显式地附加“?OrderId = 89”。
任何帮助的朋友?
答案 0 :(得分:2)
实际上,我会把它放在会话中。然后,当您从ActionB中检索它时,只需立即删除它。
Integer orderId = session.getAttribute("myapp.OrderId");
session.removeAttribute("myapp.OrderID");
这通常称为Flash范围变量。 Struts中没有正式的Flash范围,但这可以模拟它。
基本上,重新加载OrderId的恐惧已经消失,因为ActionA会在会话中设置此变量,转发到ActionB,ActionB会将其从会话中删除并删除它。如果他们在ActionA完成之后但在ActionB运行之前停止请求,那么某人可能会遇到阻塞他们会话的唯一方法就是这种情况非常不可能,并且一旦他们查看ActionB就会被删除,这可能不会那么糟糕。
这也让你在ActionB中检查以确保OrderID在会话中,如果没有,则转发回ActionA。