JavaWeb 18 JSP内置对象 及 作用域

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 那么 还能够 取出 哪几个 数据呢?

答:不出所料的话,能够取出 Applicationsession 的数据。

<%@ 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:客户端向服务器发送请求,产生的数据,一个用户用完后,其它用户还会去用,比如说:聊天的数据(网页聊天室)

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值