Spring Boot整合Spring MVC与外部配置完整笔记

1. Spring MVC自动配置原理

核心机制

Spring Boot通过DispatcherServletAutoConfiguration自动配置DispatcherServlet,无需手动在web.xml中声明。默认拦截所有请求(/),但排除JSP请求。

关键组件自动配置

  • 视图解析器 :默认使用ContentNegotiatingViewResolver,支持多种视图解析策略(如JSP、Thymeleaf)。

  • 静态资源管理 :默认映射/webjars/**classpath:/static/等路径。

  • 消息转换器 :自动注册MappingJackson2HttpMessageConverter(JSON处理)等转换器。

  • 文件上传 :自动配置MultipartResolver,支持multipart/form-data表单提交。

示例配置application.properties):

复制代码
# 文件上传大小限制
spring.servlet.multipart.max-file-size=20MB
spring.servlet.multipart.max-request-size=20MB

2. Spring MVC扩展配置

通过实现WebMvcConfigurer接口扩展Spring MVC功能:

2.1 视图控制器(请求转发)
复制代码
@Configuration
public class MyMvcConfig implements WebMvcConfigurer {
    @Override
    public void addViewControllers(ViewControllerRegistry registry) {
        registry.addViewController("/tx").setViewName("success"); // /tx → success.html
    }
}
2.2 拦截器注册
复制代码
public class MyInterceptor implements HandlerInterceptor {
    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) {
        System.out.println("前置拦截");
        return true; // 继续流程
    }
}

// 配置拦截器
@Override
public void addInterceptors(InterceptorRegistry registry) {
    registry.addInterceptor(new MyInterceptor())
            .addPathPatterns("/**") // 拦截所有请求
            .excludePathPatterns("/hello2"); // 排除特定路径
}
2.3 消息转换器(Fastjson集成)
复制代码
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {
    FastJsonHttpMessageConverter converter = new FastJsonHttpMessageConverter();
    FastJsonConfig config = new FastJsonConfig();
    config.setSerializerFeatures(SerializerFeature.PrettyFormat);
    converter.setFastJsonConfig(config);
    converters.add(converter);
}

实体类注解控制格式

复制代码
public class User {
    @JSONField(format = "yyyy-MM-dd")
    private Date createTime;
}
2.4 格式化器(日期处理)
复制代码
@Override
public void addFormatters(FormatterRegistry registry) {
    registry.addFormatter(new Formatter<Date>() {
        @Override
        public Date parse(String text, Locale locale) throws ParseException {
            return new SimpleDateFormat("yyyy-MM-dd").parse(text);
        }
    });
}

3. 静态资源管理

默认规则

  • 路径映射/webjars/**classpath:/META-INF/resources/webjars/

  • 静态资源路径classpath:/static/, classpath:/public/, classpath:/resources/

  • 欢迎页 :自动映射index.html到根路径(/)。

自定义配置application.properties):

复制代码
spring.resources.static-locations=classpath:/custom-static/
spring.mvc.static-path-pattern=/static/**

4. 文件上传配置

Controller示例

复制代码
@PostMapping("/upload")
@ResponseBody
public String upload(@RequestParam("file") MultipartFile file) {
    if (!file.isEmpty()) {
        try {
            String path = "D:/uploads/" + file.getOriginalFilename();
            file.transferTo(new File(path));
            return "上传成功";
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    return "上传失败";
}

配置文件application.properties):

复制代码
spring.servlet.multipart.enabled=true
spring.servlet.multipart.location=/tmp

5. 外置Servlet容器配置

步骤

  1. 修改依赖pom.xml):

    复制代码
    <dependency>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-web</artifactId>
        <exclusions>
            <exclusion>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-tomcat</artifactId>
            </exclusion>
        </exclusions>
    </dependency>
    <dependency>
        <groupId>org.apache.tomcat.embed</groupId>
        <artifactId>tomcat-embed-core</artifactId>
        <scope>provided</scope>
    </dependency>
  2. 打包为WAR

    • 修改pom.xml打包类型:

      复制代码
      <packaging>war</packaging>
    • 创建ServletInitializer类:

      复制代码
      public class ServletInitializer extends SpringBootServletInitializer {
          @Override
          protected SpringApplicationBuilder configure(SpringApplicationBuilder app) {
              return app.sources(YourApplication.class);
          }
      }
  3. 部署目录结构

    复制代码
    /WEB-INF
        web.xml (可选)
        classes/
            /static
            /templates

6. 高级配置
6.1 自定义Servlet/Filter/Listener
复制代码
@Bean
public ServletRegistrationBean<MyServlet> myServlet() {
    return new ServletRegistrationBean<>(new MyServlet(), "/myServlet");
}

@Bean
public FilterRegistrationBean<MyFilter> myFilter() {
    FilterRegistrationBean<Filter> filterRegBean = new FilterRegistrationBean<>();
    filterRegBean.setFilter(new MyFilter());
    filterRegBean.addUrlPatterns("/api/*");
    return filterRegBean;
}
6.2 跨域配置(CORS)
复制代码
@Override
public void addCorsMappings(CorsRegistry registry) {
    registry.addMapping("/api/**")
            .allowedOrigins("http://example.com")
            .allowedMethods("GET", "POST");
}

7. 总结
  • 自动配置 :Spring Boot通过条件化配置简化Spring MVC集成,默认覆盖核心组件(如DispatcherServlet、视图解析器)。

  • 扩展性 :通过WebMvcConfigurer接口灵活定制拦截器、消息转换器等。

  • 外置容器:支持WAR包部署到Tomcat等Servlet容器,适用于生产环境。

相关推荐
盖世英雄酱5813620 分钟前
springboot 项目 从jdk 8 升级到jdk21 会面临哪些问题
java·后端
济南壹软网络科技有限公司27 分钟前
企业级盲盒系统:Java高并发架构在多元化抽奖电商中的设计与实践
java·架构·开源源码·盲盒源码·盲盒h5·盲盒app
廋到被风吹走31 分钟前
【Java】常用设计模式及应用场景详解
java·开发语言·设计模式
一条可有可无的咸鱼37 分钟前
企业招聘信息,企业资讯进行公示
java·vue.js·spring boot·uni-app
程序猿DD1 小时前
JUnit 5 中的 @ClassTemplate 实战指南
java·后端
爱吃山竹的大肚肚1 小时前
EasyPOI 大数据导出
java·linux·windows
Victor3561 小时前
Netty(14)如何处理Netty中的异常和错误?
后端
panzer_maus2 小时前
归并排序的简单介绍
java·数据结构·算法
Smartdaili China2 小时前
掌握Java网页抓取:技术与示例完整指南
java·网络·学习·指南·网页·住宅ip·爬虫api