JSP 中有哪些作用域

JSP 中的作用域(Scope)是数据的有效范围,用于控制页面间数据共享的生命周期,核心分为 4 类,按 “有效范围从窄到宽” 排序:

作用域名称 对应隐式对象 核心类 数据生命周期 访问方式(EL) 典型应用场景
page(页面) pageContext PageContext 仅当前 JSP 页面有效,页面跳转 / 转发后立即失效;(甚至当前页面的不同脚本块执行完也不共享) ${pageScope.xxx} 单个页面内的临时变量(如局部计算结果)
request(请求) request HttpServletRequest 单次 HTTP 请求内有效;✅ 服务器内部转发(forward)后仍可用;❌ 重定向(redirect)后失效(新请求) ${requestScope.xxx} 同一请求的多页面数据共享(如表单提交后转发展示)
session(会话) session HttpSession 单个用户的会话周期内有效;默认 30 分钟无操作失效,或手动调用session.invalidate()销毁;不同用户的 session 相互隔离 ${sessionScope.xxx} 用户登录信息、购物车、用户专属配置
application(应用) application ServletContext 整个 Web 应用运行期间有效;所有用户共享,直到应用重启 / 服务器关闭;需注意线程安全 ${applicationScope.xxx} 全局配置(如系统名称、数据库连接池)、在线人数统计

核心特性与示例:

(1)page 作用域(最窄)
1
2
3
4
5
6
7
<%-- 绑定数据 --%>
<% pageContext.setAttribute("temp", "页面临时数据"); %>
<%-- 读取数据(仅当前页面可用)--%>
${pageScope.temp}

<%-- 转发后失效:跳转到其他页面无法读取 --%>
<% request.getRequestDispatcher("other.jsp").forward(request, response); %>
(2)request 作用域(单次请求)
1
2
3
4
5
6
7
<%-- 绑定数据 --%>
<% request.setAttribute("formData", "表单提交的数据"); %>
<%-- 转发后仍可用 --%>
<% request.getRequestDispatcher("show.jsp").forward(request, response); %>

<%-- 重定向后失效(新请求)--%>
<% response.sendRedirect("show.jsp"); %>
(3)session 作用域(用户会话)
1
2
3
4
5
6
7
<%-- 登录成功后绑定用户信息 --%>
<% session.setAttribute("loginUser", "admin"); %>
<%-- 任意页面均可读取(同一用户)--%>
${sessionScope.loginUser}

<%-- 退出登录时销毁 --%>
<% session.invalidate(); %>
(4)application 作用域(全局)
1
2
3
4
<%-- 绑定全局数据(所有用户共享)--%>
<% application.setAttribute("sysVersion", "v1.0"); %>
<%-- 任意用户的任意页面均可读取 --%>
${applicationScope.sysVersion}

关键注意事项:

  1. 优先使用 “最小作用域”:如仅单次请求用 request,避免滥用 session/application 导致内存泄漏;

  2. session 作用域数据需注意线程安全(多请求并发访问);

  3. EL 省略作用域前缀时,会按

    1
    page → request → session → application

    顺序查找数据(“就近原则”):

    1
    ${xxx} <%-- 先查page,再request,依此类推 --%>