请求、会话和 ServletContext 中属性之间的差异

2022-09-03 04:14:51

我无法理解这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. 何时应使用每种方法?

答案 1

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

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

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

综上所述,我们可以说:

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

资料来源:Servlets Interview Questions by Krishna Srinivasan @ javabeat.net


答案 2

这三者具有不同的范围:

  • 请求属性在该请求/响应周期的生命周期内处于活动状态

  • 该会话生存期的会话属性

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