Request,Session和ServletContext中的属性之间的差异

我无法理解这三种设置属性的方法之间的差异:

// 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. 你应该什么时候使用?

三者都有不同的范围,

请求的属性适用于该请求响应周期,

会话的会话属性,

servletContext跨越servlet上下文,直到上下文被销毁为止

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

会话属性绑定到会话,作为向一组相关HTTP请求提供状态的手段。 会话属性仅适用于加入会话的Servlet。 它们在分布式方案中也不可用于不同的JVM。 当对象绑定/未绑定到实现HttpSessionBindingListener接口的Session时,可以通知对象。

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

在总结中 ,我们可以说:

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

资料来源: Servlets采访Krishna Srinivasan @ javabeat.net的问题