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

SpringMVC-0308

五、域对象共享数据

0、三个域对象范围

request:一次请求 第1~6都是向request共享

session:一次会话(浏览器开启到浏览器关闭,与服务器关闭无关,session有钝化和活化操作,可以持久化数据)

servletContext:整个应用的范围(服务器开启到服务器关闭)

1、使用ServletAPI向request域对象共享数据

@RequestMapping("/testServletAPI")
public String testServletAPI(HttpServletRequest request){request.setAttribute("testScope", "hello,servletAPI");return "success";
}request域内数据获取方式:<p th:text="${testRequestScope}"></p>

2、使用ModelAndView向request域对象共享数据

这个很重要,因为从源码中看,不过你用的1-6哪一种方式,最终都是封装到modelAndView里面去

@RequestMapping("/testModelAndView")
public ModelAndView testModelAndView(){/*** ModelAndView有Model和View的功能* Model主要用于向请求域共享数据* View主要用于设置视图,实现页面跳转*/ModelAndView mav = new ModelAndView();//向请求域共享数据mav.addObject("testScope", "hello,ModelAndView");//设置视图,实现页面跳转mav.setViewName("success");return mav;
}

3、使用Model向request域对象共享数据

@RequestMapping("/testModel")
public String testModel(Model model){model.addAttribute("testScope", "hello,Model");return "success";
}

4、使用map向request域对象共享数据

@RequestMapping("/testMap")
public String testMap(Map<String, Object> map){map.put("testScope", "hello,Map");return "success";
}

5、使用ModelMap向request域对象共享数据

@RequestMapping("/testModelMap")
public String testModelMap(ModelMap modelMap){modelMap.addAttribute("testScope", "hello,ModelMap");return "success";
}

6、Model、ModelMap、Map的关系

Model、ModelMap、Map类型的参数其实本质上都是 BindingAwareModelMap 类型的

继承关系如下图:

![iShot_2023-03-08_14.55.26](/Users/lannisite/Library/Mobile Documents/com~apple~CloudDocs/Typora笔记/typroa_picture/iShot_2023-03-08_14.55.26.png)

public interface Model{}
public class ModelMap extends LinkedHashMap<String, Object> {}
public class ExtendedModelMap extends ModelMap implements Model {}
public class BindingAwareModelMap extends ExtendedModelMap {}

7、控制器方法统一返回ModelAndView对象

通过打断点的方式运行,调试界面会有一个方法栈,里面的方法直接或间接的调用了我们打断点的那一行代码

在里面找到DispatcherServlet,1061行

mv = ha.handle(processedRequest, response, mappedHandler.getHandler());

8、向session域共享数据

此处建议使用原生ServletAPI,虽然SpringMVC提供了注解@SessionAttribute,这个注解可以将共享在请求域的数据再共享一份到session中,

@RequestMapping("/testSession")
public String testSession(HttpSession session){session.setAttribute("testSessionScope", "hello,session");return "success";
}获取session中数据:
<p th:text="${session.testSessionScope}"></p>

9、向application域共享数据

@RequestMapping("/testApplication")
public String testApplication(HttpSession session){ServletContext application = session.getServletContext();application.setAttribute("testApplicationScope", "hello,application");return "success";
}获取servletContext中数据信息:
<p th:text="${application.testApplicationScope}"></p>

六、SpringMVC的视图

SpringMVC中的视图是View接口,视图的作用渲染数据,将模型Model中的数据展示给用户

SpringMVC视图的种类很多,默认有转发视图和重定向视图

当工程引入jstl的依赖,转发视图会自动转换为JstlView

若使用的视图技术为Thymeleaf,在SpringMVC的配置文件中配置了Thymeleaf的视图解析器,由此视图解析器解析之后所得到的是ThymeleafView

1、ThymeleafView

当控制器方法中所设置的视图名称没有任何前缀时,此时的视图名称会被SpringMVC配置文件中所配置的视图解析器解析,视图名称拼接视图前缀和视图后缀所得到的最终路径,会通过转发的方式实现跳转

@RequestMapping("/testHello")
public String testHello(){return "hello";
}

2、转发视图

SpringMVC中默认的转发视图是InternalResourceView

SpringMVC中创建转发视图的情况:

当控制器方法中所设置的视图名称以"forward:"为前缀时,创建InternalResourceView视图,此时的视图名称不会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀"forward:"去掉,剩余部分作为最终路径通过转发的方式实现跳转

例如"forward:/","forward:/employee"

@RequestMapping("/testForward")
public String testForward(){return "forward:/testHello";
}

![image-20210706201316593](/Users/lannisite/Library/Mobile Documents/com~apple~CloudDocs/Typora笔记/spring学习笔记/Spring5/img/img003.png)

3、重定向视图

SpringMVC中默认的重定向视图是RedirectView

转发和重定向区别:

  • 转发可以获取请求域的数据,但是重定向不可以,因为不是一次请求

  • 转发可以访问WEB-INF下面的资源,但是重定向不可以获取,因为安全性问题

  • 转发不能跨域,但是重定向可以跨域

当控制器方法中所设置的视图名称以"redirect:"为前缀时,创建RedirectView视图,此时的视图名称不会被SpringMVC配置文件中所配置的视图解析器解析,而是会将前缀"redirect:"去掉,剩余部分作为最终路径通过重定向的方式实现跳转

例如"redirect:/","redirect:/employee"

@RequestMapping("/testRedirect")
public String testRedirect(){return "redirect:/testHello";
}

![image-20210706201602267](/Users/lannisite/Library/Mobile Documents/com~apple~CloudDocs/Typora笔记/spring学习笔记/Spring5/img/img004.png)

注:
重定向视图在解析时,会先将redirect:前缀去掉,然后会判断剩余部分是否以/开头,若是则会自动拼接上下文路径

4、视图控制器view-controller

当控制器方法中,仅仅用来实现页面跳转,即只需要设置视图名称时,可以将处理器方法使用view-controller标签进行表示

<!--path:设置处理的请求地址view-name:设置请求地址所对应的视图名称
-->
<mvc:view-controller path="/" view-name="index"></mvc:view-controller><mvc:annotation-driven/>
注:
当SpringMVC中设置任何一个view-controller时,其他控制器中的请求映射将全部失效,此时需要在SpringMVC的核心配置文件中设置开启mvc注解驱动的标签:
<mvc:annotation-driven />

相关文章:

SpringMVC-0308

五、域对象共享数据0、三个域对象范围request&#xff1a;一次请求 第1&#xff5e;6都是向request共享session&#xff1a;一次会话&#xff08;浏览器开启到浏览器关闭&#xff0c;与服务器关闭无关&#xff0c;session有钝化和活化操作&#xff0c;可以持久化数据&#xff0…...

[数据结构]:14-选择排序(顺序表指针实现形式)(C语言实现)

目录 前言 已完成内容 选择排序实现 01-开发环境 02-文件布局 03-代码 01-主函数 02-头文件 03-PSeqListFunction.cpp 04-SortCommon.cpp 05-SortFunction.cpp 结语 前言 此专栏包含408考研数据结构全部内容&#xff0c;除其中使用到C引用外&#xff0c;全为C语言代…...

基于C/C++综合训练 ----- 贪吃蛇

文章目录一、定义结构体对象二、游戏初始化1. 蛇初始化2. 食物初始化3. 围墙初始化4. 界面初始化三、逻辑编程1. 启动游戏2. 打印成绩3. main函数四、细节处理五、程序源码该篇环境为Visual Studio2022 游戏简述 &#xff1a;在控制终端绘画出一个矩阵表示游戏界面(围墙)&…...

Unity 混合操作(Blending)

渲染图形时&#xff0c;在执行所有着色器并应用所有纹理后&#xff0c;像素将写入到屏幕。这些像素与已有像素的组合方式由 Blend 命令控制。用于生成透明对象。《Unity Shader入门精要》大致解释&#xff1a;片元通过了模板测试和深度测试之后&#xff0c;会进行混合步骤。如果…...

Hive建表高阶语句

CTAS -as select方式建表CREATE TABLE ctas_employee as SELECT * FROM employee;CTE (CTAS with Common Table Expression)CREATE TABLE cte_employee AS WITH r1 AS (SELECT name FROM r2 WHERE name Michael), r2 AS (SELECT name FROM employee WHERE gender Male), r3 …...

面向新时代,海泰方圆战略升级!“1465”隆重发布!

过去四年&#xff0c;海泰方圆“1344”战略一直在引领公司前行&#xff0c;搭建了非常坚实的战略框架基座&#xff0c;并推动全员在实践和行动中达成深度共识。 “1344”战略 1个定位&#xff0c;代表着当前机构用户的一组共性需求&#xff0c;密码安全数据治理信创工程。 3…...

带你感受一次JVM调优实战

本文分成两部分&#xff0c;先了解理论&#xff0c;然后再进行实战。 理论篇 1.1 调优目标 JVM调优的两大目标是&#xff1a; 提高应用程序的性能和吞吐量&#xff1a; 通过优化JVM的垃圾回收机制、调整线程池大小和优化代码&#xff0c;可以提高应用程序的性能和吞吐量。…...

ALG和STUN

目录 ALG 应用层网关讲解 Client1使用FTP主动模式建立FTP Client1使用FTP被动模式建立FTP STUN讲解 ALG 应用层网关讲解 用来替换应用层信息 Client1使用FTP主动模式建立FTP 主动模式&#xff1a;服务器收到客户端发来的请求FTP的地址和端口 服务器使用20端口直接向客户端建…...

原生HTML放大镜

该放大区域用背景图片放大 <!DOCTYPE html> <html lang"zh"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><meta http-equiv"X-UA-Compat…...

C++——模板

文章目录1 泛型编程2 函数模板2.1 函数模板概念2.2 函数模板格式2.3 函数模板的实例化2.3.1 隐式实例化2.3.1.1 定义2.3.1.2 代码演示2.3.1.3 运行结果2.3.1.4 缺点2.3.2 显式实例化2.3.2.1 格式2.3.2.2 代码演示2.3.2.3 运行结果2.4 模板参数的匹配原则2.4.12.4.22.4.33 类模板…...

Chapter2.1:线性表基础

该系列属于计算机基础系列中的《数据结构基础》子系列&#xff0c;参考书《数据结构考研复习指导》(王道论坛 组编)&#xff0c;完整内容请阅读原书。 1.线性表的定义和基本操作 1.1 线性表的定义 线性表是具有相同数据类型的n(n≥0)n(n≥0)n(n≥0)个数据元素的有限序列&…...

Spring源码解析-Spring 循环依赖

Spring源码解析简图&#xff1a; Spring 如何解决循环依赖&#xff0c;⽹上的资料很多&#xff0c;但是感觉写得好的极少&#xff0c;特别是源码解读⽅⾯&#xff0c;我就⾃⼰单独出⼀ 篇&#xff0c;这篇⽂章绝对肝&#xff01; 文章目录&#xff1a; 一. 基础知识 1.1 什么…...

从零开始学架构——架构设计的目的

软件架构的历史背景 软件架构真正流行是从20世纪90年代开始的&#xff0c;由于在Rational和Microsoft内部的相关活动&#xff0c;软件架构的概念开始越来越流行。 卡内基梅隆高校的玛丽肖(Mary Shaw)和戴维加兰 (David Garlan)对软件架构做了许多讨论,他们在 1994 年的一篇文章…...

Python 异步: 异步生成器(16)

动动发财的小手&#xff0c;点个赞吧&#xff01; 生成器是 Python 的基本组成部分。生成器是一个至少有一个“yield”表达式的函数。它们是可以暂停和恢复的函数&#xff0c;就像协程一样。 实际上&#xff0c;Python 协程是 Python 生成器的扩展。Asyncio 允许我们开发异步生…...

.net6 web api使用EF Core,根据model类自动生成表

1.安装EF Core和mysql数据库的nuget包 Microsoft.EntityFrameworkCore Pomelo.EntityFrameworkCore.MySql 2.创建models文件夹&#xff0c;在文件夹下创建实体类 public class Users{public int Id { get; set; }[Column(TypeName "varchar(200)"), Required]publ…...

计算机科学导论笔记(五)

目录 七、操作系统 7.1 引言 7.1.1 操纵系统 7.1.2 自举过程 7.2 演化 7.3 组成部分 7.3.1 用户界面 7.3.2 内存管理器 7.3.3 进程管理器 7.3.4 设备管理器 7.3.5 文件管理器 7.4 操作系统 7.4.1 UNIX 7.4.2 Linux 7.4.3 Windows 七、操作系统 7.1 引言 计算机…...

通过命令打Java可执行jar包

文章目录1.背景2.操作步骤2.1. 准备好java源文件2.2 确认java源文件中是否有包名2.3 编译java文件2.4 初步打包2.5 解压jar包&#xff0c;得到MANIFEST.MF文件2.6 修改MANIFEST.MF文件2.7 再次打包3.验证4.打包参数参考5.参考文章1.背景 今天&#xff0c;无意中翻出了N年之前年…...

java基础系列(九) 接口和抽象类

一. 接口 简单的说&#xff0c;接口就是一种被规范的标准&#xff0c;只要符合这个标准都可以通用&#xff0c;接口的表现 在于对行为的抽象. 1.1 创建接口的格式 格式1: public interface 接口名 格式2: interface 接口名 1.2 在JDK1.8之后, 在接口中可以定义实现的方…...

Docker启动问题docker is starting…

环境window 10 家庭最新版直接上官网安装的 Docker DeskTop问题启动应用后setting打开一直转圈圈&#xff1b;主界面一直显示 docker is starting…解决方案3.1 先确定hyper-v是否开启搜hyper-v&#xff0c;点击启动或关闭Windows功能如下,选中Hyper-V服务3.2 进入任务管理期&a…...

Django/Vue实现在线考试系统-03-开发环境搭建-MySQL安装

1.概述 MySQL是一种关系型数据库管理系统,所使用的 SQL 语言是用于访问数据库的最常用标准化语言。MySQL 软件采用了双授权政策,分为社区版和商业版,由于其体积小、速度快、总体拥有成本低,尤其是开放源码这一特点,一般中小型和大型网站的开发都选择 MySQL 作为网站数据库…...

【设计模式】行为型-模板方法模式

文章目录前言一、概念二、核心结构三、Java 代码实现&#xff08;订单支付流程&#xff09;1. 抽象类&#xff08;定义模板&#xff09;2. 具体子类&#xff1a;微信支付3. 具体子类&#xff1a;支付宝支付4. 客户端调用四、钩子方法&#xff08;Hook&#xff09;—— 让模板更…...

OMO·赶考小状元AI自习室:破解线下自习室困局,引领学习新范式

近年来&#xff0c;一个有趣的现象在教培领域悄然发生&#xff1a;传统线下自习室逐渐遇冷&#xff0c;客流量与用户粘性面临挑战&#xff1b;而与此同时&#xff0c;一种名为“AI自习室”的新形态却异军突起&#xff0c;展现出强大的市场吸引力。这背后&#xff0c;并非简单的…...

信号处理学习笔记5:卡尔曼滤波理论

卡尔曼滤波&#xff0c;用直白的话来讲&#xff0c; 就是有多个不确定的结果&#xff0c;经过分析、推理和计算&#xff0c;获得相对准确的结果。 它的核心特点是&#xff1a; 能够预测数据的未来趋势\({x}_{k}^{ }\) 结合当前数据进行修正&#xff0c;使预测更加准确 可以处理…...

PrankWeb 蛋白质配体结合位点预测,超简单使用教程

一、PrankWeb 是什么&#xff1f; PrankWeb 是一个免费的在线蛋白质配体结合位点预测工具&#xff0c;基于机器学习算法 P2Rank。 它能帮你&#xff1a; 预测蛋白质上可能的药物结合口袋&#xff08;pockets&#xff09; 可视化蛋白质的三维结构和结合位点 …...

LabVIEW高手进阶:巧用层叠移位寄存器,轻松实现数据队列与历史状态追踪

LabVIEW高手进阶&#xff1a;巧用层叠移位寄存器实现工业级数据流处理 在工业自动化测试和实时信号处理领域&#xff0c;数据流的连续处理能力往往决定着整个系统的可靠性。传统的数据缓存方案要么消耗过多内存资源&#xff0c;要么引入难以预测的延迟&#xff0c;而LabVIEW中一…...

Java函数计算部署实战:从本地调试到生产环境上线的7个关键步骤(含阿里云/华为云/AWS对比)

第一章&#xff1a;Java函数计算部署全景概览Java函数计算是云原生场景下轻量级、事件驱动型服务的重要实现方式。它将传统Java应用的部署范式从虚拟机/容器迁移至按需执行、自动扩缩的无服务器架构&#xff0c;显著降低运维复杂度与资源闲置成本。开发者只需聚焦业务逻辑&…...

Loop窗口管理工具:如何用径向菜单和智能暂存系统提升Mac多任务效率300%

Loop窗口管理工具&#xff1a;如何用径向菜单和智能暂存系统提升Mac多任务效率300% 【免费下载链接】Loop MacOS窗口管理 项目地址: https://gitcode.com/GitHub_Trending/lo/Loop 在当今多任务工作环境中&#xff0c;Mac用户经常面临窗口管理的挑战。每天在多个应用之间…...

PyTorch Autograd动态计算图实战:从构建、可视化到高效调试

1. 动态计算图的构建原理 PyTorch的Autograd系统最迷人的特性就是它的动态计算图。我第一次接触这个概念时&#xff0c;感觉就像发现了一个魔法黑箱——它能在代码运行时自动记录所有操作&#xff0c;并在需要时反向计算梯度。这种动态特性让PyTorch在调试复杂模型时特别顺手&a…...

ASCII码表深度解析:从基础到扩展的全面指南

1. ASCII码的前世今生&#xff1a;计算机世界的通用语言 第一次接触ASCII码是在大学计算机基础课上&#xff0c;教授用"65A"这个简单公式瞬间点燃了我的好奇心。这个看似简单的编码系统&#xff0c;实际上是现代数字通信的基石。ASCII&#xff08;American Standard …...

OpenClaw 的模型预训练中,是否使用了对比学习与自回归的混合目标?

关于OpenClaw模型预训练中是否使用了对比学习与自回归的混合目标&#xff0c;这个问题其实触及了当前大语言模型训练方法中一个比较核心的演进方向。从公开的技术报告和论文细节来看&#xff0c;OpenClaw的设计思路确实体现了将不同训练目标融合的趋势&#xff0c;但具体到“对…...