2

我们使用的是struts 1.2.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,我们会根据该 orderId 通过从数据库中获取数据来填充表单。

但是,我没有找到一种简单的方法将此 orderId 从一个操作传递到另一个操作。

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

不想将 orderId 存储在 session 中,session.setAttribute()因为有人可能会尝试添加书签的 URL,然后该页面会简单地获取 session 中最后存储的 OrderId 并尝试处理它。

我们也无法将它放在 formbeans 中,因为它不是共享的。

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

有帮助的朋友吗?

4

1 回答 1

2

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

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

这通常称为 Flash 范围变量。Struts 中没有官方的 Flash 作用域,但这是对其进行模拟的。

基本上,这里不再担心重新加载 OrderId,因为 ActionA 会在 session 中设置这个变量,转发给 ActionB,ActionB 会将其从 session 中取出并删除。有人可能会卡在他们的会话中的唯一方法是,如果他们在 ActionA 完成后但在 ActionB 运行之前停止请求,这是极不可能的,并且一旦他们查看 ActionB 就会被删除,这可能不会那么糟糕。

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

于 2012-09-20T12:21:14.913 回答