企业级信息系统开发讲课笔记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%) 最终实现效果 作业二&…...
C++_核心编程_多态案例二-制作饮品
#include <iostream> #include <string> using namespace std;/*制作饮品的大致流程为:煮水 - 冲泡 - 倒入杯中 - 加入辅料 利用多态技术实现本案例,提供抽象制作饮品基类,提供子类制作咖啡和茶叶*//*基类*/ class AbstractDr…...
CVPR 2025 MIMO: 支持视觉指代和像素grounding 的医学视觉语言模型
CVPR 2025 | MIMO:支持视觉指代和像素对齐的医学视觉语言模型 论文信息 标题:MIMO: A medical vision language model with visual referring multimodal input and pixel grounding multimodal output作者:Yanyuan Chen, Dexuan Xu, Yu Hu…...
NLP学习路线图(二十三):长短期记忆网络(LSTM)
在自然语言处理(NLP)领域,我们时刻面临着处理序列数据的核心挑战。无论是理解句子的结构、分析文本的情感,还是实现语言的翻译,都需要模型能够捕捉词语之间依时序产生的复杂依赖关系。传统的神经网络结构在处理这种序列依赖时显得力不从心,而循环神经网络(RNN) 曾被视为…...
tree 树组件大数据卡顿问题优化
问题背景 项目中有用到树组件用来做文件目录,但是由于这个树组件的节点越来越多,导致页面在滚动这个树组件的时候浏览器就很容易卡死。这种问题基本上都是因为dom节点太多,导致的浏览器卡顿,这里很明显就需要用到虚拟列表的技术&…...
Springboot社区养老保险系统小程序
一、前言 随着我国经济迅速发展,人们对手机的需求越来越大,各种手机软件也都在被广泛应用,但是对于手机进行数据信息管理,对于手机的各种软件也是备受用户的喜爱,社区养老保险系统小程序被用户普遍使用,为方…...
HarmonyOS运动开发:如何用mpchart绘制运动配速图表
##鸿蒙核心技术##运动开发##Sensor Service Kit(传感器服务)# 前言 在运动类应用中,运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据,如配速、距离、卡路里消耗等,用户可以更清晰…...
LINUX 69 FTP 客服管理系统 man 5 /etc/vsftpd/vsftpd.conf
FTP 客服管理系统 实现kefu123登录,不允许匿名访问,kefu只能访问/data/kefu目录,不能查看其他目录 创建账号密码 useradd kefu echo 123|passwd -stdin kefu [rootcode caozx26420]# echo 123|passwd --stdin kefu 更改用户 kefu 的密码…...
elementUI点击浏览table所选行数据查看文档
项目场景: table按照要求特定的数据变成按钮可以点击 解决方案: <el-table-columnprop"mlname"label"名称"align"center"width"180"><template slot-scope"scope"><el-buttonv-if&qu…...
Java数组Arrays操作全攻略
Arrays类的概述 Java中的Arrays类位于java.util包中,提供了一系列静态方法用于操作数组(如排序、搜索、填充、比较等)。这些方法适用于基本类型数组和对象数组。 常用成员方法及代码示例 排序(sort) 对数组进行升序…...
如何通过git命令查看项目连接的仓库地址?
要通过 Git 命令查看项目连接的仓库地址,您可以使用以下几种方法: 1. 查看所有远程仓库地址 使用 git remote -v 命令,它会显示项目中配置的所有远程仓库及其对应的 URL: git remote -v输出示例: origin https://…...
