Servlet 三大作用域
在 Web 开发中,数据的存储范围直接决定了它的生命周期。理解不同作用域的边界,是设计健壮应用的基础。Servlet 规范主要定义了三个核心作用域对象。
HttpServletRequest
这是请求级别的作用域。每次 HTTP 请求都会创建一个新的对象,当响应返回后,该对象即被销毁。它适合存放表单提交的数据、临时参数等仅在单次交互中有效的信息。在实际项目中,如果需要在转发(forward)过程中传递数据,通常首选这里。
HttpSession
会话级别的作用域。只要用户不关闭浏览器或会话超时,数据就会一直存在。常用于保存登录状态、购物车信息等需要跨请求保持的用户数据。需要注意的是,不要在这里存放大对象或敏感信息,以免占用服务器内存或造成安全隐患。
ServletContext
应用级别的作用域。在整个 Web 应用启动时创建,直到应用停止才销毁。所有用户共享同一个实例。通常用于存放配置信息、全局计数器或者缓存一些只读数据。由于它是单例的,修改其中的内容会影响所有访问者,使用时需谨慎。
JSP 四大作用域
JSP 页面本质上也是 Servlet,因此它继承了 Servlet 的作用域概念,并增加了一个页面级作用域。
pageContext
页面级作用域。仅在当前的 JSP 页面内有效。JSP 内置对象 pageContext 提供了访问其他作用域对象的便捷方法,比如获取 request 或 session 属性。
request / session / application
这三个分别对应 Servlet 中的 HttpServletRequest、HttpSession 和 ServletContext。在 JSP EL 表达式中,可以直接通过 requestScope、sessionScope、applicationScope 来访问它们,无需显式调用 getter 方法。
总结
选择合适的作用域是优化性能的关键。请求级用完即弃,会话级维持用户状态,应用级共享全局资源。理解它们的边界,能有效避免内存泄漏和数据污染问题。

