2

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

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

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

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

提前致谢。

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

4

1 回答 1

4

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

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

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

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

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

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

于 2013-02-04T16:51:41.323 回答