【问题标题】:struts 1.2 - passing a value from one action to anotherstruts 1.2 - 将值从一个动作传递到另一个动作
【发布时间】:2012-08-16 10:48:55
【问题描述】:

我们使用的是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 从一个操作传递到另一个操作。

我不能在 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”。

有帮助的朋友吗?

【问题讨论】:

    标签: struts struts-1


    【解决方案1】:

    实际上,我会把它放在会话中。然后,当您从 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。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-09-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-06-19
      • 2012-05-16
      相关资源
      最近更新 更多