Spring ResourceHandlerRegistry

来源:这里教程网 时间:2026-02-17 21:34:02 作者:

Spring ResourceHandlerRegistry 教程展示了如何在 Spring Web 应用中提供静态资产,例如图像,CSSJavaScript 文件。

Spring 是用于创建企业应用的流行 Java 应用框架。

ResourceHandlerRegistry

ResourceHandlerRegistry存储用于通过 Spring MVC 服务静态资源(例如图像,css 文件等)的资源处理程序的注册。 它允许设置为在 Web 浏览器中高效加载而优化的缓存头。 可以在 Web 应用根目录下,类路径等位置之外的位置提供资源。

Spring ResourceHandlerRegistry示例

以下应用使用ResourceHandlerRegistry在 Spring Web 应用中注册静态资产。 我们使用addResourceHandlers()为 CSS 和 JavaScript 文件注册处理程序和位置。

我们将 Thymeleaf 用作视图引擎。 我们使用 Thymeleaf 的@{}语法指向静态资源。

pom.xmlsrc├───main│   ├───java│   │   └───com│   │       └───zetcode│   │           ├───config│   │           │       MyWebInitializer.java│   │           │       WebConfig.java│   │           └───controller│   │                   MyController.java│   ├───resources│   │   │   logback.xml│   │   └───static│   │       ├───css│   │       │       format.css│   │       └───js│   │               main.js│   └───webapp│       └───WEB-INF│           └───templates│                   homePage.html└───test    └───java

这是项目结构。

pom.xml

<?xml version="1.0" encoding="UTF-8"?><project xmlns="http://maven.apache.org/POM/4.0.0"         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"         xsi:schemaLocation="http://maven.apache.org/POM/4.0.0         http://maven.apache.org/xsd/maven-4.0.0.xsd">    <modelVersion>4.0.0</modelVersion>    <groupId>com.zetcode</groupId>    <artifactId>staticresources</artifactId>    <version>1.0-SNAPSHOT</version>    <packaging>war</packaging>    <properties>        <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>        <maven.compiler.source>11</maven.compiler.source>        <maven.compiler.target>11</maven.compiler.target>    </properties>    <dependencies>        <dependency>            <groupId>ch.qos.logback</groupId>            <artifactId>logback-classic</artifactId>            <version>1.2.3</version>        </dependency>        <dependency>            <groupId>javax.servlet</groupId>            <artifactId>javax.servlet-api</artifactId>            <version>4.0.1</version>            <scope>provided</scope>        </dependency>        <dependency>            <groupId>org.springframework</groupId>            <artifactId>spring-webmvc</artifactId>            <version>5.1.3.RELEASE</version>        </dependency>        <dependency>            <groupId>org.thymeleaf</groupId>            <artifactId>thymeleaf-spring5</artifactId>            <version>3.0.11.RELEASE</version>        </dependency>        <dependency>            <groupId>org.thymeleaf</groupId>            <artifactId>thymeleaf</artifactId>            <version>3.0.11.RELEASE</version>        </dependency>    </dependencies>    <build>        <plugins>            <plugin>                <groupId>org.apache.maven.plugins</groupId>                <artifactId>maven-war-plugin</artifactId>                <version>3.2.2</version>            </plugin>        </plugins>    </build></project>

在pom.xml文件中,我们具有以下依存关系:logback-classic,javax.servlet-api,spring-webmvc,thymeleaf-spring5和thymeleaf。

resources/logback.xml

<?xml version="1.0" encoding="UTF-8"?><configuration>    <logger name="org.springframework" level="ERROR"/>    <logger name="com.zetcode" level="INFO"/>    <appender name="consoleAppender" class="ch.qos.logback.core.ConsoleAppender">        <encoder>            <Pattern>%d{HH:mm:ss.SSS} %blue(%-5level) %magenta(%logger{36}) - %msg %n            </Pattern>        </encoder>    </appender>    <root>        <level value="INFO" />        <appender-ref ref="consoleAppender" />    </root></configuration>

logback.xml是 Logback 日志库的配置文件。

resources/css/format.css

p {    background-color: aquamarine;}

这是format.css文件。 它格式化p元素。

resources/js/main.js

const el = document.getElementById("block");el.style.border = '1px dashed gray';

这是main.js文件。 它将边框添加到div元素。 请注意,即使 JavaScript 在科学方面提供了动态功能,但从 Spring 的角度来看,它仍被视为静态资源。

com/zetcode/config/MyWebInitializer.java

package com.zetcode.config;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.support.AbstractAnnotationConfigDispatcherServletInitializer;@Configurationpublic class MyWebInitializer extends        AbstractAnnotationConfigDispatcherServletInitializer {    @Override    protected Class<?>[] getRootConfigClasses() {        return null;    }    @Override    protected Class<?>[] getServletConfigClasses() {        return new Class[]{WebConfig.class};    }    @Override    protected String[] getServletMappings() {        return new String[]{"/*"};    }}

MyWebInitializer注册 Spring DispatcherServlet,它是 Spring Web 应用的前端控制器。

@Overrideprotected Class<?>[] getServletConfigClasses() {    return new Class[]{WebConfig.class};}

getServletConfigClasses()返回 Web 配置类。

com/zetcode/config/WebConfig.java

package com.zetcode.config;import org.springframework.beans.factory.annotation.Autowired;import org.springframework.context.ApplicationContext;import org.springframework.context.annotation.Bean;import org.springframework.context.annotation.ComponentScan;import org.springframework.context.annotation.Configuration;import org.springframework.web.servlet.ViewResolver;import org.springframework.web.servlet.config.annotation.EnableWebMvc;import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;import org.springframework.web.servlet.config.annotation.ViewResolverRegistry;import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;import org.thymeleaf.spring5.SpringTemplateEngine;import org.thymeleaf.spring5.templateresolver.SpringResourceTemplateResolver;import org.thymeleaf.spring5.view.ThymeleafViewResolver;@Configuration@EnableWebMvc@ComponentScan(basePackages = {"com.zetcode"})public class WebConfig implements WebMvcConfigurer {    @Autowired    private ApplicationContext applicationContext;    @Bean    public SpringResourceTemplateResolver templateResolver() {        var templateResolver = new SpringResourceTemplateResolver();        templateResolver.setApplicationContext(applicationContext);        templateResolver.setPrefix("/WEB-INF/templates/");        templateResolver.setSuffix(".html");        return templateResolver;    }    @Bean    public SpringTemplateEngine templateEngine() {        var templateEngine = new SpringTemplateEngine();        templateEngine.setTemplateResolver(templateResolver());        templateEngine.setEnableSpringELCompiler(true);        return templateEngine;    }    @Bean    public ViewResolver viewResolver() {        var resolver = new ThymeleafViewResolver();        var registry = new ViewResolverRegistry(null, applicationContext);        resolver.setTemplateEngine(templateEngine());        registry.viewResolver(resolver);        return resolver;    }    @Override    public void addResourceHandlers(ResourceHandlerRegistry registry) {        registry.addResourceHandler("/js/**").addResourceLocations("classpath:/static/js/");        registry.addResourceHandler("/css/**").addResourceLocations("classpath:/static/css/");    }}

WebConfig通过@EnableWebMvc启用 Spring MVC 注解,并为com.zetcode软件包配置组件扫描。 它设置 Thymeleaf 引擎并注册静态资源处理程序。

@Overridepublic void addResourceHandlers(ResourceHandlerRegistry registry) {    registry.addResourceHandler("/js/**").addResourceLocations("classpath:/static/js/");    registry.addResourceHandler("/css/**").addResourceLocations("classpath:/static/css/");}

我们重写addResourceHandlers()来注册 JavaScript 和 CSS 文件的处理程序和位置。

com/zetcode/controller/MyController.java

package com.zetcode.controller;import org.springframework.stereotype.Controller;import org.springframework.web.bind.annotation.GetMapping;@Controllerpublic class MyController {    @GetMapping(value="/")    public String homePage() {        return "homePage";    }}

MyController提供主页的映射。 在应用中,我们仅使用一个视图。

WEB-INF/templates/homePage.html

<!DOCTYPE html><html xmlns:th="http://www.thymeleaf.org"><head>    <meta charset="UTF-8">    <title>Home page</title>    <link rel="stylesheet" th:href="@{/css/format.css}"></head><body><div id="block"><p>    This is home page.</p></div><script th:src="@{/js/main.js}"></script></body></html>

homePage.html是主页的视图。 它使用静态资源; 一个 CSS 和一个 JavaScript 文件。

<link rel="stylesheet" th:href="@{/css/format.css}">

我们使用特定的 Thymeleaf 语法引用静态文件。

在本教程中,我们展示了如何向 Spring 的ResourceHandlerRegistry注册静态资源。

相关推荐