当前位置: 首页 > article >正文

通过 `@Configuration` 和 `WebMvcConfigurer` 配置 Spring MVC 中的静态资源映射

通过 `@Configuration` 和 `WebMvcConfigurer` 配置 Spring MVC 中的静态资源映射

  • 一、前言
    • 1. 了解静态资源的默认配置
    • 2. 使用 `@Configuration` 和 `WebMvcConfigurer` 自定义资源映射
      • 示例:将 `/upload/` 和 `/img/` 映射到不同的文件系统目录
      • 解释:
      • 为什么使用 `classpath:/static/`?
      • 使用外部文件路径
    • 3. 配置多个静态资源路径
    • 4. 总结


一、前言

在 Spring Boot 中,静态资源管理是一个非常常见的需求。通常,应用会将一些图片、CSS、JS 等静态文件存放在服务器上,用户通过浏览器访问这些资源时,Spring Boot 会自动提供访问路径。为了更灵活地配置这些资源的访问路径,Spring 提供了 WebMvcConfigurer 接口,允许我们定制静态资源的访问规则。

本文将详细讲解如何使用 @Configuration 注解结合 WebMvcConfigurer 接口自定义 Spring Boot 中静态资源的访问路径映射。

1. 了解静态资源的默认配置

Spring Boot 默认提供了一些静态资源的路径配置。默认情况下,Spring Boot 会自动提供以下静态文件夹来存储静态资源:

  • /static/
  • /public/
  • /resources/
  • /META-INF/resources/

这些资源默认都会被映射到 / 路径下,例如 classpath:/static/ 下的资源会自动映射为 http://localhost:8080/static/

但是在实际开发中,往往我们需要调整或定制资源的映射路径,这时候 WebMvcConfigurer 接口就派上了用场。

2. 使用 @ConfigurationWebMvcConfigurer 自定义资源映射

Spring 提供了 WebMvcConfigurer 接口,它允许我们定制 Spring MVC 的配置,包括静态资源的处理、拦截器、视图解析器等。

通过实现 WebMvcConfigurer 接口的 addResourceHandlers 方法,我们可以自定义静态资源的路径映射。例如,我们希望将某些文件夹中的资源映射到自定义的 URL 路径。

示例:将 /upload//img/ 映射到不同的文件系统目录

在以下的代码示例中,我们通过实现 addResourceHandlers 方法,将 /upload/**/img/** 路径映射到 classpath:/static/upload/classpath:/static/img/ 目录下。

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 映射 /upload/* 到文件系统中的 C:/serve/upload 目录
        registry.addResourceHandler("/upload/**")
                .addResourceLocations("file:/C:/serve/upload/"); // 外部路径

        // 映射 /img/* 到文件系统中的某个目录(例如,/static/img/)
        registry.addResourceHandler("/img/**")
                .addResourceLocations("classpath:/static/img/");
    }
}

解释:

  • @Configuration:这表示该类是一个 Spring 配置类,Spring 会自动将其加载到应用上下文中。

  • implements WebMvcConfigurer:通过实现 WebMvcConfigurer 接口,可以定制 Spring MVC 配置,尤其是与资源处理相关的部分。

  • addResourceHandlers(ResourceHandlerRegistry registry):这个方法允许你配置静态资源的映射规则。通过 ResourceHandlerRegistry,我们可以指定哪些 URL 路径对应到服务器上的哪些文件夹。

    • addResourceHandler("/upload/**"):表示我们希望通过 /upload/ 路径来访问上传的文件。
    • addResourceLocations("classpath:/static/upload/"):表示上传的文件存放在 resources/static/upload/ 目录下,classpath:/ 表示从应用的类路径中查找资源。

    同理,/img/ 路径下的资源被映射到 resources/static/img/ 目录。

为什么使用 classpath:/static/

Spring Boot 会自动处理 classpath:/static/classpath:/public/ 等文件夹,因此我们可以通过 classpath: 关键字指定资源文件的路径,而不需要关心文件的实际存储位置。Spring Boot 会根据 classpath 中的资源进行加载。

使用外部文件路径

如果你希望将静态资源存储在项目外部的某个文件夹中(例如服务器的某个上传目录),可以使用 file: 协议。比如,如果你希望将 /upload/ 映射到外部磁盘上的目录 /opt/uploads/,你可以修改代码如下:

registry.addResourceHandler("/upload/**")
        .addResourceLocations("file:/opt/uploads/");

这样,所有请求 /upload/** 的路径将会被映射到 /opt/uploads/ 目录。

3. 配置多个静态资源路径

有时候我们需要将多个不同的路径映射到不同的目录。例如,除了上传的文件和图片外,还可能有一些 CSS、JavaScript 文件需要单独配置。我们可以在 addResourceHandlers 方法中添加多个 addResourceHandleraddResourceLocations 配置,来处理不同类型的静态资源。

例如:

@Configuration
public class WebConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        // 映射 /upload/* 到文件系统中的某个目录
        registry.addResourceHandler("/upload/**")
                .addResourceLocations("classpath:/static/upload/");

        // 映射 /img/* 到文件系统中的某个目录
        registry.addResourceHandler("/img/**")
                .addResourceLocations("classpath:/static/img/");

        // 映射 /css/* 到 CSS 文件所在的目录
        registry.addResourceHandler("/css/**")
                .addResourceLocations("classpath:/static/css/");

        // 映射 /js/* 到 JS 文件所在的目录
        registry.addResourceHandler("/js/**")
                .addResourceLocations("classpath:/static/js/");
    }
}

这样配置后,你的项目就能够根据路径自动加载不同类型的资源。

4. 总结

通过自定义 WebMvcConfigurer 接口中的 addResourceHandlers 方法,我们可以灵活地管理和定制 Spring Boot 项目中的静态资源路径。无论是将资源文件存储在类路径下,还是外部文件系统中,都可以通过此方法进行灵活配置。

  • @Configuration:使该类成为配置类,Spring 会自动加载它。
  • WebMvcConfigurer:通过实现此接口,我们可以自定义 Spring MVC 的行为,特别是静态资源的配置。
  • addResourceHandlers:配置静态资源的映射规则,通过 addResourceHandleraddResourceLocations 来指定 URL 路径和对应的本地资源路径。

这样做不仅能帮助我们定制静态资源的访问路径,还能为不同类型的资源提供不同的映射规则。


http://www.kler.cn/a/455968.html

相关文章:

  • 简易共享屏幕工具改进版
  • 3.银河麒麟V10 离线安装Nginx
  • Python调用Elasticsearch更新数据库
  • uni-app(优医咨询)项目实战 - 第7天
  • AEO海关认证的注意事项
  • YashanDB 23.2 YAC -单库多实例架构多活共享集群安装部署指南
  • 开源软件兼容性可信量化分析
  • Scrapy 自定义 Item 类 与 直接使用字典的区别详解
  • 【ArcGIS】土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测
  • uni-app开发收货地址管理
  • 二百八十二、ClickHouse——删除Linux中的ClickHouse
  • 设计模式的分类及作用
  • 对象字面量内定义属性和方法,传值(什么使用const等关键字,什么时候用键值对)
  • 项目42:简易语法检查器 --- 《跟着小王学Python·新手》
  • 企信唤起跳转小程序及分享API功能
  • C# OpenCV机器视觉:产品计数
  • springboot493基于java的美食信息推荐系统的设计与实现(论文+源码)_kaic
  • vuex - 第一天
  • MongoDB 常用操作指南(Docker 环境下)
  • empire靶机
  • [Wireshark] 使用Wireshark抓包https数据包并显示为明文、配置SSLKEYLOGFILE变量(附下载链接)
  • Android --- 在AIDL进程间通信中,为什么使用RemoteCallbackList 代替 ArrayList?
  • 自动化测试模型(一)
  • Word表格另起一页解决办法
  • FIR数字滤波器设计——窗函数设计法——滤波器的时域截断
  • DBeaver——设置字体大小以及SQL快捷键