SpringBoot加载静态资源

简介: 在SpringBoot中加载静态资源和在普通的web应用中不太一样。默认情况下,Spring Boot从classpath下一个叫/static(/public,/resources或/META-INF/resources)的文件夹或从ServletContext根目录提供静态内容。下面我们来写个例子看一下就会一目了然了:首先看一下项目的目录结构: 我们在resources下面的te

在SpringBoot中加载静态资源和在普通的web应用中不太一样。默认情况下,Spring Boot从classpath下一个叫/static(/public,/resources或/META-INF/resources)的文件夹或从ServletContext根目录提供静态内容。下面我们来写个例子看一下就会一目了然了:首先看一下项目的目录结构:


我们在resources下面的templates目录下建一个home.html的文件,完整目录为:src/main/resources/templates/home.html。内容如下:

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="utf-8"/>
    <title>ConanZhang的首页</title>
</head>
<body>
我是首页:
<!--<image th:src="@{/image/267862-1212151Z12099.jpg}"/> -->
</body>
</html>

如果我们想要访问home.html应该怎么做呢?我们先来看第一种方式:

1、我们在web.controller这个包下面建一个Controller类:ThymeleafTestController.代码内容如下:

package com.zkn.learnspringboot.web.controller;

import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;

/**
 * Created by wb-zhangkenan on 2016/11/30.
 */
@Controller
@RequestMapping("thymeleaf")
public class ThymeleafTestController {

    @RequestMapping("home")
    public String getHome(){

        return "home";
    }
}
写到这里你一定非常眼熟,这不就是SpringMVC的写法吗?没错就是SpringMVC的写法:下面我们来访问一下:http://localhost:8003/thymeleaf/home。结果如图所示:


因为SpringBoot集成了Thymeleaf,所以它会默认查找resources下面的templates这个目录下的文件。templates这个目录的名字不要写错了。接着我又有了这样的需求,假设我想在我的home.html中引入一些其他的静态资源文件,比如我想在home.html中引入一张图片:那我们应该怎么做呢?

首先,我们需要在resources下面建一个static或者public的目录,你不建立目录也行,直接放到resources下面,接着我们再建立一个image的目录,最终的目录结构如图所示:


我们在image这个目录下放入一张图片,然后我们在home.html中引入一下这张图片,最终的代码如下:

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>WebMvcConfigurerAdapter
    <meta charset="utf-8"/>
    <title>ConanZhang的首页</title>
</head>
    <body>
我是首页:
    <image th:src="@{/image/267862-1212151Z12099.jpg}" width="100px" height="50px" />
    </body>
</html>
看到上面的写法你可能会有些奇怪,th:src和@{}这都是什么鬼。其实这是Thymeleaf的语法。@{}是引入外部资源用的。下面我们再来访问一下,结果如下图所示:

这样我们就访问到了image目录下的图片了。

可能会有人说难道我只能放到static、public或者直接放到resources下面吗?我换个目录就不行了吗?那当然不是这样的,下面我们来换另外一种写法:

在我现在的这个项目中前台是用react-redux写的,后台SpringBoot只是用来提供接口的,我只需要一个首页来把编译后的react-redux引入到项目中就可以了,如果我想直接访问这个首页那我应该怎么做呢?SpringMVC为我们提供了这样的一个类:WebMvcConfigurerAdapter。我们就是借助于这个类来实现我们需要的功能的。我们写一个类来继承这个类,代码如下:

package com.zkn.learnspringboot.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.util.ResourceUtils;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**
 * Created by wb-zhangkenan on 2016/11/30.
 */
@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {

        registry.addResourceHandler("/templates/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX+"/templates/",ResourceUtils.CLASSPATH_URL_PREFIX+"/image/");
        super.addResourceHandlers(registry);
    }
    
}
我们重写了addResourceHandlers这个方法来重新注册了一个资源处理器。接着我们在来访问一下看看:http://localhost:8003/templates/home.html。结果如下图所示:


注意了这里我们是直接访问的home.html这个文件。和我们预期的效果是一样的。接着可能会有人说:如果我也想在home.html中引入静态资源要怎么办呢?比如说上面的那个例子,我要引入一个一张图片。也简单,那我们就再注册一个资源处理器就OK了。java代码如下:

package com.zkn.learnspringboot.config;

import org.springframework.context.annotation.Configuration;
import org.springframework.util.ResourceUtils;
import org.springframework.web.servlet.config.annotation.EnableWebMvc;
import org.springframework.web.servlet.config.annotation.ResourceHandlerRegistry;
import org.springframework.web.servlet.config.annotation.WebMvcConfigurerAdapter;

/**
 * Created by wb-zhangkenan on 2016/11/30.
 */
@EnableWebMvc
@Configuration
public class WebConfig extends WebMvcConfigurerAdapter {

    @Override
    public void addResourceHandlers(ResourceHandlerRegistry registry) {

        registry.addResourceHandler("/templates/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX+"/templates/");
        registry.addResourceHandler("/static/**").addResourceLocations(ResourceUtils.CLASSPATH_URL_PREFIX+"/static/");
        super.addResourceHandlers(registry);
    }

}
home.html中的内容如下所示:

<!DOCTYPE HTML>
<html xmlns:th="http://www.thymeleaf.org">
<head>
    <meta charset="utf-8"/>
    <title>ConanZhang的首页</title>
</head>
    <body>
我是首页:
    <image src="/static/image/267862-1212151Z12099.jpg" width="100px" height="50px" />
    </body>
</html>
接着我们再访问以下看看什么效果:http://localhost:8003/templates/home.html

和之前的效果是一模一样的吧?

WebMvcConfigurerAdapter这个类可以说是SpringMVC的java的config,它可以代替我们之前在xml中进行的一系列配置。关于WebMvcConfigurerAdapter更多的介绍请看spring-framework-reference 543页22.16 Configuring Spring MVC这章的内容。

前几天在网上找了一个SpringBoot的中文开发指南,有需要的请点击这里下载吧。

这篇文章的完整版代码请从githup上下载,地址如下:https://github.com/zhangconan/LearnSpringBoot


相关文章
|
4天前
|
JavaScript Java Maven
【SpringBoot(二)】带你认识Yaml配置文件类型、SpringMVC的资源访问路径 和 静态资源配置的原理!
SpringBoot专栏第二章,从本章开始正式进入SpringBoot的WEB阶段开发,本章先带你认识yaml配置文件和资源的路径配置原理,以方便在后面的文章中打下基础
67 3
|
8月前
|
存储 前端开发 Java
Springboot静态资源映射及文件映射
在Spring Boot项目中,为了解决前端访问后端存储的图片问题,起初尝试通过静态资源映射实现,但发现这种方式仅能访问打包时已存在的文件。对于动态上传的图片(如头像),需采用资源映射配置,将特定路径映射到服务器上的文件夹,确保新上传的图片能即时访问。例如,通过`addResourceHandler(&quot;/img/**&quot;).addResourceLocations(&quot;file:E:\\myProject\\forum_server\\&quot;)`配置,使前端可通过URL直接访问图片。
445 0
Springboot静态资源映射及文件映射
|
11月前
|
监控 IDE Java
如何在无需重新启动服务器的情况下在 Spring Boot 上重新加载我的更改?
如何在无需重新启动服务器的情况下在 Spring Boot 上重新加载我的更改?
958 8
springboot静态资源目录访问,及自定义静态资源路径,index页面的访问
本文介绍了Spring Boot中静态资源的访问位置、如何进行静态资源访问测试、自定义静态资源路径和静态资源请求映射,以及如何处理自定义静态资源映射对index页面访问的影响。提供了两种解决方案:取消自定义静态资源映射或编写Controller来截获index.html的请求并重定向。
springboot静态资源目录访问,及自定义静态资源路径,index页面的访问
|
12月前
|
架构师 Java 开发者
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
在40岁老架构师尼恩的读者交流群中,近期多位读者成功获得了知名互联网企业的面试机会,如得物、阿里、滴滴等。然而,面对“Spring Boot自动装配机制”等核心面试题,部分读者因准备不足而未能顺利通过。为此,尼恩团队将系统化梳理和总结这一主题,帮助大家全面提升技术水平,让面试官“爱到不能自已”。
得物面试:Springboot自动装配机制是什么?如何控制一个bean 是否加载,使用什么注解?
|
11月前
|
JavaScript 前端开发 Java
SpringBoot_web开发-webjars&静态资源映射规则
https://www.91chuli.com/ 举例:jquery前端框架
151 0
|
12月前
|
Java Shell C++
Springboot加载注入bean的方式
本文详细介绍了Spring Boot中Bean的装配方法。首先讲解了使用@Component、@Service、@Controller、@Repository等注解声明Bean的方式,并解释了这些注解之间的关系及各自适用的层次。接着介绍了通过@Configuration和@Bean注解定义Bean的方法,展示了其灵活性和定制能力。最后讨论了@Component与@Bean的区别,并提供了在Spring Boot应用中装配依赖包中Bean的三种方法:使用@ComponentScan注解扫描指定包、使用@Import注解导入特定Bean以及在spring.factories文件中配置Bean。
791 0
|
Java Spring
Spring boot +Thymeleaf 本地图片加载失败(图片路径)的问题及解决方法
这篇文章详细讲解了在Spring Boot应用程序中本地图片无法加载的问题原因,并提供了两个示例来说明如何通过使用正确的相对路径或Thymeleaf语法来解决图片路径问题。
|
消息中间件 NoSQL 安全
(转)Spring Boot加载 不同位置的 application.properties配置文件顺序规则
这篇文章介绍了Spring Boot加载配置文件的顺序规则,包括不同位置的application.properties文件的加载优先级,以及如何通过命令行参数或环境变量来指定配置文件的名称和位置。
628 0
|
前端开发 JavaScript Java
Spring boot 本地图片不能加载(图片路径)的问题及解决方法
这篇文章讨论了Spring Boot应用程序中本地图片无法加载的问题,通常由图片路径不正确引起,并提供了使用正确的相对路径和Thymeleaf语法来解决这一问题的两种方法。