struts 1.2-将值从一个操作传递到另一个操作

struts 1.2-将值从一个操作传递到另一个操作,struts,struts-1,Struts,Struts 1,我们使用的是struts 1.2.2,这里有一种情况。 我们有两种形式FormA和FormB。 我们还有两个动作ActionA和ActionB 现在,ActionA在被调用时,会将FormA作为提交的bean。它完成所有处理、保存表单、创建OrderId,如果成功,则转发给ActionB。ActionB然后基于OrderId填充FormB,然后转发到下一个jsp 我们不希望这两个操作共享一个表单,因为内容非常不同,我们希望表单只表示它在jsp页面上表示的内容。此外,在每个页面上,我们都将内容保存

我们使用的是struts 1.2.2,这里有一种情况。 我们有两种形式FormA和FormB。 我们还有两个动作ActionA和ActionB

现在,ActionA在被调用时,会将FormA作为提交的bean。它完成所有处理、保存表单、创建OrderId,如果成功,则转发给ActionB。ActionB然后基于OrderId填充FormB,然后转发到下一个jsp

我们不希望这两个操作共享一个表单,因为内容非常不同,我们希望表单只表示它在jsp页面上表示的内容。此外,在每个页面上,我们都将内容保存在数据库中。流程有5页,其中一页可以在2页后离开-再次返回并从第1页开始。但是第1页和第2页应该从数据库中检索数据并显示。因此,如果存在orderID,我们将通过从数据库中获取数据来基于该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”


有朋友帮忙吗

实际上,我会把它放在会议上。然后,当您从ActionB检索它时,只需立即删除它

Integer orderId = session.getAttribute("myapp.OrderId");
session.removeAttribute("myapp.OrderID");
这通常称为闪存作用域变量。Struts中没有官方的Flash作用域,但它模拟了Flash作用域

基本上,这里不再担心重新加载OrderId,因为ActionA将在会话中设置此变量,forward to ActionB和ActionB将从会话中取出并删除它。有人在会话中卡住的唯一方法是在ActionA完成后但在ActionB运行之前停止请求,这是极不可能的,并且在查看ActionB后会被删除,这可能不会太糟糕

这还可以让您在ActionB中进行检查,以确保OrderID在会话中,如果没有,则转发回ActionA