SpringBoot整合SpringMVC

目录

一、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自动配置了视图解析器,包括InternalResourceViewResolverContentNegotiatingViewResolver 等。
默认配置 :默认的视图解析器前缀为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其他的方法都会被拦截

相关推荐
程序定小飞2 小时前
基于springboot的汽车资讯网站开发与实现
java·开发语言·spring boot·后端·spring
Kapaseker3 小时前
Java 26 的新特性
java
Moment3 小时前
LangChain 1.0 发布:agent 框架正式迈入生产级
前端·javascript·后端
回家路上绕了弯3 小时前
朋友圈更新怎么实时通知?从发布到接收的全链路解析
后端·微服务
糖纸风筝3 小时前
Java指南:eclipse、java-activemq与测试验证
java·开发语言·学习
小坏讲微服务3 小时前
整合Spring Cloud Alibaba与Gateway实现跨域的解决方案
java·开发语言·后端·spring cloud·云原生·gateway
q***13613 小时前
Spring Cloud Gateway 整合Spring Security
java·后端·spring
追逐时光者3 小时前
一个基于 .NET WPF 开源的本地硬盘千万级图库以图搜图小工具!
后端·.net
我也有在努力3 小时前
禁用 idea 屏幕阅读器功能 idea support screen readers
java·ide·intellij-idea