pageContext
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@page isELIgnored="false" %>
<html>
<head>
<title>scope</title>
</head>
<body>
<%
pageContext.setAttribute("name1", "pageContext");//保存的数据只在一个人页面内有效
request.setAttribute("name2", "request");//保存的数据只在一次请求内有效,请求转发
session.setAttribute("name3", "session");//保存的数据只在一次会话内有效,即关闭浏览器结束一次会话
application.setAttribute("name4", "application");//保存的数据只在服务器内有效,关闭服务器失效
%>
<%
//从pageContext取出,是通过寻找的方式
//作用域从底层到高层pageContext->request->session->application
String name1 = (String) pageContext.findAttribute("name1");
String name2 = (String) pageContext.findAttribute("name2");
String name3 = (String) pageContext.findAttribute("name3");
String name4 = (String) pageContext.findAttribute("name4");
String name5 = (String) pageContext.findAttribute("name5");//不存在
%>
<h1>结果为</h1>
<h3>name1(el):${name1}</h3>
<h3>name2(el):${name2}</h3>
<h3>name3(el):${name3}</h3>
<h3>name4(el):${name4}</h3>
<h3>name5(el):${name5}</h3><!--不显示值-->
<h3>name5(java表达式输出):<%=name5%></h3><!--返回null-->
</body>
</html>
PageContext作用域从底层到高层pageContext->request->session->application,源码分析
public abstract class PageContext extends JspContext {
public static final int PAGE_SCOPE = 1;
public static final int REQUEST_SCOPE = 2;
public static final int SESSION_SCOPE = 3;
public static final int APPLICATION_SCOPE = 4;
...}
//因此,此代码含义一样
pageContext.setAttribute("i", "o", PageContext.SESSION_SCOPE);
session.setAttribute("i", "o");
//都是请求转发的效果
pageContext.forward("scope1.jsp");
request.getRequestDispatcher("scope1.jsp").forward(request, response);
<jsp:forward page="scope1.jsp"></jsp:forward>
request:客户端向服务的发送请求,产生的数据,用户用于用完就没有用了,比如:新闻
session:客户端向服务的发送请求,产生的数据,用户用于用完一会还要用,比如:购物车
application:客户端向服务的发送请求,产生的数据,一个用户用于用完,其他用户还可能用,比如:聊天数据