企业级信息系统开发讲课笔记4.11 Spring Boot中Spring MVC的整合支持
文章目录
- 零、学习目标
- 一、Spring MVC 自动配置
- (一)自动配置概述
- (二)Spring Boot整合Spring MVC 的自动化配置功能特性
- 二、Spring MVC 功能拓展实现
- (一)创建Spring Boot项目 - SpringMvcDemo2021
- (二)改造当前项目 - 移植上一讲项目的内容
- (三)写MVC配置文件,定义视图跳转
- 1、注释掉登录控制器toLoginPage()方法上的注解
- 2、创建自定义MVC配置类 - MyMvcConfig
- 3、修改登录页面,注释掉显示年份的代码
- 3、启动应用,测试效果
- (四)编写拦截器,让登录页面显示年份
- 1、创建自定义拦截器 - MyInterceptor
- 2、在自定义MVC配置类里加载自定义拦截器
- 3、修改登录页面,取消显示年份的注释
- 4、启动应用,测试效果
- (五)编写登录拦截器,防止非登录用户查看全部用户信息
- 1、还原登录控制器中的toLoginPage方法的注解
- 2、在自定义MVC配置中注释掉相应的视图控制器
- 3、在登录控制里修改login()方法
- 4、在自定义拦截器里重写preHandle()方法
- 5、在自定义MVC配置文件里排除不能拦截的路径
- 6、启动应用,测试效果
- 三、课后拓展练习
- 1、改造用户实体类,添加password字段
- 2、把session中保存的user字符串改造成user对象
- 3、使用JPA等方式把用户保存到数据库中,使用数据库查询用户信息后进行登录判断
零、学习目标
- 了解Spring Boot中Spring MVC自动配置
- 掌握Spring Boot中Spring MVC功能扩展和定制
在Web开发中,会涉及到静态资源的访问支持、视图解析器的配置、转换器和格式化器的定制、文件上传下载等功能,甚至还需要考虑到与Web服务器关联的Servlet相关组件的定制,Spring Boot框架支持整合一些常用Web框架从而实现Web开发,并默认支持Web开发中的一些通用功能。
一、Spring MVC 自动配置
(一)自动配置概述
在Spring Boot项目中,一旦引入了Web依赖启动器spring-boot-starter-web,那么Spring Boot整合Spring MVC框架默认实现的一些XxxAutoConfiguration自动配置类就会自动生效,几乎可以在无任何额外配置的情况下进行Web开发。
(二)Spring Boot整合Spring MVC 的自动化配置功能特性
- 内置了两个视图解析器:
ContentNegotiatingViewResolver和BeanNameViewResolver; - 支持静态资源以及
WebJars; - 自动注册了转换器和格式化器;
- 支持Http消息转换器;
- 自动注册了消息代码解析器;
- 支持静态项目首页
index.html; - 支持定制应用图标
favicon.ico; - 自动初始化Web数据绑定器
ConfigurableWebBindingInitializer。
二、Spring MVC 功能拓展实现

(一)创建Spring Boot项目 - SpringMvcDemo2021
- 使用Spring Initializr方式创建Spring Boot项目,并在Dependencies依赖选择中选择Web依赖启动器和Thymeleaf依赖启动器




(二)改造当前项目 - 移植上一讲项目的内容
-
复制第10讲案例【Thymeleaf18N】的html模板文件,国际化配置文件,全局配置文件和相关Java文件(除入口文件)到当前项目的相应位置

-
启动应用,查看是否成功

-
访问登录页面 - http://localhost:8080/toLoginPage

-
访问显示全部用户页面 - http://localhost:8080/allUsers

(三)写MVC配置文件,定义视图跳转
1、注释掉登录控制器toLoginPage()方法上的注解

2、创建自定义MVC配置类 - MyMvcConfig
- 实现接口WebMvcConfigurer,并重写addViewControllers方法


package net.hw.lesson11.config;import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;/*** 功能:自定义MVC配置类* 作者:华卫* 日期:2021年05月26日*/
@Configuration // 配置类
public class MyMvcConfig implements WebMvcConfigurer {/*** 添加视图控制器* * @param registry*/@Overridepublic void addViewControllers(ViewControllerRegistry registry) {// 通过login.html访问时,直接跳转到login逻辑视图对应的页面,即login.html页面registry.addViewController("login.html").setViewName("login");// 通过toLoginPage访问时,也直接跳转到login逻辑视图对应的页面,即login.html页面registry.addViewController("toLoginPage").setViewName("login");}
}
- 注意:自定义MVC配置类一定要添加注解
@Configuration - 说明:toLoginPage()方法里通过model设置了属性
currentYear,会在跳转到登录页面传递给前端,但是直接通过刚才定义的视图控制器来跳转,就没有数据的传递,因此,得修改登录页面代码,暂时不要显示年份,以免程序报错。
3、修改登录页面,注释掉显示年份的代码

3、启动应用,测试效果
-
访问
http://localhost:8080/toLoginPage

-
访问
http://localhost:8080/login.html

-
两种方式都可跳转到login.html页面,当然此时都没有显示年份。
(四)编写拦截器,让登录页面显示年份
拦截器作用,就是在访问请求前或后进行相关的处理,比如访问资源前判断用户是否登录,如果登录则可以访问,否则不能进行访问。本案例是在访问请求后获取当年年份数据,带到登录页面去显示出来。
1、创建自定义拦截器 - MyInterceptor
- 实现接口HandlerInterceptor,并实现postHandle()方法


- 说明:请求前要处理就得重写preHandle()方法,请求后要处理就得重写postHandle()方法,请求完成之后要处理就得重写afterCompletion()方法
package net.hw.lesson11.interceptor;import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.util.Calendar;/*** 功能:自定义拦截器* 作者:华卫* 日期:2021年05月26日*/
@Component
public class MyInterceptor implements HandlerInterceptor {@Overridepublic void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {request.setAttribute("currentYear", Calendar.getInstance().get(Calendar.YEAR)); }
}
2、在自定义MVC配置类里加载自定义拦截器
- 在MyMvcConfig重写addInterceptors()方法,加载自定义拦截器

3、修改登录页面,取消显示年份的注释

- 编译会报错,说无法解析
currentYear,不用管它,因为数据不是来自控制器,而是来自拦截器,要运行时请求后才能获取数据,因此编译会报错。
4、启动应用,测试效果
- 访问
http://localhost:8080/toLoginPage

- 访问
http://localhost:8080/login.html

- 两种方式都可以显示出年份,说明自定义拦截器中的postHandle()生效了。
(五)编写登录拦截器,防止非登录用户查看全部用户信息
- 要求未登录用户不能查看用户信息,但是定义拦截器前,通过路径
http://localhost:8080/allUsers是可以看到所有用户信息的。

1、还原登录控制器中的toLoginPage方法的注解

2、在自定义MVC配置中注释掉相应的视图控制器

3、在登录控制里修改login()方法

4、在自定义拦截器里重写preHandle()方法

- 拦截非登录用户,直接重定向到登录页面,强制其登录
5、在自定义MVC配置文件里排除不能拦截的路径

6、启动应用,测试效果

- 未登录前,访问
http://localhost:8080/allUsers,直接跳转到登录页面。登录成功后,才可以查看全部用户信息。
三、课后拓展练习
1、改造用户实体类,添加password字段
2、把session中保存的user字符串改造成user对象
3、使用JPA等方式把用户保存到数据库中,使用数据库查询用户信息后进行登录判断
相关文章:
企业级信息系统开发讲课笔记4.11 Spring Boot中Spring MVC的整合支持
文章目录 零、学习目标一、Spring MVC 自动配置(一)自动配置概述(二)Spring Boot整合Spring MVC 的自动化配置功能特性 二、Spring MVC 功能拓展实现(一)创建Spring Boot项目 - SpringMvcDemo2021ÿ…...
chatgpt赋能python:Python安装EGG——一个简单的指南
Python安装EGG——一个简单的指南 如果你使用Python有一段时间了,你可能会遇到需要安装扩展包(Package)的情况。在Python中,这些扩展包的文件格式通常是.egg(Easy Installable GZip)。在本文中,…...
Web前端-React学习
React基础 React 概述 React 是一个用于构建用户界面的JavaScript库。 用户界面: HTML页面(前端) React主要用来写HTML页面, 或构建Web应用 如果从MVC的角度来看,React仅仅是视图层(V),也就…...
【Rust项目实战】sensleak,扫描 Git 仓库中的敏感信息
github仓库:https://github.com/open-rust-initiative/sensleak-rs Rust是一门神奇的编程语言,它提供了内存安全、零成本抽象、并发安全等特性,使开发人员能够编写高性能、高抽象和安全的代码。 这是我用rust开发的第一个工作,希望…...
搭建一个定制版New Bing吧
项目介绍 项目地址:https://github.com/adams549659584/go-proxy-bingai 引用项目简介:用 Vue3 和 Go 搭建的微软 New Bing 演示站点,拥有一致的 UI 体验,支持 ChatGPT 提示词,国内可用,国内可用ÿ…...
使用AIGC工具提升论文阅读效率
大家好,我是herosunly。985院校硕士毕业,现担任算法研究员一职,热衷于机器学习算法研究与应用。曾获得阿里云天池比赛第一名,CCF比赛第二名,科大讯飞比赛第三名。拥有多项发明专利。对机器学习和深度学习拥有自己独到的见解。曾经辅导过若干个非计算机专业的学生进入到算法…...
本周大新闻|Vision Pro头显重磅发布;苹果收购AR厂商Mira
本周XR大新闻,上周Quest 3发布之后,本周苹果MR头显Vision Pro正式发布,也是本周AR/VR新闻的重头戏。 AR方面,苹果发布VST头显Vision Pro(虽然本质是台VR,但以AR场景为核心)以及visionOS&…...
在Spring Boot微服务使用JedisCluster操作Redis集群String字符串
记录:449 场景:在Spring Boot微服务使用JedisCluster操作Redis集群的String字符串数据类型。 版本:JDK 1.8,Spring Boot 2.6.3,redis-6.2.5,jedis-3.7.1。 1.微服务中配置Redis信息 1.1在pom.xml添加依赖 pom.xml文件: <…...
5.1 合并数据
5.1 合并数据 5.1.1 堆叠合并数据1、横向堆叠 concat()2、纵向堆叠 concat()和append() 5.1.2 主键合并数据 merge()和join()5.1.3 重叠合并数据 combine_first() 5.1.1 堆叠合并数据 堆叠就是简单地把两个表拼在一起,也被称作轴向连接、绑定或连接。依照连接轴的方…...
华为OD机试真题 JavaScript 实现【求解立方根】【牛客练习题】
一、题目描述 计算一个浮点数的立方根,不使用库函数。保留一位小数。 数据范围:∣val∣≤20 。 二、输入描述 待求解参数,为double类型(一个实数) 三、输出描述 输出参数的立方根。保留一位小数。 四、解题思路…...
初探BERTPre-trainSelf-supervise
初探Bert 因为一次偶然的原因,自己有再次对Bert有了一个更深层地了解,特别是对预训练这个概念,首先说明,自己是看了李宏毅老师的讲解,这里只是尝试进行简单的总结复述并加一些自己的看法。 说Bert之前不得不说现在的…...
Ficus 第二弹,突破限制器的 Markdown 编辑管理软件!
大家好,我们是 ggG 团队,我们开发的 markdown 笔记管理软件 Ficus Beta 版本正式发布了。详情可以见我们官网,也可以来我们仓库查看。 相对于 Alpha 版本(可以在我们之前的博客中查看),主要有 3 点明显的提…...
基于Springboot+vue+协同过滤+前后端分离+鲜花商城推荐系统(用户,多商户,管理员)+全套视频教程
基于Springbootvue协同过滤前后端分离鲜花商城推荐系统(用户,多商户,管理员)(毕业论文11000字以上,共33页,程序代码,MySQL数据库) 代码下载: 链接:https://pan.baidu.com/s/1mf2rsB_g1DutFEXH0bPCdA 提取码:8888 【运行环境】Idea JDK1.8 Maven MySQL…...
MixQuery系列(一):多数据源混合查询引擎调研
背景 存储情况 当前的存储引擎可谓百花齐放,层出不穷。为什么会这样了?因为不存在One for all的存储,不同的存储总有不同的存储的优劣和适用场景。因此,在实际的业务场景中,不同特点的数据会存储到不同的存储引擎里。 业务挑战 然而异构的存储和数据源,却给分析查询带…...
d2l学习——第一章Introduction
x.0 环境配置 使用d2l库,安装如下: conda create --name d2l python3.9 -y conda activate d2lpip install torch1.12.0 torchvision0.13.0 pip install d2l1.0.0b0mkdir d2l-en && cd d2l-en curl https://d2l.ai/d2l-en.zip -o d2l-en.zip u…...
【python】【Word】用正则表达式匹配正文中的标题(未使用样式)并通过win32com指定相应样式
标题的格式 二级标题: 数字.数字. 文字 三级标题:数字.数字.数字 文字 python代码 使用方法 只保留一个需要应用的WORD文档运行程序,逐行匹配 使用效果 代码 import win32com.client import redef compile_change_Word_titlestyle():#…...
Matlab实现光伏仿真(附上完整仿真源码)
光伏发电电池模型是描述光伏电池在不同条件下产生电能的数学模型。该模型可以用于预测光伏电池的输出功率,并为优化光伏电池系统设计和控制提供基础。本文将介绍如何使用Matlab实现光伏发电电池模型。 文章目录 1、光伏发电电池模型2、使用Matlab实现光伏发电电池模…...
JVM零基础到高级实战之Java内存区域方法区
JVM零基础到高级实战之Java内存区域方法区 JVM零基础到高级实战之Java内存区域方法区 文章目录 JVM零基础到高级实战之Java内存区域方法区前言JVM内存模型之JAVA方法区总结 前言 JVM零基础到高级实战之Java内存区域方法区 JVM内存模型之JAVA方法区 JAVA方法区是什么…...
SpringCloud-stream一体化MQ解决方案-消费者组
参考资料: 参考demo 参考视频1 参考视频2 官方文档(推荐) 官方文档中文版 关于Kafka和rabbitMQ的安装教程,见本人之前的博客 rocketMq的安装教程 rocketMq仪表盘安装教程 重!!!...
HNU计算机图形学-作业二
HNU计算机图形学-作业二 作业二:纹理和照明前言介绍实施详细信息任务1:加载复杂对象任务2:纹理映射和照明任务3:互动活动和动画额外任务:增强场景的视觉效果(最高20%) 最终实现效果 作业二&…...
网络编程(Modbus进阶)
思维导图 Modbus RTU(先学一点理论) 概念 Modbus RTU 是工业自动化领域 最广泛应用的串行通信协议,由 Modicon 公司(现施耐德电气)于 1979 年推出。它以 高效率、强健性、易实现的特点成为工业控制系统的通信标准。 包…...
Lombok 的 @Data 注解失效,未生成 getter/setter 方法引发的HTTP 406 错误
HTTP 状态码 406 (Not Acceptable) 和 500 (Internal Server Error) 是两类完全不同的错误,它们的含义、原因和解决方法都有显著区别。以下是详细对比: 1. HTTP 406 (Not Acceptable) 含义: 客户端请求的内容类型与服务器支持的内容类型不匹…...
Mybatis逆向工程,动态创建实体类、条件扩展类、Mapper接口、Mapper.xml映射文件
今天呢,博主的学习进度也是步入了Java Mybatis 框架,目前正在逐步杨帆旗航。 那么接下来就给大家出一期有关 Mybatis 逆向工程的教学,希望能对大家有所帮助,也特别欢迎大家指点不足之处,小生很乐意接受正确的建议&…...
FastAPI 教程:从入门到实践
FastAPI 是一个现代、快速(高性能)的 Web 框架,用于构建 API,支持 Python 3.6。它基于标准 Python 类型提示,易于学习且功能强大。以下是一个完整的 FastAPI 入门教程,涵盖从环境搭建到创建并运行一个简单的…...
【第二十一章 SDIO接口(SDIO)】
第二十一章 SDIO接口 目录 第二十一章 SDIO接口(SDIO) 1 SDIO 主要功能 2 SDIO 总线拓扑 3 SDIO 功能描述 3.1 SDIO 适配器 3.2 SDIOAHB 接口 4 卡功能描述 4.1 卡识别模式 4.2 卡复位 4.3 操作电压范围确认 4.4 卡识别过程 4.5 写数据块 4.6 读数据块 4.7 数据流…...
spring:实例工厂方法获取bean
spring处理使用静态工厂方法获取bean实例,也可以通过实例工厂方法获取bean实例。 实例工厂方法步骤如下: 定义实例工厂类(Java代码),定义实例工厂(xml),定义调用实例工厂ÿ…...
Keil 中设置 STM32 Flash 和 RAM 地址详解
文章目录 Keil 中设置 STM32 Flash 和 RAM 地址详解一、Flash 和 RAM 配置界面(Target 选项卡)1. IROM1(用于配置 Flash)2. IRAM1(用于配置 RAM)二、链接器设置界面(Linker 选项卡)1. 勾选“Use Memory Layout from Target Dialog”2. 查看链接器参数(如果没有勾选上面…...
Cloudflare 从 Nginx 到 Pingora:性能、效率与安全的全面升级
在互联网的快速发展中,高性能、高效率和高安全性的网络服务成为了各大互联网基础设施提供商的核心追求。Cloudflare 作为全球领先的互联网安全和基础设施公司,近期做出了一个重大技术决策:弃用长期使用的 Nginx,转而采用其内部开发…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
关于 WASM:1. WASM 基础原理
一、WASM 简介 1.1 WebAssembly 是什么? WebAssembly(WASM) 是一种能在现代浏览器中高效运行的二进制指令格式,它不是传统的编程语言,而是一种 低级字节码格式,可由高级语言(如 C、C、Rust&am…...
