jsp中的四个域对象(Spring MVC)
在Spring MVC中,Model中的数据会被自动放入到请求域(Request Scope)中。也就是说,当我们在控制器中使用model.addAttribute()时,这些属性会被放入到HttpServletRequest对象的属性中。
让我们通过代码来详细解释:
- 控制器中设置属性:
@GetMapping("/list") public String list(Model model) {// 这里的数据会被放入请求域中model.addAttribute("contentPage", "event/list");return "layout/base"; }
- JSP中获取属性:
<!-- 以下三种写法是等价的 -->
<!-- 1. 直接使用EL表达式 -->
${contentPage}
<!-- 2. 显式指定从请求域获取 -->
${requestScope.contentPage}
<!-- 3. 使用JSP内置对象request -->
<%=request.getAttribute("contentPage")%>
在JSP中,有四个主要的域对象:
- 页面域(Page Scope):
- 最小的作用范围
- 仅在当前页面有效
- 通过pageContext对象访问
- 请求域(Request Scope):
- 在一次请求中有效
- Spring MVC的Model数据就是存在这里
- 通过request对象访问
- 会话域(Session Scope):
- 在一次会话中有效
- 用户登录信息通常存在这里
- 通过session对象访问
- 例如:${sessionScope.loginUser}
- 应用域(Application Scope):
- 在整个Web应用中有效
- 所有用户共享
- 通过application对象访问
在我们的项目中:
<!-- base.jsp --><!-- contentPage 从请求域获取 --><jsp:include page="/WEB-INF/views/${contentPage}.jsp"/><!-- 用户信息从会话域获取 --><c:if test="${not empty sessionScope.loginUser}"><span>欢迎,${sessionScope.loginUser.username}</span></c:if>
当使用EL表达式${contentPage}时,它会按照以下顺序查找属性:
- 先找页面域(pageScope)
- 再找请求域(requestScope)
3. 再找会话域(sessionScope)
- 最后找应用域(applicationScope)
所以虽然我们在JSP中直接写${contentPage},但实际上它是从请求域中获取的,因为Spring MVC把Model中的数据都放在了请求域中。
这就是为什么:
- 页面切换时contentPage的值会改变(因为是请求域,每次请求都是新的)
- 而用户登录信息不会丢失(因为是会话域,会一直保持到用户退出登录)
这种域的概念是JSP中非常重要的一个概念,它们的作用范围不同,我们需要根据数据的特性选择合适的域来存储。
jsp页面有几种域
JSP页面有四种域(作用域/Scope),按照作用范围从小到大排序:
- 页面域 (Page Scope)
- 作用范围:仅在当前页面有效// 存值<%pageContext.setAttribute("name", "value");%>// 取值${pageScope.name}
- 生命周期:当前页面的处理完成之前
- 适用场景:只在当前页面使用的数据
- 访问对象:pageContext
- 请求域 (Request Scope)
- 作用范围:一次请求内有效// 存值<%request.setAttribute("name", "value");%>// 或在控制器中model.addAttribute("name", "value");// 取值${requestScope.name}// 或简写为${name}
- 生命周期:从请求开始到响应结束
- 适用场景:在一次请求中传递的数据(如从控制器传到JSP的数据)
- 访问对象:request
- 会话域 (Session Scope)
// 存值<%session.setAttribute("loginUser", user);%>// 或在控制器中session.setAttribute("loginUser", user);// 取值${sessionScope.loginUser}
- 作用范围:一次会话内有效
- 生命周期:从会话开始到会话结束(用户关闭浏览器或超时)
- 适用场景:用户相关的数据(如登录信息)
- 访问对象:session
- 应用域 (Application Scope)
- 作用范围:整个Web应用有效// 存值<%application.setAttribute("appConfig", config);%>// 取值${applicationScope.appConfig}
- 生命周期:从服务器启动到服务器关闭
- 适用场景:所有用户共享的数据(如系统配置)
- 访问对象:application
在我们的项目中的实际应用:
1. 请求域:用于页面显示数据
// 控制器中@GetMapping("/list")public String list(Model model) {model.addAttribute("contentPage", "event/list"); // 存入请求域return "layout/base";}
<!-- JSP中 -->
<jsp:include page="/WEB-INF/views/${contentPage}.jsp"/> // 从请求域获取
- 会话域:用于用户登录状态
// 控制器中@PostMapping("/login")public Result<User> login(String username, String password, HttpSession session) {// ... 登录验证 ...session.setAttribute("loginUser", user); // 存入会话域}
jsp<!-- JSP中 --><c:if test="${not empty sessionScope.loginUser}"> // 从会话域获取 <span>欢迎,${sessionScope.loginUser.username}</span></c:if>
数据查找顺序:
- 当使用${name}这样的EL表达式时,会按照以下顺序查找:
- pageScope
- requestScope
3. sessionScope
- applicationScope
选择使用哪个域的原则:
- 能用小范围的就不用大范围的
- 根据数据的生命周期选择合适的域
- 考虑性能影响(作用域越大,占用资源越多)
相关文章:
jsp中的四个域对象(Spring MVC)
在Spring MVC中,Model中的数据会被自动放入到请求域(Request Scope)中。也就是说,当我们在控制器中使用model.addAttribute()时,这些属性会被放入到HttpServletRequest对象的属性中。 让我们通过代码来详细解释&#…...
计算机基础知识复习12.24
http和https有那些区别 http是超文本传输协议,信息是明文传输,存在安全风险的问题,https则解决http不安全的缺点,在TCP和HTTP网络层之间加入了SSL/TLS安全协议,使得报文能够加密传输 http连接建立相对简单࿰…...
如何使用vscode解决git冲突
在使用VSCode时,遇到Git冲突是很常见的情况。Git冲突是指当多个人同时修改同一个文件的同一行或相邻行时,Git无法自动决定应该保留哪一个修改,需要手动解决这个冲突。 要解决Git冲突,可以按照以下步骤操作: 1. 打开V…...

告别卡顿:CasaOS轻NAS设备安装Gopeed打造高效下载环境
文章目录 前言1. 更新应用中心2.Gopeed安装与配置3. 本地下载测试4. 安装内网穿透工具5. 配置公网地址6. 配置固定公网地址 前言 无论你是需要大量文件传输的专业人士,还是只是想快速下载电影或音乐的普通用户,都会使用到下载工具。如果你对现有的下载工…...

Java 重写(Override)与重载(Overload)
重写 (Override) 重写是子类对父类的允许访问的方法的实现过程进行重新编写!返回值和形参都不能改变。即外壳不变,核心重写! 重写的好处在于子类可以根据需要,定义特定于自己的行为。 也就是说子类能够根据需要实现父类的方法。…...
HDFS与HBase有什么关系?
1 、 HDFS 文件存储系统和 HBase 分布式数据库 HDFS 是 Hadoop 分布式文件系统。 HBase 的数据通常存储在 HDFS 上。 HDFS 为 HBase 提供了高可靠性的底层存储支持。 Hbase 是 Hadoop database ,即 Hadoop 数据库。它是一个适合于非结构化数据存储的数据库, HBase 基于列的…...

CentOS7下的vsftpd服务器和客户端
目录 1、安装vsftpd服务器和ftp客户端; 2、配置vsftpd服务器,允许普通用户登录、下载、上传文件; 3、配置vsftpd服务器,允许anonymous用户登录、下载、上传文件; 4、配置vsftpd服务器,允许root用户登录…...

全网最详细Gradio教程系列10——Blocks:底层区块类(下)
全网最详细Gradio教程系列10——Blocks:底层区块类(下) 前言本篇摘要10. Blocks:底层区块类10.4 Blocks Layout:布局10.4.1 行与列1. Rows2. Columns 10.4.2 选项卡和折叠类10.4.3 重渲染.render()10.4.4 Group分组10.…...
嵌入式设备常用性能和内存调试指令
文章目录 嵌入式设备常用性能和内存调试指令内存问题分析性能测试android设备通过NDK 使用SimplePerf 抓取火焰图嵌入式linux抓取特定进程的perf火焰图 杂记 嵌入式设备常用性能和内存调试指令 内存问题分析 安装valgrind,按照如下指令执行应用程序: …...

数据库系统原理:数据恢复与备份策略
3.1可行性分析 开发者在进行开发系统之前,都需要进行可行性分析,保证该系统能够被成功开发出来。 3.1.1技术可行性 开发该《数据库系统原理》课程平台所采用的技术是vue和MYSQL数据库。计算机专业的学生在学校期间已经比较系统的学习了很多编程方面的知识…...
C++软件设计模式之装饰器模式
装饰器模式(Decorator Pattern)是C软件设计模式中的一种结构型设计模式,主要用于解决在不改变现有对象结构的情况下动态地给对象添加新功能的问题。通过使用装饰器模式,可以在运行时为对象添加新的行为,而不需要修改其…...

fpga系列 HDL:Quartus II PLL (Phase-Locked Loop) IP核 (Quartus II 18.0)
在 Quartus II 中使用 PLL (Phase-Locked Loop) 模块来将输入时钟分频或倍频,并生成多个相位偏移或频率不同的时钟信号: 1. 生成 PLL 模块 在 Quartus II 中: 打开 IP Components。 file:///C:/intelFPGA_lite/18.0/quartus/common/help/w…...
Spring AOP 中记录日志
Spring AOP 中记录日志 使用 AOP 和 Spring 提供的 RequestContextHolder 在通知中记录 HTTP 请求相关日志。以下是进阶添加日志功能的完整例子和说明。 完整示例 1. 切面类实现 Aspect Component public class LogAspect {Around("annotation(log)") // 拦截所有…...

udp tcp协议
文章目录 1. UDP协议1.1 端口号1.2 UDP协议格式1.3 UDP特性1.4 报文的封装 2. TCP协议2.1 TCP协议格式2.2 TCP策略2.2.1 确认应答机制(ACK)序号与确认序号6个标志位序号的理解 2.2.2 超时重传机制2.2.3 连接管理机制三次握手四次挥手理解三次握手理解四次挥手 2.2.4 流量控制2.…...
C语言结构体详细讲解
文章目录 [TOC] 一、前言二、结构体2.1 结构体概念🎈2.2 结构体定义🎉2.3 结构体使用🎗️ 结尾 时间紧后面还有一些知识点这周内补上, 理解理解!(❁◡❁) 一、前言 在学习结构体之前,讲讲为什么会专门写一章博客来分享…...

公交车信息管理系统:实现交通数据的智能化处理
概述 在对系统进行设计之前,需要对选题进行需求分析、可行性分析、流程分析、数据字典等内容。根据需求分析阶段,大致确定用户使用系统所需要具有的功能模块需求,由此规划出系统需要设计的相关功能模块。根据可行性分析阶段,确定系…...
在 Windows 下生成 .tgz 文件的方法
方法 1:使用 7-Zip 7-Zip 是一个流行的免费压缩工具,支持生成 .tar.gz 格式。 步骤: 下载并安装 7-Zip。准备好要压缩的文件或文件夹。右键点击文件或文件夹,选择 7-Zip > 添加到压缩文件...。在弹出的对话框中:…...

编程式浪漫,100款圣诞树代码分享
最近这几天有很多小伙伴开始寻找各种各样的圣诞树代码,我们最常用的Java,Python,C语言,前端,都是可以实现的。小巫师,就在这里分享超火的圣诞树代码,源码分享! 01.HTML圣诞树源代码…...

Nacos的下载和启动(如何快速稳定下载在github中)
目录 Nacos的下载 下载加速器 在githup中找到Nacos 启动Nacos 访问Nacos Nacos的下载 下载加速器 首先,我们需要进入githup中,我们直接访问,肯定是访问不到的。 这里我们经常玩游戏的同学肯定知道steam,这个加速器。直接进入…...
python基础知识(六)
文章目录 连接Mysql数据库安装Mysql数据库连接数据库创建数据库创建数据表查询表是否存在设置主键插入数据批量插入查询、删除、更新数据 使用PyMySql连接数据库安装PyMySql连接数据库 连接MongoDB安装pymongo驱动在MongoDB创建库及数据插入文档查询数据修改数据文档排序删除数…...

抖音增长新引擎:品融电商,一站式全案代运营领跑者
抖音增长新引擎:品融电商,一站式全案代运营领跑者 在抖音这个日活超7亿的流量汪洋中,品牌如何破浪前行?自建团队成本高、效果难控;碎片化运营又难成合力——这正是许多企业面临的增长困局。品融电商以「抖音全案代运营…...

Yolov8 目标检测蒸馏学习记录
yolov8系列模型蒸馏基本流程,代码下载:这里本人提交了一个demo:djdll/Yolov8_Distillation: Yolov8轻量化_蒸馏代码实现 在轻量化模型设计中,**知识蒸馏(Knowledge Distillation)**被广泛应用,作为提升模型…...

【网络安全】开源系统getshell漏洞挖掘
审计过程: 在入口文件admin/index.php中: 用户可以通过m,c,a等参数控制加载的文件和方法,在app/system/entrance.php中存在重点代码: 当M_TYPE system并且M_MODULE include时,会设置常量PATH_OWN_FILE为PATH_APP.M_T…...

基于PHP的连锁酒店管理系统
有需要请加文章底部Q哦 可远程调试 基于PHP的连锁酒店管理系统 一 介绍 连锁酒店管理系统基于原生PHP开发,数据库mysql,前端bootstrap。系统角色分为用户和管理员。 技术栈 phpmysqlbootstrapphpstudyvscode 二 功能 用户 1 注册/登录/注销 2 个人中…...
6️⃣Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙
Go 语言中的哈希、加密与序列化:通往区块链世界的钥匙 一、前言:离区块链还有多远? 区块链听起来可能遥不可及,似乎是只有密码学专家和资深工程师才能涉足的领域。但事实上,构建一个区块链的核心并不复杂,尤其当你已经掌握了一门系统编程语言,比如 Go。 要真正理解区…...

算术操作符与类型转换:从基础到精通
目录 前言:从基础到实践——探索运算符与类型转换的奥秘 算术操作符超级详解 算术操作符:、-、*、/、% 赋值操作符:和复合赋值 单⽬操作符:、--、、- 前言:从基础到实践——探索运算符与类型转换的奥秘 在先前的文…...

CTF show 数学不及格
拿到题目先查一下壳,看一下信息 发现是一个ELF文件,64位的 用IDA Pro 64 打开这个文件 然后点击F5进行伪代码转换 可以看到有五个if判断,第一个argc ! 5这个判断并没有起太大作用,主要是下面四个if判断 根据题目…...
深入解析 ReentrantLock:原理、公平锁与非公平锁的较量
ReentrantLock 是 Java 中 java.util.concurrent.locks 包下的一个重要类,用于实现线程同步,支持可重入性,并且可以选择公平锁或非公平锁的实现方式。下面将详细介绍 ReentrantLock 的实现原理以及公平锁和非公平锁的区别。 ReentrantLock 实现原理 基本架构 ReentrantLo…...

性能优化中,多面体模型基本原理
1)多面体编译技术是一种基于多面体模型的程序分析和优化技术,它将程序 中的语句实例、访问关系、依赖关系和调度等信息映射到多维空间中的几何对 象,通过对这些几何对象进行几何操作和线性代数计算来进行程序的分析和优 化。 其中࿰…...

从数据报表到决策大脑:AI重构电商决策链条
在传统电商运营中,决策链条往往止步于“数据报表层”:BI工具整合历史数据,生成滞后一周甚至更久的销售分析,运营团队凭经验预判需求。当爆款突然断货、促销库存积压时,企业才惊觉标准化BI的决策时差正成为增长瓶颈。 一…...