6.6 JSP内置对象 及 作用域
先 讲一下 文件夹:我们写一个 web 项目。static 下面才是 存储 静态文件用的。WEB-INF 放的是一些 用户不可见的 机密文件(重要文件)。web 根文件夹 放 的是 jsp 文件。
- 九大内置对象
final jakarta.servlet.jsp.PageContext pageContext; // 页面上下文
jakarta.servlet.http.HttpSession session = null; //session
final jakarta.servlet.ServletContext application; // ServletContext
final jakarta.servlet.ServletConfig config; // config
jakarta.servlet.jsp.JspWriter out = null; // out(writer)
final java.lang.Object page = this; // page:当前页
//jakarta.servlet.jsp.JspWriter _jspx_out = null; // _jspx_out 也是个书写者
//jakarta.servlet.jsp.PageContext _jspx_page_context = null; //_jspx_page_context 的 页面上下文
HttpServletRequest request // 请求
HttpServletResponse response // 响应
exception // 异常
其中 pageContext
request
session
application
都可以存储键值对数据,也可以 读取 键值对的值。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--内置对象--%>
<%
//保存的数据在当前页面有效
pageContext.setAttribute("name1", "1号", 1);
//保存的数据 在一次请求的时候是有效的,转发的时候 会携带这部分数据
request.setAttribute("name2", "2号");
//保存的数据 在一次 会话中 是有效的,浏览器一旦关闭即失效。
session.setAttribute("name3", "3号");
//保存的数据 在web 服务 开启的时候 就是有效的,是共享的。
//除非服务被关掉,要不然 一直有效。
application.setAttribute("name4", "4号");
%>
<%
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");
%>
<%--使用 EL 表达式 输出 变量--%>
<h1>取出的值为:</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3>${name5}</h3>
</body>
</html>
其实这些 保存的数据 都可以 用 pageContext 来进行获取,原因 就在于 作用域的问题。pageContext 作用域 可以说是 最小的了。如果 要获取作用域 比它大的 数据,那么 用它 肯定能获取到。
- 验证作用域
如果我们 访问了 其它的 jsp 那么 还能够 取出 哪几个 数据呢?
答:不出所料的话,能够取出 Application
和 session
的数据。
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--验证 存储数据的作用域--%>
<%
String name1 = (String)pageContext.getAttribute("name1");
String name2 = (String)pageContext.getAttribute("name2");
String name3 = (String)pageContext.getAttribute("name3");
String name4 = (String)pageContext.getAttribute("name4");
%>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
</body>
</html>
- 验证转发 可以 携带 request 的数据
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--内置对象--%>
<%
//保存的数据在当前页面有效
pageContext.setAttribute("name1", "1号", 1);
//保存的数据 在一次请求的时候是有效的,转发的时候 会携带这部分数据
request.setAttribute("name2", "2号");
//保存的数据 在一次 会话中 是有效的,浏览器一旦关闭即失效。
session.setAttribute("name3", "3号");
//保存的数据 在web 服务 开启的时候 就是有效的,是共享的。
//除非服务被关掉,要不然 一直有效。
application.setAttribute("name4", "4号");
%>
<%
pageContext.forward("/Demo03.jsp");
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");
%>
<%--使用 EL 表达式 输出 变量--%>
<h1>取出的值为:</h1>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
<h3>${name5}</h3>
</body>
</html>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head>
<title>Title</title>
</head>
<body>
<%--验证 转发可以携带 request 数据 --%>
<%
String name1 = (String)pageContext.getAttribute("name1");
String name2 = (String)pageContext.getAttribute("name2");
String name3 = (String)pageContext.getAttribute("name3");
String name4 = (String)pageContext.getAttribute("name4");
%>
<h3>${name1}</h3>
<h3>${name2}</h3>
<h3>${name3}</h3>
<h3>${name4}</h3>
</body>
</html>
确实 是 可以 携带 request 的数据,原因是因为 这属于 一次请求,转发 也是 属于 一次 请求。而并不是 重定向。如果是 重定向 那么 数据 就不会携带了。
pageContext.set(key,value,int scope/*作用域*/)
pageContext.setAttribute() 该方法,有第三个 参数,这个参数的意思是 你 存储的这个 数据 作用域 是哪个? 这个 其实 是有点儿 多此一举的 做法。 如果 你想要 存储 request 的数据,那么 就直接用 request就可以了。为啥 还要 用 pageContext 呢? 所以 第三个 参数 只作为了解即可。不建议使用。
第三个参数:
1 代表 page 当前页面的作用域。
2 代表 requset
3 代表 session
4 代表 application
- 应用场景
request:客户端向服务器发送请求,产生的数据,这部分数据用户看完后,就没有用了。比如说:看点,新闻。评论啥的。文章啥的。
session:客户端向服务器发送请求,产生的数据,用户看完可能一会儿 还有用!比如说 购物车里面的东西,一些 记录之类的,如果我们再次 存储数据 重新来的话,可能会影响效率,和性能压力。
application:客户端向服务器发送请求,产生的数据,一个用户用完后,其它用户还会去用,比如说:聊天的数据(网页聊天室)