【问题标题】:Post-Redirect-Get when passing data to the form?将数据传递给表单时重定向后获取?
【发布时间】:2013-01-19 03:36:18
【问题描述】:

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

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

我当然可以将这些值存储在会话中,但这意味着之后会清除它们,甚至使用会话来显示数据库中的记录似乎有点小技巧。

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

提前致谢。

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

【问题讨论】:

  • 看看这是否可以帮助stackoverflow.com/questions/12724526/…
  • 谢谢阿布,它确实有点。唯一的问题是,我没有遇到重复的情况;任何提交数据以存储在数据库中的 servlet,我当然会使用 GET 和第二个 servlet。但我要问的是第二个 servlet,它仍然必须使用请求调度程序才能最终将信息显示回页面上。我只是想知道这是否是最佳做法?那里提供的答案表明它是,但我想在继续使用它之前确认。谢谢
  • 如果您对与在重定向/转发到 JSP 页面时存储某些日期相关的不同场景感兴趣,那么也许您会发现这个答案有些帮助:stackoverflow.com/a/14638621/814702
  • @informatik01 太棒了,谢谢。这与 JB 的回答一起,准确地告诉了我我需要知道的内容。

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


【解决方案1】:

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

  1. 始终通过一个控制器,该控制器填充模型,将其存储在请求中,然后分派到显示模型中数据的视图。这就是 MVC 模式
  2. 在成功的非幂等请求(即 POST,如果您遵守 HTTP 协议)后始终重定向。这就是重定向后获取模式。

所以这意味着你应该拥有:

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

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

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

【讨论】:

  • “总是在成功非幂等请求后重定向”否则,很难重新显示有错误的表单。
  • 完美,准确地告诉了我我需要知道的内容。你回答的最后一段是关键,这基本上是我关心的,非常感谢。
  • @BalusC:同意。我将其添加到我的答案中。尽管您可能会争辩说不成功的非幂等请求实际上是幂等的:-)
猜你喜欢
  • 2021-06-05
  • 2013-01-26
  • 2019-12-11
  • 2013-10-15
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-03-13
  • 1970-01-01
相关资源
最近更新 更多