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

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

场景


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

23.png

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


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


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


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


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


24.png


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

目录
相关文章
|
19天前
|
SQL Java 数据库连接
对Spring、SpringMVC、MyBatis框架的介绍与解释
Spring 框架提供了全面的基础设施支持,Spring MVC 专注于 Web 层的开发,而 MyBatis 则是一个高效的持久层框架。这三个框架结合使用,可以显著提升 Java 企业级应用的开发效率和质量。通过理解它们的核心特性和使用方法,开发者可以更好地构建和维护复杂的应用程序。
109 29
|
2月前
|
设计模式 前端开发 Java
步步深入SpringMvc DispatcherServlet源码掌握springmvc全流程原理
通过对 `DispatcherServlet`源码的深入剖析,我们了解了SpringMVC请求处理的全流程。`DispatcherServlet`作为前端控制器,负责请求的接收和分发,处理器映射和适配负责将请求分派到具体的处理器方法,视图解析器负责生成和渲染视图。理解这些核心组件及其交互原理,有助于开发者更好地使用和扩展SpringMVC框架。
67 4
|
3月前
|
前端开发 Java 开发者
Spring MVC中的请求映射:@RequestMapping注解深度解析
在Spring MVC框架中,`@RequestMapping`注解是实现请求映射的关键,它将HTTP请求映射到相应的处理器方法上。本文将深入探讨`@RequestMapping`注解的工作原理、使用方法以及最佳实践,为开发者提供一份详尽的技术干货。
234 2
|
4月前
|
JSON 前端开发 Java
SSM:SpringMVC
本文介绍了SpringMVC的依赖配置、请求参数处理、注解开发、JSON处理、拦截器、文件上传下载以及相关注意事项。首先,需要在`pom.xml`中添加必要的依赖,包括Servlet、JSTL、Spring Web MVC等。接着,在`web.xml`中配置DispatcherServlet,并设置Spring MVC的相关配置,如组件扫描、默认Servlet处理器等。然后,通过`@RequestMapping`等注解处理请求参数,使用`@ResponseBody`返回JSON数据。此外,还介绍了如何创建和配置拦截器、文件上传下载的功能,并强调了JSP文件的放置位置,避免404错误。
|
4月前
|
前端开发 Java 应用服务中间件
【Spring】Spring MVC的项目准备和连接建立
【Spring】Spring MVC的项目准备和连接建立
79 2
|
4月前
|
XML 前端开发 Java
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
本文阐述了Spring、Spring Boot和Spring MVC的关系与区别,指出Spring是一个轻量级、一站式、模块化的应用程序开发框架,Spring MVC是Spring的一个子框架,专注于Web应用和网络接口开发,而Spring Boot则是对Spring的封装,用于简化Spring应用的开发。
323 0
Spring,SpringBoot和SpringMVC的关系以及区别 —— 超准确,可当面试题!!!也可供零基础学习
|
5月前
|
XML 缓存 前端开发
springMVC02,restful风格,请求转发和重定向
文章介绍了RESTful风格的基本概念和特点,并展示了如何使用SpringMVC实现RESTful风格的请求处理。同时,文章还讨论了SpringMVC中的请求转发和重定向的实现方式,并通过具体代码示例进行了说明。
springMVC02,restful风格,请求转发和重定向
|
5月前
|
缓存 前端开发 Java
【Java面试题汇总】Spring,SpringBoot,SpringMVC,Mybatis,JavaWeb篇(2023版)
Soring Boot的起步依赖、启动流程、自动装配、常用的注解、Spring MVC的执行流程、对MVC的理解、RestFull风格、为什么service层要写接口、MyBatis的缓存机制、$和#有什么区别、resultType和resultMap区别、cookie和session的区别是什么?session的工作原理
|
6月前
|
Java 数据库连接 Spring
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
文章是关于Spring、SpringMVC、Mybatis三个后端框架的超详细入门教程,包括基础知识讲解、代码案例及SSM框架整合的实战应用,旨在帮助读者全面理解并掌握这些框架的使用。
后端框架入门超详细 三部曲 Spring 、SpringMVC、Mybatis、SSM框架整合案例 【爆肝整理五万字】
|
6月前
|
前端开发 应用服务中间件 数据库
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查
这篇文章通过一个具体的项目案例,详细讲解了如何使用SpringMVC、Thymeleaf、Bootstrap以及RESTful风格接口来实现员工信息的增删改查功能。文章提供了项目结构、配置文件、控制器、数据访问对象、实体类和前端页面的完整源码,并展示了实现效果的截图。项目的目的是锻炼使用RESTful风格的接口开发,虽然数据是假数据并未连接数据库,但提供了一个很好的实践机会。文章最后强调了这一章节主要是为了练习RESTful,其他方面暂不考虑。
SpringMVC入门到实战------八、RESTful案例。SpringMVC+thymeleaf+BootStrap+RestFul实现员工信息的增删改查