重定向后 - 将数据传递给表单时获取?

时间:2013-02-04 12:20:50

标签: java servlets redirect scope post-redirect-get

我有几种情况,servlet需要从数据库中检索的记录将数据传递给JSP中的表单。目前,我将这些信息存储在请求中,使用RequestDispatcher转发到页面,一切都很顺利。

但是,这不适合PRG模式(AFAIK),当然意味着刷新生成的JSP意味着重新运行servlet,这是不可取的。

我当然可以在会话中存储这些值,但这意味着事后清除它们,甚至使用会话看起来像是从数据库中显示记录的一些黑客。

我只是想知道在这种情况下最佳做法是什么?我应该继续使用请求,使用会话还是其他一些技术?

提前致谢。

修改 在阅读了几篇文章和堆栈溢出答案之后,我发现除了在将数据从servlet传递到JSP时使用请求和调度程序之外,还有任何其他选项。这对我来说似乎不对,但会议也没有。任何人都可以对此有所了解吗?

1 个答案:

答案 0 :(得分:4)

我不确定我是否完全理解这个问题,但有两种模式是最佳实践:

  1. 始终通过控制器,该控制器填充模型,将其存储在请求中,并分派到显示模型中数据的视图。这是MVC模式
  2. 在成功的非幂等请求(即POST,如果您尊重HTTP协议)之后始终重定向。那是post-redirect-get模式。
  3. 那意味着你应该:

    • 请求1转到servlet。
    • servlet获取要在表单中显示的数据并将其存储在请求中,然后转发到JSP
    • JSP显示表单
    • 将表单提交给servlet(请求2)
    • servlet将数据存储在数据库中,该数据库为创建的数据生成ID
    • servlet重定向到/product?id=<generatedId>/product/<generatedId>
    • 等网址
    • 浏览器向此URL发送请求(请求3)。该请求转到servlet
    • servlet从数据库中获取ID标识的数据。它将数据存储到请求中,并转发到JSP
    • JSP显示数据。

    当然,您可以选择重定向到其他页面,例如产品列表。

    如果困扰你的是在从servlet转发到JSP时使用请求来存储数据,那么这不应该打扰你:它是唯一干净的方法。数据将仅限于请求范围,并在处理请求时进行垃圾收集。