JAVA面试题分享五百四十:SpringBoot中的静态资源如何处理?

本文详细介绍了在传统Web项目和SpringBoot项目中访问静态资源的三种方式,包括Webjars、直接访问默认路径以及自定义路径,并探讨了如何定制SpringBoot的欢迎页。
摘要由CSDN通过智能技术生成

目录

1、传统web项目访问静态资源

2、Spring Boot项目访问静态资源

2.1、方式一:直接访问Webjars包特定目录下的静态资源(了解)

2.1.1、什么是webjars?

2.1.2、访问示例

2.2、方式二:直接访问本地默认路径下的静态资源

2.2.1、源码分析

2.2.2、结论

2.3、方式三:自定义静态资源存放路径(了解)

3、欢迎页定制

3.1、源码分析

3.2、具体实现


1、传统web项目访问静态资源

在传统的web项目开发中,我们都是将所有的前端页面放在项目的webapp(或web)目录下。如下图所示:

注:

  • 放在WEB-INF目录下的资源是受保护的,在浏览器上不能够通过路径直接访问。所以像HTMLCSSJSimage等静态资源一定要放到WEB-INF目录之外。

  • 传统Web项目发布后,都会被放到Web服务器(Tomcat)中指定的web应用文件夹下(webapps目录)。(详见《Tomcat详解》)

2、Spring Boot项目访问静态资源

SpringBoot项目中对静态资源的存放位置,是有规定的!

Spring Boot中,Spring MVCweb配置都在WebMvcAutoConfiguration这个自动配置类中。

(1)全局搜索WebMvcAutoConfiguration,可以发现:该类内部有一个WebMvcAutoConfigurationAdapter静态类。

(2)点击进入WebMvcAutoConfigurationAdapter类,可以发现其中有一个addResourceHandlers( 添加资源处理器)方法。

WebMvcAutoConfiguration.java文件:

@Override
// 添加资源处理器
public void addResourceHandlers(ResourceHandlerRegistry registry) {
    //判断是否使用默认的资源处理器?若不使用默认的资源处理器,则直接返回。(方式三)
    if (!this.resourceProperties.isAddMappings()) {
        logger.debug("Default resource handling disabled");
        return;
    }
    //第一种静态资源映射规则:通过Webjars将"classpath:/META-INF/resources/webjars/"目录下的静态资源以jar包的方式导入。
    addResourceHandler(registry, "/webjars/**", "classpath:/META-INF/resources/webjars/");
    //第二种静态资源映射规则:直接访问本地默认路径下的静态资源。
    addResourceHandler(registry, this.mvcProperties.getStaticPathPattern(), (registration) -> {
        registration.addResourceLocations(this.resourceProperties.getStaticLocations());
        if (this.servletContext != null) {
            ServletContextResource resource = new ServletContextResource(this.servletContext, SERVLET_LOCATION);
            registration.addResourceLocations(resource);
        }
    });
}

分析上述函数可以发现:Spring Boot默认会通过以下三种方式访问静态资源。

2.1、方式一:直接访问Webjars包特定目录下的静态资源(了解)

2.1.1、什么是webjars

WebJars就是将客户端Web库(如jQueryechartslayuiBootstrap等)打包后生成的一个个jarJava Archive)包。

Spring Boot源码在addResourceHandlers函数中将URL访问路径"/webjars/**"映射到了项目的"classpath:/META-INF/resources/webjars/"目录下。

这样,我们便可以通过URL访问到Webjars"classpath:/META-INF/resources/webjars/"目录下的静态资源文件了。

因此,我们可以将静态资源存放在项目的"classpath:/META-INF/resources/webjars/"目录下。

注:我们一般不使用该方式访问我们自己编写的静态资源(如:HTMLCSSJSimage等)。

2.1.2、访问示例

如:我们要访问并使用jQuery库,我们只需要:

(1)去WebJars官网查找jQuery库的Maven依赖,并将该依赖添加到Spring Boot项目的pom.xml文件中。

pom.xml文件:

<!-- jQuery的WebJars依赖 -->
<dependency>
    <groupId>org.webjars</groupId>
    <artifactId>jquery</artifactId>
    <version>3.4.1</version>
</dependency>

(2)导入完毕后,查看webjars目录结构。如下图所示:

此时,我们便可以通过URLhttp://localhost:8080/webjars/**)访问到Webjars"classpath:/META-INF/resources/webjars/"目录下的静态资源了。

(3)启动主启动类中的main函数,在浏览器中输入http://localhost:8080/webjars/jquery/3.4.1/jquery.js,便可以成功访问jquery.js文件。访问结果如下图所示:

2.2、方式二:直接访问本地默认路径下的静态资源

2.2.1、源码分析

继续分析addResourceHandlers( 添加资源处理器)方法中的第二种静态资源映射规则,可以发现:其中调用了getStaticPathPattern方法用于获取静态资源的URL访问路径;调用了getStaticLocations方法用于获取静态资源的本地存放目录。

(1)点击进入getStaticPathPattern方法,可以发现静态资源的URL访问路径为:"/**"

WebMvcProperties.java文件:

//静态资源访问路径
private String staticPathPattern = "/**";

public String getStaticPathPattern() {
    return this.staticPathPattern;
}

(2)点击进入getStaticLocations方法,可以发现静态资源默认的本地存放目录为:"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"

WebProperties.java文件:

//静态资源默认的本地存放目录
private static final String[] CLASSPATH_RESOURCE_LOCATIONS = { 
    "classpath:/META-INF/resources/",
    "classpath:/resources/",
    "classpath:/static/",
    "classpath:/public/" };
//静态资源默认的本地存放目录
private String[] staticLocations = CLASSPATH_RESOURCE_LOCATIONS;

public String[] getStaticLocations() {
    return this.staticLocations;
}

即:Spring Boot源码在addResourceHandlers函数中将URL访问路径"/**"默认映射到了项目的"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"目录下。

这样,我们便可以通过URL访问项目默认目录下的静态资源文件了。

2.2.2、结论
  • 我们可以将静态资源存放在项目的以下目录下:

"classpath:/META-INF/resources/"
"classpath:/resources/"
"classpath:/static/"
"classpath:/public/"
  • 访问上述四个目录的优先级为:"classpath:/META-INF/resources/" > "classpath:/resources/" > "classpath:/static/" > "classpath:/public/"

我们在项目的resources根目录下新建对应的文件夹,都可以存放我们的静态文件。如:我们访问 http://localhost:8080/test.pngSpring Boot就会去默认的这些文件夹中寻找对应的静态资源test.png文件。

注:我们一般使用这种方式访问我们自己编写的静态资源(如:HTMLCSSJSimage等)。

2.3、方式三:自定义静态资源存放路径(了解)

我们也可以在(propertiesyaml)配置文件中自定义静态资源的URL访问路径和本地存放目录。如:

application.properties文件:

#自定义静态资源的URL访问路径
spring.mvc.static-path-pattern=/atang/**
#自定义静态资源的本地存放目录
spring.web.resources.static-locations=classpath:/MyStaticResource/

注:

  • 一旦自己定义了静态资源的访问路径或本地存放目录,Spring Boot默认配置的访问路径或本地存放目录就会失效了!

  • 我们一般不自定义静态资源的访问路径和本地存放目录,而是使用默认的配置。

3、欢迎页定制

3.1、源码分析

Spring Boot的欢迎页同样是在WebMvcAutoConfiguration自动配置类中进行处理的。

(1)全局搜索WebMvcAutoConfiguration,可以发现:该类内部有一个EnableWebMvcConfiguration静态类。

(2)点击进入EnableWebMvcConfiguration类,可以发现其中有一个welcomePageHandlerMapping(欢迎页处理器映射)方法。

WebMvcAutoConfiguration.java文件:

@Bean
//欢迎页处理器映射
public WelcomePageHandlerMapping welcomePageHandlerMapping(ApplicationContext applicationContext,
                                                           FormattingConversionService mvcConversionService, ResourceUrlProvider mvcResourceUrlProvider) {
    //getWelcomePage()方法:获取欢迎页面
    WelcomePageHandlerMapping welcomePageHandlerMapping = new WelcomePageHandlerMapping(
        new TemplateAvailabilityProviders(applicationContext), applicationContext, getWelcomePage(),
        this.mvcProperties.getStaticPathPattern());
    welcomePageHandlerMapping.setInterceptors(getInterceptors(mvcConversionService, mvcResourceUrlProvider));
    welcomePageHandlerMapping.setCorsConfigurations(getCorsConfigurations());
    return welcomePageHandlerMapping;
}

分析welcomePageHandlerMapping(欢迎页处理器映射)方法,可以发现:其中调用了getWelcomePage方法用于获取欢迎页面。

(3)点击进入getWelcomePage方法。

WebMvcAutoConfiguration.java文件:

//获取欢迎页面
private Resource getWelcomePage() {
    //遍历默认的静态资源存放目录:"classpath:/META-INF/resources/", "classpath:/resources/", "classpath:/static/", "classpath:/public/"
    for (String location : this.resourceProperties.getStaticLocations()) {
        //获取默认静态资源存放目录下的欢迎页面
        Resource indexHtml = getIndexHtml(location);
        //若找到,则返回index.html页面
        if (indexHtml != null) {
            return indexHtml;
        }
    }
    ServletContext servletContext = getServletContext();
    if (servletContext != null) {
        return getIndexHtml(new ServletContextResource(servletContext, SERVLET_LOCATION));
    }
    return null;
}

//获取默认静态资源存放目录下的欢迎页面
private Resource getIndexHtml(String location) {
    //获取默认静态资源存放目录下的index.html页面
    return getIndexHtml(this.resourceLoader.getResource(location));
}

//获取默认静态资源存放目录下的index.html页面
private Resource getIndexHtml(Resource location) {
    try {
        Resource resource = location.createRelative("index.html");
        if (resource.exists() && (resource.getURL() != null)) {
            return resource;
        }
    }
    catch (Exception ex) {
    }
    return null;
}

可以发现:Spring Boot启动时默认会从默认的静态资源存放目录下搜索index.html页面作为欢迎页面。

3.2、具体实现

(1)在静态资源的任一默认存放目录下,新建一个index.html文件。

index.html文件:

<h1>Welcome to Spring Boot!</h1>

(2)启动主启动类中的main函数,在浏览器中输入http://localhost:8080/,欢迎页面访问成功。访问结果如下图所示:

  • 17
    点赞
  • 19
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

之乎者也·

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

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

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

打赏作者

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

抵扣说明:

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

余额充值