2012-08-16 89 views
2

我们使用的是struts 1.2.2,这里有一个情况。 所以我们有2个窗体FormA和FormB。 我们还有2个ActionA和ActionB操作。struts 1.2 - 将一个值从一个动作传递到另一个动作

现在ActionA在调用时获取FormA作为提交的bean。它执行所有处理,保存表单,创建OrderId,如果成功则转发给ActionB。 ActionB然后根据OrderId填充FormB,然后转发到下一个jsp。

我们不希望2行为共享表单,因为内容非常不同,我们希望表单仅表示它在jsp页面上表示的内容。同样在每个页面上,我们都将内容保存在Db上。该流程有5页,一页可以在2页之后离开 - 再次返回并从第1页开始。但是页面1和页面2应从数据库中检索数据并显示。因此,如果存在orderID,我们通过从数据库中获取数据来基于该orderId填充表单。

但是我没有找到一个简单的方法将这个orderId从一个动作传递给另一个动作。

我不能在ActionA的末尾使用request.setAttribute(),因为控件到达ActionB时它现在有一个全新的请求对象。我猜测从一个动作到另一个动作发生的转发请求会被刷新。但是,如果它转发给jsp,请求将被保留。

不想将订单存储在会话session.setAttribute()有人可能试图为书签的网址,然后该网页将只需拿起上次存储的OrderId会话,并尝试来处理。

也没有办法,我们可以把它放在formbeans,因为这是不共享。

一种选择是将URL作为参数传递给参数,例如, ActionB?OrderId = 89。然而,不利的一点是有人可以更改URL中的orderId并尝试为该随机orderId提取数据。虽然我们可以随时进行检查以防止某人未被授权查看属于另一位客户的订单,但此时这是一个复杂的过程。同样在Struts 1.2.2中,我想我将不得不以编程方式创建一个新的ActionForward对象,然后在当前路径末尾显式附加“?OrderId = 89”。

任何帮助朋友?

回答

2

其实,我会把它放在会议中。然后,当您从ActionB中检索它时,请立即删除它。

Integer orderId = session.getAttribute("myapp.OrderId"); 
session.removeAttribute("myapp.OrderID"); 

这通常称为Flash范围变量。 Struts中没有官方的Flash范围,但是这可以模拟它。

基本上,由于ActionA会在会话中设置这个变量,转发给ActionB,并且ActionB会将它从会话中删除并删除它,所以担心重新加载OrderId不在这里。只有在ActionA完成之后但在ActionB运行之前他们停止了请求,这是非常不可能的,并且只要在他们查看ActionB后就会被移除,这可能不会那么糟糕。

这也让你在ActionB中检查以确保OrderID在会话中,如果没有,则转发回ActionA。

相关问题