U2647's blog 一个热爱学习的 Java 程序员,喜欢 Vue,喜欢深度学习 Dubbo Flutter SpringBoot Debug Notes Java LeetCode Python Redis Android DesignPattern mdi-home-outline 首页 mdi-cloud-outline 标签云 mdi-timeline-text-outline 时间轴 mdi-draw-pen 文章总数 62
Spring Boot 学习笔记(五) 整合 静态资源 Spring Boot 学习笔记(五) 整合 静态资源 Spring Boot 静态资源 Thymeleaf SAXParseException mdi-cursor-default-click-outline 点击量 62

0. 简介

由于 Spring Boot 采用了”约定优于配置”这种规范,所以在使用静态资源的时候也很简单。

Spring Boot 对于静态资源用一种默认的约定。

resources/static: 放js、css、image等
resources/templates: 放 html 或者各种模板引擎的模板文件。

如果要使用 templates 首先要添加 templates的依赖

<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-thymeleaf</artifactId>
</dependency>

1. 访问static下的文件

在 static 下放一张图片, 名字为 spring-boot.jpg,

然后启动访问下:http://localhost:9090/learning/spring-boot.jpg

2. 访问templates下的文件

由于templates下的文件是模板文件,显示的时候需要数据的支持,所以需要写固定的controller来访问。我们在templates写个helloSpring.html文件,内容如下:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Hello World</title>
</head>
<body>
    <div>
        hello spring!
    </div>
</body>
</html>

编写对应的controller,创建一个PageController类,内容如下:

/**
 * Create by ranzd on 2018/7/18
 *
 * @author cm.zdran@gmail.com
 */
@Controller
@RequestMapping("/page")
public class PageController {

    @RequestMapping(value = "/helloSpring", method = RequestMethod.GET)
    public String getAccountByName() {
        return "helloSpring";
    }
}

静态资源的访问好像不支持RestController,下面这种写法是访问不到页面的

@RestController
@RequestMapping("/page")
public class PageController {

    @GetMapping("/helloSpring")
    public String getAccountByName() {
        return "helloSpring";
    }
}

启动,访问一下 http://localhost:9090/learning/page/helloSpring

3. html 引用 static下的资源文件

下面我们将图片加入到html的页面中去。

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>Hello World</title>
</head>
<body>
    <div>
        <img src="/learning/images/spring-boot.jpg">
    </div>
</body>
</html>

html中的路径是:项目名 + static 下的目录。当然你也可以理解为把static换成项目名就是html中的路径。

比如:图片在项目中的路径是: /static/images/spring-boot.jpg那么在html中引用它的路径就是把 static换成项目名:/learning/images/spring-boot.jpg

这里说的项目名是指在yaml里配置的 context-path 不是代码的项目名称

4. 解决thymeleaf严格校验

在使用 thymeleaf 的时候经常出现的一个问题是:

org.xml.sax.SAXParseException: 

元素类型 "xxx" 必须由匹配的结束标记 "</xxx>" 终止。 

这是因为 thymeleaf 对html代码进行了严格的校验。解决办法有两个。

第一个比较简单,就是把 终止标签补上就可以了。

第二个办法就是禁用严格校验。下面说一下禁用方式。

以下解决方案参考自网络,个人的建议还是直接补上结束标签

可以在 yaml 文件里添加一个配置

spring:
  thymeleaf:
    mode: LEGACYHTML5
    cache: false

如果还是不行的话,可以添加一下依赖

<dependency>
    <groupId>net.sourceforge.nekohtml</groupId>
    <artifactId>nekohtml</artifactId>
    <version>1.9.21</version>
</dependency>

如果还是不行,就把结束标签补上吧,别挣扎了。

版权声明:本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明出处!
我的GitHub 我的LeetCode 我的掘金
Powered by Hexo Powered by three-cards
Copyright © 2017 - {{ new Date().getFullYear() }} 某ICP备xxxxxxxx号