目录
一、SpringMVC的核心组件
1、中央转发器
中央转化器是DispatcherServlert,在SSM项目中,SpringMVC中的DispatcherServlet是需要配置在web.xml文件中国,但是在SpringBoot是约定好的,SpringBoot自动接管了DispatcherServlet的配置。
自动配置:Spring Boot自动接管了DispatcherServlet的配置,无需在web.xml中手动配置。DispatcherServlet的配置由DispatcherServletAutoConfiguration类完成。
默认配置 :默认情况下,DispatcherServlet拦截/路径下的所有请求(包括静态资源,但不包括JSP请求)。可以通过server.servletPath属性修改其拦截路径。
可以在application.yaml中进行修改和配置:

xml
spring:
mvc:
servlet:
path: /
2、控制器(Controller)
控制器Controller在springboot的注解扫描范围内自动管理。
自动管理 :在Spring Boot的注解扫描范围内,使用@Controller或@RestController注解的类会被自动识别并管理为Spring MVC的控制器。
注解扫描:Spring Boot默认会扫描与主应用类同级或子级的包中的注解类。如果需要扫描其他包,可以通过@ComponentScan注解指定。
3、视图解析器
自动配置 :Spring Boot自动配置了视图解析器,包括InternalResourceViewResolver 和ContentNegotiatingViewResolver 等。
默认配置 :默认的视图解析器前缀为classpath:/templates/,后缀为.html(如果使用Thymeleaf模板引擎的话-引入了Thymeleaf的依赖)。可以通过application.properties文件中的spring.mvc.view.prefix和spring.mvc.view.suffix属性进行自定义(这个出自于WebMvcProperties封装类)。
设置前缀和后缀的源代码在InternalResourceViewResolver中进行设置。
实现springmvc的文件上传:
当我们做文件上传的时候我们也会发现multipartResolver 是自动被配置好的,它被封装在MultipartAutoConfiguration 类中,处于org.springframework.boot.autoconfigure.web.servlet 包下。

其中文件上传的各种配置定义在multipartProperties中,使用@EnableConfigurationProperties中间application.properties中的各项配置加载到类当中。

根据prefix = "spring.servlet.multipart"前缀也可以在applicaiton.yml文件中进行修改
4、静态资源访问
SpringBoot中静态资源通常存放在:
xml
classpath:/META-INF/resources/
classpath:/resources/
classpath:/static/
classpath:/public/
静态资源加载方式在SpringBoot框架源码中展示如下:

5、消息转换和格式化
(1)消息转换器
消息转换器(Message Converters)是 Spring MVC 中的一个核心组件,用于在 HTTP 请求和响应中进行数据的序列化和反序列化 ,这是前后端交互(交互产生的信息都是消息)过程中不可或缺的一部分。当客户端发送请求时,消息转换器会将请求体中的数据转换为 Java 对象;当服务器返回响应时,消息转换器会将 Java 对象转换为合适的响应体格式(如 JSON、XML 等)。
Springboot自动配置了消息转换器(HttpMessageConvertersAutoConfiguration类中)
(2)格式化
格式化通常指的是将数据转换成特定格式的过程,以便它可以用于显示、存储或传输(封装在)。
实现格式化功能可以通过实现WebMvcConfigurer接口 和在配置文件中编写配置 这两种方式来实现。
①实现WebMvcConfigurer接口

②配置文件编写

实现WebMvcConfigurer接口 和在配置文件中编写配置 这两种有什么区别呢?
配置文件中不可以实现下面的各种方式如下:


二、SpringBoot扩展SpringMVC
在实际开发中SpringBoot并非完全自动化,很多跟业务相关我们需要自己扩展,springboot给我提供了接口。
其中例如:

自己定义的spring.web需要自己通过实现WebMvcConfig中,如何进行判断呢,只要是在application.yml中有配置的情况下,则有默认的配置,否则需要自己实现WebMvcConfig才能够加载。
我们可以来通过实现WebMvcConfigurer 接口来扩展。
只有WebMvcConfigurer中定义的方法才能够被重写

1、在容器中注册视图控制器(请求转发)
java
package com.qcby.config;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.ViewControllerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class MyMVCCofnig1 implements WebMvcConfigurer {
@Override
public void addViewControllers(ViewControllerRegistry registry) {
registry.addViewController("/tx").setViewName("success");
}
}
2、拦截器设置
拦截器设置如下:
java
package com.qcby.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;
@Component
public class MyInterceptor implements HandlerInterceptor {
@Override
public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
System.out.println("前置拦截");
return true;
}
@Override
public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
System.out.println("后置拦截");
}
@Override
public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
System.out.println("最终拦截");
}
}
配置类定义如下:
java
package com.qcby.config;
import com.qcby.interceptor.MyInterceptor;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.context.annotation.Configuration;
import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
@Configuration
public class InterceptorConfig implements WebMvcConfigurer {
@Autowired
private MyInterceptor myInterceptor;
@Override
public void addInterceptors(InterceptorRegistry registry) {
registry.addInterceptor(myInterceptor)
.addPathPatterns("/**")
.excludePathPatterns("/m1")
;
}
}
controller层中如下:
java
package com.qcby.controller;
import com.qcby.entity.User;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;
import java.util.ArrayList;
import java.util.List;
@Controller
public class HelloController {
@RequestMapping("/hello")
public String hello(){
return "hello121";
}
@RequestMapping("/hello1")
@ResponseBody
public String hello1(){
return "hello1";
}
@RequestMapping("/success")
public String hello(Model model){
model.addAttribute("hello","<h1>zhangsan</h1>");
User user = new User();
user.setId(1);
user.setName("张三");
user.setEmail("<EMAIL>");
user.setAge(18);
user.setScore(90);
User user1 = new User();
user1.setId(2);
user1.setName("张三");
user1.setEmail("<EMAIL>");
List<User> list = new ArrayList<>();
list.add(user);
list.add(user1);
model.addAttribute("users", list);
model.addAttribute("user", user);
return "success";
}
@RequestMapping("/hello2")
@ResponseBody
public String hello2(){
return "hello2";
}
@RequestMapping("/m1")
@ResponseBody
public String m1(){
return "m1";
}
}
当除了m1其他的方法都会被拦截