【问题标题】:Best practice for use of session and request attributes in servlet and JSP for MVC compliance在 servlet 和 JSP 中使用会话和请求属性以实现 MVC 合规性的最佳实践
【发布时间】:2014-07-14 09:41:45
【问题描述】:

我有一个场景,需要一个 servlet 在页面上显示一个人的详细信息,但我还想在会话中存储该人的详细信息,所以这段代码是否可行:

Person person = // Populated elsewhere.   
session.setAttribute("person", person); // Store Person in session.
request.setAttribute("person", person); // Store Person in request.
// Set URL for JSP.

我问是因为 JSP 可以访问会话对象。还是只使用请求来填充 JSP 更好,因为这更符合 MVC?

【问题讨论】:

  • 尽量使用最低范围以避免内存消耗。范围从低到高。 page -> request -> session -> application
  • 鉴于这只是一个数据量很小的演示应用程序,我通常会遵循这个,但我认为在这种情况下将我的人存储在会话中并允许 JSP 访问它应该没问题.但我会说,在其他情况下,应该避免使用基于会话的存储。

标签: jsp session servlets request


【解决方案1】:

这取决于您的代码。 如果您需要将该信息永久存储在会话中,请将其存储在会话中。所以所有 JSP 都可以访问这些数据。

如果您需要存储该信息但仅用于请求目的(例如表单),请将其存储在 request.xml 中。因此,只有您将请求转发到的 JSP 才能读取数据。

【讨论】:

  • 这就是我采取的方法。但我想知道 JSP 是否最好访问会话。
  • 如果 Person 包含登录用户的一些数据,并且您想存储这些数据以管理其他一些 JSP 而不仅仅是转发的 JSP,则可能是确认登录正确性的页面,可能说“嗨,摩根,你今天已经 30 岁了”,在这种情况下你应该使用会话范围。如果您只需要转发页面的这些数据,那么您就属于请求范围的情况。 MVC 模型不是问题,您已经在项目的 servlet 部分中操作了数据,并且在 JSP 中显示了数据,因此您或多或少是“合规的”(广义而言)。
  • 这只是一个演示应用程序,但是当一个人输入他们的 ID 时,会话将从数据库中检索到的详细信息存储在会话中,因为其他页面依赖于该人的 ID。将 id 作为对其他页面的请求的一部分转发,然后在下一个 servlet 中将其作为参数检索,这没什么意义。
  • 如果您担心内存消耗,您可以只传递会话范围内的 ID。您在内存消耗和“”“计算复杂性”“”之间进行了某种权衡。如果您创建一个包含有关用户的所有有用信息的会话 Beam,您可能会在内存中产生某种开销,但您不需要在其他 servlet 中查询数据库以向其他 JSP 提供 Beam。否则,您将保留内存,但您必须重新查询数据库以提取相应 JSP 需要的所有信息。如果我理解了你的“架构”,情况就是这样。
  • 我认为您确实了解我的情况。鉴于这只是一个数据量很小的演示应用程序,person 对象的会话存储就可以了。将 id 设置为 session 是另一种选择,但是是的,它需要在其他 servlet 中调用 DB。当然,在请求更新人员的情况下,会话对象将被更新。
猜你喜欢
  • 2017-01-22
  • 1970-01-01
  • 2011-09-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-28
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多