14

我无法理解这 3 种设置属性的方式之间的区别:

// String as attribute of request
req.setAttribute("name", "Sluggo");

// Integer as attribute of session
req.getSession().setAttribute("age", 10);

// Date as attribute of context
getServletContext().setAttribute("today", new Date());
  1. 有什么区别?
  2. 你应该什么时候使用每个?
4

2 回答 2

23

ServletContext属性是通过该方法绑定到上下文中的对象,该对象可用于该上下文中的ServletContext.setAttribute()所有 Servlet(因此是 JSP),或通过该方法可用于其他上下文getContext()。根据定义,上下文属性本地存在于定义它们的 VM 中。因此,它们在分布式应用程序上不可用。

会话属性绑定到会话,作为向一组相关 HTTP 请求提供状态的一种手段。会话属性仅对加入会话的那些 Servlet 可用。在分布式场景中,不同的 JVM 也无法使用它们。HttpSessionBindingListener当对象绑定/解除绑定到实现接口的 Session 时,可以通知对象 。

请求属性被绑定到一个特定的请求对象,并且它们一直持续到请求被解析或者在它不断地从 Servlet 分派到 Servlet 时。它们更多地用作通过RequestDispatcher接口(因为您不能添加参数...)和容器之间的 Servlet 之间的通信通道。当您必须在信息提供者和绑定到特定请求且不再需要可用的信息表示层 (JSP) 之间提供设置信息时,请求属性在 Web 应用程序中非常有用,这通常发生在没有严格控制的会话中战略。

总之,我们可以说:

  • 上下文属性适用于基础设施,例如共享连接池。
  • 会话属性用于上下文信息,例如用户标识。
  • 请求属性用于特定的请求信息,例如查询结果。

资料来源:Servlets 面试问题,作者 Krishna Srinivasan @ javabeat.net

于 2013-03-15T13:40:00.333 回答
12

这三个有不同的范围:

  • 请求属性在该请求/响应周期的生命周期内有效

  • 该会话生命周期的会话属性

  • ServletContext跨越 servlet 上下文,它一直存在,直到上下文被破坏。

于 2013-03-14T00:16:44.810 回答