在servlet和JSP中使用会话和请求属性以实现MVC遵从性的最佳实践

在servlet和JSP中使用会话和请求属性以实现MVC遵从性的最佳实践,jsp,session,servlets,request,Jsp,Session,Servlets,Request,我有一个场景,需要一个servlet在页面上显示一个人的详细信息,但我还想在会话中存储这个人的详细信息,所以这段代码是否可行: Person person = // Populated elsewhere. session.setAttribute("person", person); // Store Person in session. request.setAttribute("person", person); // Store Person in request. // Set

我有一个场景,需要一个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

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


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

这就是我所采取的方法。但我想知道JSP是否最好访问会话。如果Person包含某个登录用户的一些数据,而您希望存储这些数据以管理其他JSP,而不仅仅是转发的JSP,那么这可能就是确认登录正确性的页面,可能会说“Hi Morgan,您今天30岁了”在这种情况下,您应该使用会话范围。如果您只需要转发页面的这些数据,则属于请求范围案例。MVC模型不是一个问题,您已经在项目的servlet部分操作了数据,并在JSP中显示了数据,因此或多或少您是“兼容的”(广义上说)。这只是一个演示应用程序,但当一个人输入其ID时,会话将从数据库检索到的详细信息存储在会话中,因为其他页面依赖于此人的id。将id作为其他页面请求的一部分转发,然后在下一个servlet中将其作为参数检索没有什么意义。如果您担心内存消耗,您只能在会话作用域中传递ID。在内存消耗和“计算复杂性”之间有一种折衷。如果您创建了一个会话Beam,其中包含了关于用户的所有有用信息,那么内存中可能会有一定的开销,但您不需要在其他servlet中查询DB来向其他JSP提供Beam。否则将保留内存,但必须重新查询数据库以提取相应JSP所需的所有信息。如果我了解你的“架构”,情况就是这样。我想你确实了解我的场景。考虑到这只是一个数据量很小的演示应用程序,person对象的会话存储就可以了。将id设置为session是另一个选项,但是是的,它需要在其他servlet中调用DB。当然,当请求更新人员时,会话对象将被更新。请尝试使用最低作用域以避免内存消耗。范围从低到高<代码>页面->请求->会话->应用程序鉴于这只是一个数据量很小的演示应用程序,我通常会遵循这一点,但我认为在这种情况下,将我的人存储在会话中并允许JSP访问它应该没问题。但我要说的是,在其他情况下,应该避免基于会话的存储。