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创建库及数据插入文档查询数据修改数据文档排序删除数…...

相机Camera日志实例分析之二:相机Camx【专业模式开启直方图拍照】单帧流程日志详解
【关注我,后续持续新增专题博文,谢谢!!!】 上一篇我们讲了: 这一篇我们开始讲: 目录 一、场景操作步骤 二、日志基础关键字分级如下 三、场景日志如下: 一、场景操作步骤 操作步…...
线程同步:确保多线程程序的安全与高效!
全文目录: 开篇语前序前言第一部分:线程同步的概念与问题1.1 线程同步的概念1.2 线程同步的问题1.3 线程同步的解决方案 第二部分:synchronized关键字的使用2.1 使用 synchronized修饰方法2.2 使用 synchronized修饰代码块 第三部分ÿ…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...

第一篇:Agent2Agent (A2A) 协议——协作式人工智能的黎明
AI 领域的快速发展正在催生一个新时代,智能代理(agents)不再是孤立的个体,而是能够像一个数字团队一样协作。然而,当前 AI 生态系统的碎片化阻碍了这一愿景的实现,导致了“AI 巴别塔问题”——不同代理之间…...
Vite中定义@软链接
在webpack中可以直接通过符号表示src路径,但是vite中默认不可以。 如何实现: vite中提供了resolve.alias:通过别名在指向一个具体的路径 在vite.config.js中 import { join } from pathexport default defineConfig({plugins: [vue()],//…...

Web后端基础(基础知识)
BS架构:Browser/Server,浏览器/服务器架构模式。客户端只需要浏览器,应用程序的逻辑和数据都存储在服务端。 优点:维护方便缺点:体验一般 CS架构:Client/Server,客户端/服务器架构模式。需要单独…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用
在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...

wpf在image控件上快速显示内存图像
wpf在image控件上快速显示内存图像https://www.cnblogs.com/haodafeng/p/10431387.html 如果你在寻找能够快速在image控件刷新大图像(比如分辨率3000*3000的图像)的办法,尤其是想把内存中的裸数据(只有图像的数据,不包…...
【HarmonyOS 5】鸿蒙中Stage模型与FA模型详解
一、前言 在HarmonyOS 5的应用开发模型中,featureAbility是旧版FA模型(Feature Ability)的用法,Stage模型已采用全新的应用架构,推荐使用组件化的上下文获取方式,而非依赖featureAbility。 FA大概是API7之…...