Spring Boot管理Spring MVC

Spring Boot真正的核心功能是自动配置和快速整合,通常Spring Boot应用的前端MVC框架依然使用Spring MVC。Spring Boot提供的spring-boot-starter-web启动器嵌入了Spring MVC的依赖,并为Spring MVC提供了大量自动配置,可以适用于大多数Web开发场景。 除了使用自动配置所提供的功能,开发者也可以通过自定义配置类定制Spring MVC的配置。

Spring Boot为Spring MVC自动配置提供的特性

在Spring Boot项目中,一旦引入了Web依赖启动器spring-boot-starter-web,那么Spring Boot整合Spring MVC框架默认实现的一些XxxAutoConfiguration自动配置类就会自动生效,几乎可以在无任何额外配置的情况下进行Web开发。

Spring Boot为Spring MVC提供了自动配置,并在Spring MVC默认功能的基础上添加了以下特性。

(1)引入了视图解析器 ContentNegotiatingViewResolver和BeanNameViewResolver。

(2)为包括WebJars在内的静态资源提供支持。

(3)自动注册 Converter、GenericConverter和Formatter。

(4)支持使用HttpMessageConverters消息转换器。

(5)自动注册 MessageCodesResolver。

(6)支持静态项目首页index.html。

(7)支持定制应用图标favicon.ico。

(8)自动初始化Web数据绑定器ConfigurableWebBindingInitializer。

自定义Spring MVC配置

在Spring Boot应用中使用Spring MVC时,如果希望在为Spring MVC自动配置提供相关特性的同时,再增加一些自定义的Spring MVC配置,例如添加拦截器、视图控制器等,可以通过自定义WebMvcConfigurer类型的配置类来实现。

1.配置静态资源映射

通常Web应用中会需要使用静态资源,例如,JavaScript文件、CSS文件和HTML文件等。单独使用Spring MVC时,导入静态资源文件后,需要配置静态资源的映射,否则无法正常访问。Spring Boot中提供了默认的静态资源映射,当访问项目中任意的静态资源时,Spring Boot会默认从以下路径中从上往下进行查找:

(1)classpath:/META-INF/resources/

(2)classpath:/resources/

(3)classpath:/static/

(4)classpath:/public/

这个查找顺序可以通过源码查看:WebMvcAutoConfiguration--》搜索getStaticLocations--》进入该方法--》寻着轨迹就能找到。

修改静态资源存放位置:

spring.resources.static-locations=字符串数组

例如:

在chapter03项目中的 src/main/resources/static和 src/main/resources目录下分别创建main.html文件和index.html文件,并在项目启动后分别在浏览器中对这两个静态资源进行访问。

如果想访问非默认静态资源文件夹下的资源,可以通过配置类和配置文件2种方式实现自定义静态资源的映射。

(1)通过配置类实现静态资源映射

配置类需要实现WebMvcConfigurer接口,在重写该接口的addResourceHandlers()方法中指定资源访问路径和资源之间的映射关系。

(2)通过配置文件实现静态资源映射

Spring Boot在Spring MVC的自动配置中提供了对应的属性可以配置静态资源访问路径和资源的映射。

下面以通过配置类实现静态资源映射为例,演示配置静态资源映射。

(1)创建静态资源。

在src/main/resources目录下,创建文件夹backend,并在文件夹中创建HTML文件index.html和login.htm。

(2)配置静态资源映射。

在config子包下创建配置类WebMvcConfig,该配置类实现WebMvcConfigurer接口,并重写该接口的方法实现自定义Spring MVC的配置,具体如文件3-11所示。

import  org.springframework.context.annotation.Configuration;
import  org.springframework.web.servlet.config.annotation.
ResourceHandlerRegistry;
import  org.springframework.web.servlet.config.annotation.
WebMvcConfigurer;
@Configuration
public  class  WebMvcConfig implements  WebMvcConfigurer {@Overridepublic  void  addResourceHandlers(ResourceHandlerRegistry registry) {registry.addResourceHandler("/backend/**").addResourceLocations("classpath:/backend/");}}

 (3)测试程序效果。启动项目,在浏览器中访问backend文件夹下的index.html。

2.配置视图控制器

使用Spring MVC默认的配置进行开发时,如果仅实现无业务逻辑的页面跳转,也需要创建Controller类,然后定义方法跳转到页面,操作比较麻烦。对此,可以在视图控制器中添加自定义的映射,直接将请求映射为视图。

下面通过案例演示在视图控制器中配置请求和视图的映射,具体如下。

(1)配置视图控制器映射信息。在文件3-11中重写WebMvcConfigurer接口的addViewControllers()方法,在该方法中添加访问路径和视图的映射。

@Override
public void addViewControllers(ViewControllerRegistry registry) {/*如果在thymeleaf中会出错,因为配置了前缀和后缀,*视图名"/backend/login.html"加上前缀后缀后,这个地址肯定不存在,*直接写逻辑视图名即可*/	    //registry.addViewController("/backend/toLoginPage").setViewName("/backend/login.html");//registry.addViewController("/backend").setViewName("/backend/index.html");//在thymeleaf环境下访问模板页面registry.addViewController("/backend/toLoginPage2").setViewName("login");registry.addViewController("/backend").setViewName("index");
}

(2)测试程序效果。启动项目,在浏览器中访问http://localhost:8080/backend/toLoginPage2。

总结:只适合较为简单的无参数get请求跳转,对于有参数或者需要业务处理的跳转需求,最好采用传统方式。

3.配置拦截器

拦截器可以根据请求的URL对请求进行拦截,主要应用于登录校验、权限验证、乱码解决、性能监控和异常处理等方面。在Spring Boot项目中配置拦截器也非常简单,只需要定义拦截器和注册拦截器即可。 

拦截过程

下面通过案例演示在Spring Boot项目中配置拦截器。

(1)定义拦截器。创建interceptor子包,在该包下创建拦截器类,该类实现了 HandlerInterceptor接口,并重写了接口的preHandle()方法,具体如文件3-12所示。

@Component
public class LoginInterceptor implements HandlerInterceptor {@Overridepublic boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler)throws Exception {// 获取请求路径String requestURI = request.getRequestURI();// 获取登录用户Object loginUser = request.getSession().getAttribute("loginUser");// 如果请求路径是"/backend"开头的,并且用户没有登录,//那么将请求重定向到登录页面或者内部转发if (requestURI.startsWith("/backend") && loginUser == null) {response.sendRedirect("/toLoginPage");//request.getRequestDispatcher("/toLoginPage").forward(request,response);return false;}return true;}}

(2)注册拦截器。

在文件3-11中重写WebMvcConfigurer接口的addInterceptors()方法,在该方法中添加拦截器。

    @Autowiredprivate LoginInterceptor loginInterceptor;@Overridepublic void addInterceptors(InterceptorRegistry registry) {registry.addInterceptor(loginInterceptor).addPathPatterns("/**").excludePathPatterns("/toLoginPage");}

(3)效果测试

重启项目,启动成功后,在浏览器上访问http://localhost:8080/backend

动手试一试

不拦截静态资源,比如图片,css 。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/web/76144.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

1.凸包、极点、极边基础概念

目录 1.凸包 2.调色问题 3.极性(Extrem) 4.凸组合(Convex Combination) 5.问题转化(Strategy)​编辑 6.In-Triangle test 7.To-Left-test 8.极边(Extream Edges) 1.凸包 凸包就是上面蓝色皮筋围出来的范围 这些钉子可以转换到坐标轴中&#xff0…

《如何用 Function 实现动态配置驱动的处理器注册机制?》

大家好呀!👋 今天我们来聊聊一个超实用的技术话题 - 如何用Java的Function接口实现动态配置驱动的处理器注册机制。听起来很高大上?别担心,我会用最简单的方式讲清楚!😊 一、为什么要用Function实现处理器…

【最新版】芸众商城独立版源码 425+插件 全新后台框架

一.系统介绍 芸众商城系统最新版 已经更新425全插件版,一套系统支持各种新零售、商城、模式,天天美丽链动商城。不要相信那些外面的旧版本。旧版本等于是废品,无法小程序运营的,框架还是旧的! 芸众系统最新版 服务器可…

java 设计模式之单例模式

简介 单例模式:一个类有且仅有一个实例,该类负责创建自己的对象,同时确保只有一个对象被创建。 特点:类构造器私有、持有自己实例、对外提供获取实例的静态方法。 单例模式的实现方式 饿汉式 类被加载时,就会实例…

Milvus 索引如何选择

以下是几种索引类型的特点及适用场景,可据此选择: AUTOINDEX 特点:数据库自动选择合适索引类型,无需深入了解索引细节。适用场景:对索引知识了解有限,或不确定哪种索引适合当前数据和查询需求&#xff0c…

CentOS 7 安装教程

准备: 软件:VMware Workstation 镜像文件:CentOS-7-x86_64-bin-DVD1.iso (附:教程较为详细,注释较多,故将操作的选项进行了加粗字体显示。) 1、文件–新建虚拟机–自定义 2、硬盘…

TAS启动与卸载

3. 启动TAS(Thin-Agent服务) TAS在安装完成后通常会自动启动,并在系统重启时自启。如需手动启动,请按以下步骤操作:  3.1 在Windows上启动TAS 1. 打开 Windows服务管理器: ◦ 按下 Win R&…

Redis面试——数据结构

一、SDS如何防止缓冲区溢出? Redis 的 String 类型通过 SDS(Simple Dynamic String)来防止缓冲区溢出,具体机制如下: Redis 的 String 类型底层采用 SDS 实现,即 Simple Dynamic StringSDS 底层维护的数据…

Doris的向量化执行如何支撑分布式架构和复杂查询

Doris 的向量化执行能力与其 分布式架构 和 复杂查询优化 深度结合,通过 批处理 列式计算 分布式调度 的协同设计,解决传统分布式数据库在复杂查询场景下的性能瓶颈。以下是具体原理展开: 一、向量化如何适配分布式架构? Doris…

DataInputStream 终极解析与记忆指南

DataInputStream 终极解析与记忆指南 一、核心本质 DataInputStream 是 Java 提供的数据字节输入流,继承自 FilterInputStream,用于读取基本数据类型和字符串的二进制数据。 作用:1.专门用来读取使用DataOutputStream流写入的文件 注意:读取的顺序要和写入的顺序一致(…

云转型(cloud transformation)——不仅仅是简单的基础设施迁移

李升伟 编译 云转型不仅仅是迁移基础设施,更是重塑企业运营、创新及价值交付的方式。它具有战略性、持续性,并影响着人员、流程和平台。 ☁️ 云转型涉及以下内容: 🔄 应用现代化——从单体架构转向微服务架构。 ⚙️ 运营自动…

Java HTTP Client API详解

Java HTTP Client API详解 Java的HTTP客户端API经历了多次演进,从早期的HttpURLConnection到第三方库如Apache HttpClient,再到Java 11引入的标准HttpClient。本文将全面解析Java中主要的HTTP客户端API,包括特性对比、使用方法和最佳实践。 …

如何深入理解引用监视器,安全标识以及访问控制模型与资产安全之间的关系

一、核心概念总结 安全标识(策略决策的 “信息载体) 是主体(如用户、进程)和客体(如文件、数据库、设备)的安全属性,用于标记其安全等级、权限、访问能力或受保护级别,即用于标识其安全等级、权限范围或约束…

京东3D空间视频生成技术探索与应用

1. 背景 近年来,随着社交媒体、流媒体平台以及XR设备的快速发展,沉浸式3D空间视频的需求迅猛增长,尤其是在短视频、直播和电影领域,正在重新定义观众的观看体验。2023年,苹果公司发布的空间视频技术为这一趋势注入了新…

惊爆!Cursor 限制多设备登录,网友疯狂吐槽,退订潮汹涌来袭,直呼:没理由再给它掏钱!

大家好,我是小程程。 吃瓜吃瓜,知名 AI 编程工具 Cursor 惹事了! ① 遭遇强制登出 前几天有 Cursor 用户发现,自己要是从多台设备登录,就会被强制下线。 比方说,你正在台式电脑上干活,中途换到笔…

React JSX 语法深度解析与最佳实践

本文系统梳理 JSX 语法的完整知识体系。通过原理剖析、代码示例和开发警示&#xff0c;帮助开发者建立严谨的 JSX 使用认知。 一、JSX 本质解析 1.1 编译机制 JSX 通过 Babel 转换为 React.createElement 调用&#xff0c;以下为转换对照&#xff1a; // 原始 JSX <MyCo…

若依改用EasyCaptcha验证码

若依自带的验证码样式比较单一&#xff0c;所以想改用EasyCaptcha验证码&#xff0c;另外EasyCaptcha算术验证码可能会有负数&#xff0c;输入时需要写负号&#xff0c;比较麻烦&#xff0c;所以使用一个简单的方法过滤掉负数结果 原本的验证码依赖和代码可删可不删&#xff0c…

趣味编程之go与rust的爱恨情仇

声明:此篇文章利用deepseek生成。 第一章&#xff1a;出身之谜 Go&#xff08;江湖人称"高小戈"&#xff09;是名门之后——谷歌家的三少爷。生来就带着"简单粗暴"的家族基因&#xff0c;口号是**“少写代码多搬砖&#xff0c;并发处理赛神仙”**。它爹Ro…

【cocos creator 3.x】速通3d模型导入, 模型创建,阴影,材质使用,模型贴图绑定

1、右键创建平面&#xff0c;立方体 2、点击场景根节点&#xff0c;shadows勾选enabled3、点击灯光&#xff0c;shadow enabled勾选 4、点击模型&#xff0c;勾选接收阴影&#xff0c;投射阴影&#xff08;按照需要勾选&#xff09; 5、材质创建 6、选中节点&#xff0c;找…

告别昂贵语音合成服务!用GPT-SoVITS生成你的个性化AI语音

文章目录 前言1.GPT-SoVITS V2下载2.本地运行GPT-SoVITS V23.简单使用演示4.安装内网穿透工具4.1 创建远程连接公网地址 5. 固定远程访问公网地址 前言 今天给大家介绍一款AI语音克隆工具——GPT-SoVITS。这款由花儿不哭大佬开发的工具是一款强大的训练声音模型与音频生成工具…