如何在 JSP 页面之间共享数据

JSP 页面间共享数据的核心是利用不同作用域的隐式对象,数据会绑定到对应作用域中,其他页面可通过getAttribute()或 EL 读取,按作用域从窄到宽分为 4 类方式:

作用域 核心对象 数据生命周期 适用场景
page(页面) pageContext 仅当前 JSP 页面有效(跳转后失效) 单个页面内的临时数据
request(请求) request 单次请求内有效(转发后仍可用) 同一请求的多个页面(如转发)
session(会话) session 单个用户会话内有效(默认 30 分钟) 跨请求的用户专属数据(如登录信息)
application(应用) application 整个 Web 应用运行期间有效 全局共享数据(如系统配置)

方式 1:page 作用域(仅当前页面)

通过pageContext绑定数据,仅当前页面可访问,跳转 / 刷新后失效:

1
2
3
4
<%-- 绑定数据 --%>
<% pageContext.setAttribute("msg", "仅当前页面可见"); %>
<%-- 读取数据 --%>
${pageScope.msg} <%-- 等价于pageContext.getAttribute("msg") --%>

方式 2:request 作用域(单次请求)

通过request绑定数据,转发(forward) 的页面可共享,重定向(redirect)失效(重定向是新请求):① 页面 A(set.jsp):

1
2
3
4
5
<%
request.setAttribute("username", "张三");
// 转发到页面B
request.getRequestDispatcher("get.jsp").forward(request, response);
%>

② 页面 B(get.jsp):

1
2
<%-- 读取request作用域数据 --%>
${requestScope.username} <%-- 输出:张三 --%>

方式 3:session 作用域(用户会话)

通过session绑定数据,同一用户的所有请求(跨页面、跨请求)均可访问,直到会话失效(关闭浏览器 / 超时):① 登录页面(login.jsp):

1
2
3
4
5
6
<%
// 模拟登录成功,绑定用户信息到session
session.setAttribute("user", "admin");
// 重定向到首页(重定向不影响session数据)
response.sendRedirect("index.jsp");
%>

② 首页(index.jsp):

1
2
3
4
5
<%-- 读取session中的用户信息 --%>
欢迎您,${sessionScope.user}!

<%-- 销毁session(退出登录)--%>
<% session.invalidate(); %>

方式 4:application 作用域(全局共享)

通过application(ServletContext)绑定数据,所有用户、所有页面共享,直到 Web 应用重启:① 配置页面(config.jsp):

1
2
3
4
<%
// 绑定全局系统名称
application.setAttribute("sysName", "JSP学习系统");
%>

② 任意页面:

1
2
<%-- 所有用户均可读取 --%>
<h1>${applicationScope.sysName}</h1>

补充方式:URL 传参(轻量级)

通过 URL 拼接参数传递简单数据(仅支持字符串,暴露在地址栏,不安全):① 页面 A:

1
2
3
<a href="get.jsp?id=123&name=李四">跳转</a>
<%-- 或重定向传参 --%>
<% response.sendRedirect("get.jsp?id=123"); %>

② 页面 B(get.jsp):

1
2
3
<%-- 读取URL参数 --%>
ID:${param.id} <br>
姓名:${param.name}

核心注意事项:

  1. 优先使用 “最小作用域”:如仅单次请求用 request,避免滥用 session/application 导致内存占用过高;
  2. session 数据需注意线程安全(多请求共享),且敏感数据需加密;
  3. 重定向(response.sendRedirect())会创建新请求,request 作用域数据失效,需用 session/URL 传参。