【Spring MVC 系列】静态资源处理

场景

静态资源,可以理解为内容固定的页面,包括 HTML、CSS、JS、图片文件等等。浏览器发起请求后服务器根据 URL 查找文件,并将文件内容作为响应,而无需 Java 代码处理业务逻辑,访问效率较高。

在这里插入图片描述

前后端分离的今天,Java Web 应用中直接使用静态资源的方式已经很少见了,但不可避免有时候还会用到,例如接口文档 Swagger 就直接将前端代码嵌入了 Java Web 应用中。

Spring MVC 原生支持静态资源,这篇我们主要学习 Spring MVC 静态资源处理的设计思路,以及如何在 Spring MVC 中进行静态资源配置。

Spring MVC 静态资源处理设计思路

普通的 Java Web 项目,代码发布到容器之后,浏览器发起的请求如果没有对应的 Servlet 处理,容器会自动根据 URL 查找项目根目录中的静态资源文件。

对于 Spring MVC 项目而言,通常会配置一个 DispatchServlet 接管所有的请求,这样容器就没有机会自动查找静态资源文件,这意味着静态资源文件也需要 DispatchServlet 进行处理。再看下 DispatchServlet 处理请求的流程图。

在这里插入图片描述DispatchServlet 会将请求交由处理器 Handler 进行处理,那么很自然的,我们为每个表示静态资源文件的 URL 创建一个自定义的处理器就好了。例如:

public class LogoHandler implements HttpRequestHandler {

    @Override
    public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        IoUtil.copy(new FileInputStream("/logo.png"), response.getOutputStream());
    }
    
}

然后指定处理的路径,我们自定义处理器就可以处理静态资源。例如:

    <bean id="/logo.png" class="com.zzuhkp.mvc.LogoHandler"/>

如果静态资源文件比较少使用这种方式还好,如果多的话那么为每个静态资源文件配置一个处理器也太繁琐了,因此我们需要一个能够处理多种静态资源文件的处理器。

Spring 为了简化对静态资源的处理内置了一个处理器 ResourceHttpRequestHandler,因此我们直接将这个处理器配置到容器中即可。

    <bean id="/page/*" class="org.springframework.web.servlet.resource.ResourceHttpRequestHandler">
        <property name="locationValues" value="classpath:/static/"/>
    </bean>

当 DispatcherServlet 收到 /page/ 开头的请求,会自动在类路径 /static 中查找资源文件然后进行响应。不过这种配置方式并非官方推荐,下面看官网推荐的配置方式。

Spring MVC 静态资源处理配置

XML 配置

早期的 Spring MVC 使用 XML 配置,使用 XML 配置静态资源处理器的方式如下。

    <mvc:resources mapping="/static/**" location="/page/">
    </mvc:resources>

是的,就是这么简单。

Java API 配置

在配置类上添加 @EnableWebMvc 注解之后,我们还可以实现 WebMvcConfigurer 接口并重写 addResourceHandlers 方法来配置静态资源处理器,其底层与手动配置静态资源处理器相同。示例代码如下。

@EnableWebMvc
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {
        registry.addResourceHandler("/page/*")
                .addResourceLocations("classpath:/static/");
    }
    
}

Spring Boot 静态资源处理配置

Spring Boot 环境下的 Spring MVC 已经默认进行了静态资源处理的配置。默认配置如下:
配置一

  • 处理的请求路径:/**
  • 查找的静态资源文件位置:classpath:/META-INF/resources/classpath:/resources/classpath:/static/classpath:/public/,Spring 将优先查找前面的资源文件;

配置二

  • 处理的请求路径:/webjars/**
  • 查找的静态资源文件位置:classpath:/META-INF/resources/webjars/

有了默认配置,我们将静态资源文件放在类路径下 /static 目录即可。

webjars 又是怎么回事呢?这是为了避免静态资源文件版本不一致的情况,将多种静态资源文件统一打包到 jar 中的一种方式,打包后的静态资源文件位于类路径 /META-INF/resources/webjars/ 目录中。

如果认为默认的配置不适用,还可以修改 application.properties 文件配置。示例如下。

spring.mvc.static-path-pattern=/page/**
spring.resources.add-mappings=true
spring.resources.static-locations=classpath:/static/

其中 static-path-pattern 用于配置处理的请求路径,static-locations 用于处理请求路径映射到的静态资源文件路径,如果你想关闭静态资源处理,还可以将 add-mappings 设置为 false

  • 5
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
如果在 Spring MVC 中无法获取到静态资源,可能是由于以下几种情况导致: 1. 静态资源目录不正确:确保你的静态资源文件位于正确的目录中。默认情况下,Spring Boot 会将静态资源放置在 `src/main/resources/static` 目录下。你可以检查该目录下是否存在你的静态资源文件。 2. 静态资源路径配置错误:如果你将静态资源放置在除了默认路径以外的其他位置,确保在配置类中正确配置了资源处理器。 - 如果你使用的是 Spring Boot,你可以在 `application.properties` 或 `application.yml` 文件中添加以下配置: ```properties spring.resources.static-locations=classpath:/static/, file:/path/to/custom/resources/ ``` 上述配置将静态资源的位置设置为默认的 `classpath:/static/` 目录以及自定义的 `/path/to/custom/resources/` 目录。 - 如果你使用的是自定义的 Spring MVC 配置类,你可以在 `addResourceHandlers` 方法中添加对应的资源处理器配置。例如: ```java @Override public void addResourceHandlers(ResourceHandlerRegistry registry) { registry.addResourceHandler("/custom-resources/**") .addResourceLocations("classpath:/custom-resources/"); } ``` 上述配置将 `"/custom-resources/**"` 映射到 `classpath:/custom-resources/` 目录。 3. 静态资源请求路径不正确:确保你在浏览器中正确访问了静态资源的 URL。例如,如果你的静态资源文件名为 `styles.css`,你应该可以通过访问 `http://localhost:8080/styles.css` 来访问它。 4. 静态资源缓存问题:如果你曾经访问过相同的静态资源,并且浏览器缓存了该资源,可能导致无法获取到最新的资源。你可以尝试在浏览器中使用强制刷新(通常是按下 Ctrl + F5)来加载最新的静态资源。 请仔细检查以上情况,并逐一解决问题。如果问题仍然存在,请提供更多详细信息,以便我能够更好地帮助你解决问题。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

大鹏cool

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值