当前位置: 首页 > news >正文

SpringMVC:向三大域对象存数据

1. 简介 

Servlet中的三个域对象

请求域:request会话域:session应用域:application

主要是通过:setAttribute + getAttribute方法来完成在域中数据的传递和共享。

点击跳转Servlet详细概念

// 向域中存储数据
void setAttribute(String name, Object obj);// 从域中读取数据
Object getAttribute(String name);// 删除域中的数据
void removeAttribute(String name);

 2. request域对象

在SpringMVC中,在request域中共享数据有以下几种方式:

1. 使用原生Servlet API方式。
2. 使用Model接口。
3. 使用Map接口。
4. 使用ModelMap类。
5. 使用ModelAndView类。

1. 原生Servlet API方式 

原生Servlet必须部署在Tomcat服务器,不方便进行单元测试 

index.html 

<body><h1>向Request请求域存数据</h1><a th:href="@{/testServletAPI}">原生API</a> <br>

Controller层

@Controller
//(controller层)
public class RequestController {@RequestMapping("/")public String index() {return "index";}//方法一:使用原生Servlet的api向请求域中添加数据,直接传递HttpServletRequest对象即可@RequestMapping("/testServletAPI")public String testServletAPI(HttpServletRequest request) {//向请求域中添加数据request.setAttribute("testData", "测试使用原生Servlet向请求域中添加数据");//添加成功后向哪个视图跳转并展示return "ok";}

 展示数据

<body><div th:text="${testData}"></div>

 2. 使用Model接口

<body><h1>向Request请求域存数据</h1><a th:href="@{/testServletModel}">Model接口向请求域中添加数据</a> <br>

Controller层 

//方法二:使用Model接口向请求域中添加数据@RequestMapping("/testServletModel")//(Model层)public String testServletMap(Model model) {//向域中添加数据model.addAttribute("testData", "测试使用model向请求域中添加数据");System.out.println(model.getClass().getName());//返回逻辑视图(view层)return "ok";}
<body><div th:text="${testData}"></div>

3. 使用Map接口

<a th:href="@{/testServletMap}">Map接口向请求域中添加数据</a> <br>
//方法三:使用Map接口向请求域中添加数据@RequestMapping("/testServletMap")public String testServletMap(Map<String, Object> map) {//向请求域中添加数据map.put("testData", "测试使用map向请求域中添加数据");System.out.println(map.getClass().getName());//返回逻辑视图return "ok";}
<body><div th:text="${testData}"></div>

4. 使用ModelMap类 

    <a th:href="@{/testServletModelMap}">ModelMap类向请求域中添加数据</a> <br>
 //方法四:通过ModelMap类向请求域中添加数据@RequestMapping("/testServletModelMap")public String testServletModelMap(ModelMap modelMap) {//向请求域中添加数据modelMap.addAttribute("testData", "测试使用ModelMap类向请求域中添加数据");System.out.println(modelMap.getClass().getName());//返回逻辑视图return "ok";}
<body><div th:text="${testData}"></div>

Model、Map、ModelMap三者关系 

通过输出结果可以看出,无论是Model、Map还是ModelMap,底层实例化的对象都是:BindingAwareModelMap。

* 表面上使用了不同的类不同的接口进行创建对象,实际上都使用同一个对象org.springframework.validation.support.BindingAwareModelMap

SpringMVC之所以提供了这些方式,目的就是方便程序员的使用,提供了多样化的方式,可见它的重要性。

 5. 使用ModelAndView类

在SpringMVC框架中为了更好的体现MVC架构模式,提供了一个类:ModelAndView。这个类的实例封装了Model和View。也就是说这个类既封装业务处理之后的数据,也体现了跳转到哪个视图。使用它也可以完成request域数据共享。 

    <a th:href="@{/testServletModelAndView}">ModelAndView类向请求域中添加数据</a> <hr>
//方法五:通过ModelAndView类向请求域中添加数据//该写法不需要在方法中传递参数ModelAndView/*** * 方法的返回值类型不是String,而是ModelAndView对象。* * ModelAndView不是出现在方法的参数位置,而是在方法体中new的。* * 需要调用addObject向域中存储数据。* * 需要调用setViewName设置视图的名字。* */@RequestMapping("/testServletModelAndView")public ModelAndView tesModelAndView() {//创建ModeAndView类对象ModelAndView modelAndView = new ModelAndView();//向请求域中添加数据modelAndView.addObject("testData", "测试使用ModeAndView类向请求域中添加数据");//绑定视图(绑定逻辑视图名称)modelAndView.setViewName("ok");//返回ModelAndView对象return modelAndView;}
<body><div th:text="${testData}"></div>

 总结

* 对于处理器方法:不论是调用Model接口、Map接口、ModelMap类还是ModelAndView类最终调用结束后都会返回一个ModelAndView对象
* 该ModelAndView对象给最终会返回给DispatcherServlet类
*
* 当请求路径不是JSP时都会走前端控制器DispatcherServlet,前端控制器都会调用一个核心方法doDispatcher(),
* 这个方法会找到对应的处理器执行对应的处理方法,处理器最终会返回一个逻辑视图(或者ModelAndView对象)
* 最终会将逻辑视图封装成View对象,再将View对象和Model对象封装成ModelAndView对象进行返回

 3. session域对象

在SpringMVC中使用session域共享数据,实现方式有多种,其中比较常见的两种方式:

1. 使用原生Servlet API
2. 使用SessionAttributes注解

1. 使用原生Servlet API  

@Controller
public class SessionScopeTestController {@RequestMapping("/testSessionScope1")public String testServletAPI(HttpSession session) {// 向会话域中存储数据session.setAttribute("testSessionScope1", "使用原生Servlet API实现session域共享数据");return "view";}}

 2. 使用@SessionAttributes注解 

<h1>向Session会话域存数据</h1><a th:href="@{/testSessionModel}">Model接口向Session会话域添加数据</a> <hr>
@Controller
//向session里面存数据只需加多一个注解@SessionAttributes
@SessionAttributes(value = {"testSessionData"})
public class SessionController {//向session域存数据@RequestMapping(value = "/testSessionModel")public String testSessionController(Model model) {model.addAttribute("testSessionData", "通过model方式向session域里面存数据");return "ok";}
}
    <div th:text="${session.testSessionData}"></div>

4. application域对象

在SpringMVC实现application域数据共享,最常见的方案就是直接使用Servlet API了: 

  <h1>向Application应用域存数据</h1><a th:href="@{/testApplicationServlet}">Application应用域一般都是用原生Servlet的API进行操作</a>
@Controller
public class ApplicationController {@RequestMapping("/testApplicationServlet")public String testApplication(HttpServletRequest request) {//获取应用域对象ServletContext application = request.getServletContext();//通过应用域对象进行存储数据application.setAttribute("testApplication", "向应用域存储数据");//返回逻辑视图return "ok";}
}
    <div th:text="${application.testApplication}"></div>

相关文章:

SpringMVC:向三大域对象存数据

1. 简介 Servlet中的三个域对象 请求域&#xff1a;request会话域&#xff1a;session应用域&#xff1a;application 主要是通过&#xff1a;setAttribute getAttribute方法来完成在域中数据的传递和共享。 点击跳转Servlet详细概念 // 向域中存储数据 void setAttribute(St…...

如何用python做一个用户登录界面——浔川python社

1 需解决的问题&#xff1a; 1.1如何用python做一个用户登录界面&#xff1f; 1.2需要用到哪些库、模块&#xff1f; 2 问题解决&#xff1a; 2.1 回答 1.1 &#xff1a;合理即可&#xff0c;无标准回答。 2.2 回答 1.2 &#xff1a;tk库&#xff08;缩写&#xff09;、GUL界面…...

Python知识点9---推导式

提前说一点&#xff1a;如果你是专注于Python开发&#xff0c;那么本系列知识点只是带你入个门再详细的开发点就要去看其他资料了&#xff0c;而如果你和作者一样只是操作其他技术的Python API那就足够了。 Python提供的推导式&#xff0c;只对列表、字典、集合三种数据类型生…...

用C++做一个跑酷游戏

要用C创建一个跑酷游戏是一个相对复杂的任务&#xff0c;因为它涉及到图形渲染、用户输入处理、物理模拟等多个方面。由于C本身并不直接支持图形渲染&#xff0c;我们通常需要使用一个图形库来帮助我们实现这一点。 一个常用的选择是使用SFML&#xff08;Simple and Fast Mult…...

基于字典树可视化 COCA20000 词汇

COCA20000 是美国当代语料库中最常见的 20000 个词汇&#xff0c;不过实际上有一些重复&#xff0c;去重之后大概是 17600 个&#xff0c;这些单词是很有用&#xff0c;如果能掌握这些单词&#xff0c;相信会对英语的能力有一个较大的提升。我很早就下载了这些单词&#xff0c;…...

TypeScript 中的命名空间

1. 命名空间的概念 命名空间是 TypeScript 提供的一种组织代码的方式&#xff0c;它类似于其他编程语言中的模块化系统&#xff0c;但有一些不同之处。命名空间可以包含变量、函数、类等&#xff0c;并且可以嵌套使用&#xff0c;从而更好地组织和管理代码。 2. 定义命名空间…...

[C++] 小游戏 斗破苍穹 2.2.1至2.11.5全部版本(上) zty出品

大家好,今天zty整合了斗破苍穹2.2.1到2.11.5的所有版本 我这么辛苦,就要50个赞吧 2.2.1 #include<stdio.h> #include<ctime> #include<time.h> //suiji #include<windows.h> //SLEEP函数 struct Player //玩家结构体,并初始化player { char name[…...

单元测试的心法分享

大家好&#xff0c;我是G探险者&#xff01; 今天我们简单聊聊单元测试的哪些事儿~ 两天时间我玩明白了单元测试的套路。 这里我分享一下思路。 在我眼里单元测试室什么&#xff1f; 请看这张草图&#xff1a; 单元测试主要关注单个代码单元&#xff08;通常是类或方法&am…...

【python】多线程(3)queue队列之不同延时时长的参数调用问题

链接1&#xff1a;【python】多线程&#xff08;笔记&#xff09;&#xff08;1&#xff09; 链接2&#xff1a;【python】多线程&#xff08;笔记&#xff09;&#xff08;2&#xff09;Queue队列 0.问题描述 两个线程&#xff0c;但是不同延时时长&#xff0c;导致数据输出…...

Java开发常见基础问题

Java开发的多个方面&#xff0c;包括但不限于Java基础知识、多线程并发、JVM、框架使用、数据库、设计模式、网络编程等。 以下是一些常见的问题以及回答的方向&#xff1a; Java 开发技术常见问题&#xff08;一&#xff09; Java 基础知识 对象和类的区别是什么&#xff1…...

大数据组件doc

1.flink Apache Flink Documentation | Apache Flink 2.kafka Apache Kafka 3.hbase Apache HBase ™ Reference Guide 4.zookeeper ZooKeeper: Because Coordinating Distributed Systems is a Zoo 5.spark Overview - Spark 3.5.1 Documentation 6.idea组件&#xff08;…...

Docker Hub 国内镜像源配置

Docker Hub 国内镜像源配置 Docker Hub 国内镜像源是指在国内境内提供 Docker 镜像服务的镜像源。由于国际网络带宽等问题&#xff0c;国内用户下载 Docker 镜像通常速度较慢。因此&#xff0c;为了解决这个问题&#xff0c;一些国内的公司和组织提供了 Docker 镜像的国内镜像…...

持续总结中!2024年面试必问 20 道 Kafka面试题(一)

一、Kafka 的基础概念有哪些&#xff1f; Kafka 是一个分布式流处理平台&#xff0c;由 LinkedIn 开发&#xff0c;并于 2011 年成为 Apache 软件基金会的一部分。以下是 Kafka 的一些基础概念&#xff1a; Broker: Kafka 集群由多个 Broker 组成&#xff0c;每个 Broker 存储…...

Linux共享内存创建和删除

最近项目中使用到了共享内存记录下 创建共享内存: 删除共享内存: 代码: #include <stdio.h> #include <stdlib.h> #include <string.h> #include <fcntl.h> #include <sys/mman.h> #include <sys/stat.h> #include <u…...

微信小程序如何自定义tabbar

微信小程序自定义底部tabbar是一个提升用户体验和增加小程序个性化的重要功能。以下是自定义底部tabbar的步骤&#xff0c;以供参考&#xff1a; 一、自定义tabbar的重要性 微信小程序默认的底部导航栏&#xff08;tabbar&#xff09;样式和布局是固定的&#xff0c;开发者无…...

【并发程序设计】15.信号灯(信号量)

15.信号灯(信号量) Linux中的信号灯即信号量是一种用于进程间同步或互斥的机制&#xff0c;它主要用于控制对共享资源的访问。 在Linux系统中&#xff0c;信号灯作为一种进程间通信&#xff08;IPC&#xff09;的方式&#xff0c;与其他如管道、FIFO或共享内存等IPC方式不同&…...

【操作与配置】VS2017与MFC环境配置

【操作与配置】VS2017与MFC环境配置 概述 Visual Studio 是一款强大且多功能的集成开发环境&#xff08;IDE&#xff09;&#xff0c;适用于软件开发人员和团队。使用此应用程序&#xff0c;您可以构建和调试现代Web应用程序&#xff0c;并利用扩展帮助探索几乎任何编程语言。…...

遥感影像信息提取

刘老师&#xff08;副教授&#xff09;&#xff0c;来自双一流重点高校&#xff0c;长期从事GIS/RS/3S技术及其生态环境领域中的应用等方面的研究和教学工作&#xff0c;并参与GIS的二次开发&#xff0c;发表多篇sci论文&#xff0c;具有资深的技术底蕴和专业背景。 专题一&am…...

LRU算法

文章目录 LRU算法LRU 如何实现LinkedHashMap来实现的LRU算法的缓存HashMap实现LRU算法的缓存 LRU算法 LRU&#xff08;Least Recently Used&#xff09;算法可以使用哈希表和双向链表来实现。哈希表用于快速查找数据&#xff0c;双向链表用于记录数据的访问顺序。以下是LRU算法…...

JVM运行时数据区 - 程序计数器

运行时数据区 Java虚拟机在执行Java程序的过程中&#xff0c;会把它管理的内存划分成若干个不同的区域&#xff0c;这些区域有各自的用途、创建及销毁时间&#xff0c;有些区域随着虚拟机的启动一直存在&#xff0c;有些区域则随着用户线程的启动和结束而建立和销毁&#xff0…...

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器的上位机配置操作说明

LBE-LEX系列工业语音播放器|预警播报器|喇叭蜂鸣器专为工业环境精心打造&#xff0c;完美适配AGV和无人叉车。同时&#xff0c;集成以太网与语音合成技术&#xff0c;为各类高级系统&#xff08;如MES、调度系统、库位管理、立库等&#xff09;提供高效便捷的语音交互体验。 L…...

简易版抽奖活动的设计技术方案

1.前言 本技术方案旨在设计一套完整且可靠的抽奖活动逻辑,确保抽奖活动能够公平、公正、公开地进行,同时满足高并发访问、数据安全存储与高效处理等需求,为用户提供流畅的抽奖体验,助力业务顺利开展。本方案将涵盖抽奖活动的整体架构设计、核心流程逻辑、关键功能实现以及…...

IGP(Interior Gateway Protocol,内部网关协议)

IGP&#xff08;Interior Gateway Protocol&#xff0c;内部网关协议&#xff09; 是一种用于在一个自治系统&#xff08;AS&#xff09;内部传递路由信息的路由协议&#xff0c;主要用于在一个组织或机构的内部网络中决定数据包的最佳路径。与用于自治系统之间通信的 EGP&…...

学校招生小程序源码介绍

基于ThinkPHPFastAdminUniApp开发的学校招生小程序源码&#xff0c;专为学校招生场景量身打造&#xff0c;功能实用且操作便捷。 从技术架构来看&#xff0c;ThinkPHP提供稳定可靠的后台服务&#xff0c;FastAdmin加速开发流程&#xff0c;UniApp则保障小程序在多端有良好的兼…...

质量体系的重要

质量体系是为确保产品、服务或过程质量满足规定要求&#xff0c;由相互关联的要素构成的有机整体。其核心内容可归纳为以下五个方面&#xff1a; &#x1f3db;️ 一、组织架构与职责 质量体系明确组织内各部门、岗位的职责与权限&#xff0c;形成层级清晰的管理网络&#xf…...

从零开始打造 OpenSTLinux 6.6 Yocto 系统(基于STM32CubeMX)(九)

设备树移植 和uboot设备树修改的内容同步到kernel将设备树stm32mp157d-stm32mp157daa1-mx.dts复制到内核源码目录下 源码修改及编译 修改arch/arm/boot/dts/st/Makefile&#xff0c;新增设备树编译 stm32mp157f-ev1-m4-examples.dtb \stm32mp157d-stm32mp157daa1-mx.dtb修改…...

uniapp微信小程序视频实时流+pc端预览方案

方案类型技术实现是否免费优点缺点适用场景延迟范围开发复杂度​WebSocket图片帧​定时拍照Base64传输✅ 完全免费无需服务器 纯前端实现高延迟高流量 帧率极低个人demo测试 超低频监控500ms-2s⭐⭐​RTMP推流​TRTC/即构SDK推流❌ 付费方案 &#xff08;部分有免费额度&#x…...

莫兰迪高级灰总结计划简约商务通用PPT模版

莫兰迪高级灰总结计划简约商务通用PPT模版&#xff0c;莫兰迪调色板清新简约工作汇报PPT模版&#xff0c;莫兰迪时尚风极简设计PPT模版&#xff0c;大学生毕业论文答辩PPT模版&#xff0c;莫兰迪配色总结计划简约商务通用PPT模版&#xff0c;莫兰迪商务汇报PPT模版&#xff0c;…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

Vue ③-生命周期 || 脚手架

生命周期 思考&#xff1a;什么时候可以发送初始化渲染请求&#xff1f;&#xff08;越早越好&#xff09; 什么时候可以开始操作dom&#xff1f;&#xff08;至少dom得渲染出来&#xff09; Vue生命周期&#xff1a; 一个Vue实例从 创建 到 销毁 的整个过程。 生命周期四个…...