JSP和JSTL板块:第三节 JSP四大域对象 来自【汤米尼克的JAVAEE全套教程专栏】

JSP和JSTL板块:第三节 JSP四大域对象

  • 一、page范围
  • 二、request范围
  • 三、session范围
  • 四、application范围

在服务器和客户端之间、各个网页之间、哪怕同一个网页之内,总是需要传递各种参数值,这时JSP的内置对象就是传递这些参数的载具。内置对象是JSP在对应Servlet里自动载入的,因此不需要用new实例化。在JSP中直接写就可以。
内置对象共有四种,每种对象都可以在各自的范围里进行传递参数,它们都有各自的特点。
更多域对象深度内容可看Sevlet板块的五大对象小节(还没写好)

域对象取得到取不到
1.page范围pageContext:只在一个页面中保存属性服务器跳转(请求转发forward)之后无效
2. request范围request:只在一次请求中保存,服务器跳转后依然有效客户端跳转(重定向/超链接)
3. session范围session:在一次会话范围中,无论何种跳转都可以使用换一个浏览器
4.application 范围application:在整个服务器上保存重启服务器或换一台电脑

每个域对象都提供了这三个基本方法
在这里插入图片描述
如果IDEA无法获取以上中的某个方法,可能是jar包未导入,需要在项目结构里导入对应Tomtcat文件->lib文件下的jar包

一、page范围

只能在本页面取得参数,服务器端跳转<jsp:forward page="...">后就接收不到参数了

实例
设置参数页 start.jsp

<%--Created by IntelliJ IDEA.User: TommyNike
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>设置参数页</title>
</head>
<body><%// 设置page范围的域对象pageContext.setAttribute("page","zhangsan");// 设置request范围的域对象request.setAttribute("request","lisi");// 设置session范围的域对象session.setAttribute("session", "wangwu");// 设置application范围的域对象application.setAttribute("application","zhaoliu");%><%--    JSP的服务器跳转:请求转发--%><jsp:forward page="after.jsp"/>
</body>
</html>

获取参数页 after.jsp

<%--Created by IntelliJ IDEA.User: TommyNike
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>获取参数页</title></head><body><%// 获取域对象中的值System.out.println("page范围: " + pageContext.getAttribute("page") + "\n");System.out.println("request范围:"+ request.getAttribute("request") + "\n");System.out.println("session范围: " + session.getAttribute("session") + "\n");System.out.println("application范围: " + application.getAttribute("application"));%></body>
</html>

启动服务器后在浏览器访问设置参数页,自动请求转发到获取参数页(请求转发地址栏不变
在这里插入图片描述

得到获取参数页终端输出
在这里插入图片描述
结论:除了page对象都接受到参数了,因为page对象只能接受到同一个页面中的参数,服务器请求转发后就接不到参数了

二、request范围

服务器跳转有效,客户端跳转失效
如果是客户端跳转,也就是重定向,则相当于发出了两次请求,那么第一次的请求将不存在了,就接收不到参数了。如果希望不管是客户端还是服务器跳转,都能保存的话,就需要继续扩大范围到seesion。

实例
设置参数页 start.jsp

<%--Created by IntelliJ IDEA.User: TommyNike
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html>
<head><title>设置参数页</title>
</head>
<body><%// 设置page范围的域对象pageContext.setAttribute("page","zhangsan");// 设置request范围的域对象request.setAttribute("request","lisi");// 设置session范围的域对象session.setAttribute("session", "wangwu");// 设置application范围的域对象application.setAttribute("application","zhaoliu");//     重定向response.sendRedirect("after.jsp"); //如果改成超链接用<a>标签的效果也一样%>
</body>
</html>

获取参数页 after.jsp

<%--Created by IntelliJ IDEA.User: TommyNike
--%>
<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<html><head><title>获取参数页</title></head><body><%// 获取域对象中的值System.out.println("page范围: " + pageContext.getAttribute("page") + "\n");System.out.println("request范围:"+ request.getAttribute("request") + "\n");System.out.println("session范围: " + session.getAttribute("session") + "\n");System.out.println("application范围: " + application.getAttribute("application"));%></body>
</html>

启动服务器后在浏览器访问设置参数页,自动重定向到获取参数页(重定向地址栏会变
在这里插入图片描述

得到获取参数页终端输出
在这里插入图片描述

结论:page和request对象接受不到参数了,因为reuqest对象最多只能接受到服务器跳转(请求转发)的范围,重定向相当于服务器进行了两次会话:关闭了start.jsp,又打开了after.jsp所以接受不到参数了

三、session范围

无论客户端还是服务器端都可以取得,但如果重新开启一个新的浏览器,则无法取得之前设置的session了,因为每一个session只保存在当前的浏览器当中
对于服务器而言,每一个连接到它的客户端都是一个session,如果想要让属性设置一次之后,不管是否是新的浏览器打开都能取得则可以使用application

实例
现在到上一步中的重定向结束,可以访问到session的范围
在这里插入图片描述
如果此时重启浏览器,再访问after.jsp
在这里插入图片描述
终端就拿不到session对象里的参数了
在这里插入图片描述
结论:seesion对象虽然可以保存参数越过请求转发和重定向,但seesion是存活在一个浏览器中的,如果手动删除浏览器中保存的seesion
在这里插入图片描述
或者重启浏览器都会导致这个session死亡。

四、application范围

只要是通过application设置的属性,则所有此时服务器中的session都可以取得。可以简单的理解成application是所有seesion的集合,而且放在服务器中保存,但是如果此时服务器重启了,就无法取得了,因为关闭服务器后所有的对象都消失了。

实例
来到上一步中的

在这里插入图片描述
此时如果重启服务器,或者干脆换了一台电脑再访问after.jsp
在这里插入图片描述
当然就什么都拿不到了
在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/448670.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

时间序列预测——GRU模型

时间序列预测——GRU模型 在深度学习领域&#xff0c;循环神经网络&#xff08;RNN&#xff09;是处理时间序列数据的一种常见选择。上期已介绍了LSTM的单步和多步预测。本文将深入介绍一种LSTM变体——门控循环单元&#xff08;GRU&#xff09;模型&#xff0c;包括其理论基础…

NSFCdownload 国自然结题报告下载速度慢问题修复

最近有人反应国自然结题报告下载速度慢&#xff0c;大部分人出的问题都是在软件启动的时候&#xff0c;卡在那一直不动&#xff0c;卡的时间过长&#xff0c;以后就提示下载失败了。如下图所示&#xff0c;光标在这里&#xff0c;一直不往下走。 小编也是收到这个反馈以后&…

如何使用本地私有NuGet服务器

写在前面 上一篇介绍了如何在本地搭建一个NuGet服务器&#xff0c; 本文将介绍如何使用本地私有NuGet服务器。 操作步骤 1.新建一个.Net类库项目 2.打包类库 操作后会生成一个.nupkg文件&#xff0c;当然也可以用dotnet pack命令来执行打包。 3.推送至本地NuGet服务器 打开命…

LeetCode15. 三数之和

15. 三数之和 给你一个整数数组 nums &#xff0c;判断是否存在三元组 [nums[i], nums[j], nums[k]] 满足 i ! j、i ! k 且 j ! k &#xff0c;同时还满足 nums[i] nums[j] nums[k] 0 。请 你返回所有和为 0 且不重复的三元组。 **注意&#xff1a;**答案中不可以包含重复…

指针的学习1

目录 什么是指针&#xff1f; 野指针 造成野指针的原因&#xff1a; 如何避免野指针&#xff1f; 内存和指针 如何理解编址&#xff1f; 指针变量和地址 取地址操作符& 指针变量和解引用操作符 指针变量 如何拆解指针类型&#xff1f; 指针变量的大小 指针变量…

LeetCode.189. 轮转数组

题目 题目链接 分析 首先能想到的就是可以用一个新数组&#xff0c;先保存原数组的后 k 个元素&#xff0c;再保存原数组的前 n−k 个元素。但题目要求不使用额外的数组空间&#xff0c;那么就需要在原数组上做操作。 我们可以先把整个数组翻转一下&#xff0c;这样后半段元…

蓝桥杯---煤球数目

有一堆煤球,堆成三角棱锥形。具体: 第一层放1个, 第二层3个(排列成三角形), 第三层6个(排列成三角形), 第四层10个(排列成三角形), 如果一共有100层,共有多少个煤球? 请填表示煤球总数目的数字. 注意:你提交的应该是一个整数,不要填写任何多余的内容或说明性文字. 代码 pu…

Maven高级知识——分模块开发、继承与聚合

目录 一、分模块设计与开发 1.1 不分模块的问题 1.2 分模块设计 二、 继承与聚合 2.1 继承 2.1.1 继承关系 2.1.2 版本锁定 2.1.2.1 场景 2.1.2.2 介绍 2.1.2.3 实现 2.1.2.4 属性配置 2.2 聚合 2.2.1 介绍 2.2.2 实现 2.3 继承与聚合对比 三、Maven打包方式&#xff08;jar、w…

2023 OpenHarmony 年度运营报告

汇聚 70 家企业 6700名贡献者力量&#xff0c; OpenHarmony 已成为下一代智能终端操作系统根社区&#xff1b; 我们在成长,OpenHarmony 项目群成员单位增至 35 家&#xff1b; 2023 年持续迭代更新 6 个版本及 OpenHarmony4.0 重点特性简介……

哈希表——C++

目录 一、首先使用拉链法&#xff1a; 二、开放寻址法 三、字符串哈希 1.具体如何使用进制的方式来存储字符前缀的可以看这个y总的这个图 2.接下来说一说算某个中间的区间的字符串哈希值 哈希表是一种数组之间互相映射的数据结构&#xff0c;比如举个简单的例子一个十个的数…

单细胞scATAC-seq测序基础知识笔记

单细胞scATAC-seq测序基础知识笔记 单细胞ATAC测序前言scATAC-seq数据怎么得出的&#xff1f; 该笔记来源于 Costa Lab - Bioinformatics Course 另一篇关于scRNA-seq的请移步 单细胞ATAC测序前言 因为我的最终目的是scATAC-seq的数据&#xff0c;所以这部分只是分享下我刚学…

2024 Flutter 重大更新,Dart 宏(Macros)编程开始支持,JSON 序列化有救

说起宏编程可能大家并不陌生&#xff0c;但是这对于 Flutter 和 Dart 开发者来说它一直是一个「遗憾」&#xff0c;这个「遗憾」体现在编辑过程的代码修改支持上&#xff0c;其中最典型的莫过于 Dart 的 JSON 序列化。 举个例子&#xff0c;目前 Dart 语言的 JSON 序列化高度依…