Thymeleaf链接表达式指向的位置一直发生改变,如何让其指向固定位置的静态资源?

问题描述

Thymeleaf链接表达式表达式指向的位置随当前URL改变而改变,如何使其指向固定的位置?

问题出现的环境背景及自己尝试过哪些方法

Spring-Boot 2.7.11
Thymeleaf
Eclipse + Spring Tools

相关代码

Spring Boot中控制器路径为

@GetMapping("/{var1}/{var2}")
    public String controller(@PathVariable String var1, @PathVariable String var2)


无论Thymeleaf模版中静态文件的路径写成

<img th:src="@{images/image.png}"/>

还是

<img src="images/image.png" />

渲染后都是

<img src="images/image.png" />

css也同样无法加载,无论写的是

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

还是

<link rel="stylesheet" href="style/styles.css">

都会渲染成用

<link rel="stylesheet" href="style/styles.css">

并且用浏览器的开发者工具查看后发现css文件的目录是/var1/style/styles.css

再尝试将Controller的路径进行修改,改为

@GetMapping("/test/{var1}/{var2}")

则css文件的路径变为/test/var1/style/styles.css
而如果将控制器中的路径改为

@GetMapping("/{var1}/{var2}/{var3}")

则会变成/var/var2/style/styles.css

你期待的结果是什么?实际看到的错误信息又是什么?

期待的结果是链接指向项目的resource文件夹中的静态资源,
但实际上网页请求静态文件时会根据当前url改变位置

阅读 1.9k
2 个回答

@{path/file.ext}path/file.ext都是相对路径,要以Spring Boot指定的静态资源目录为链接表达式的根目录,应使用绝对路径

<img th:src="@{/images/image.png}"/>

而静态资源地址和控制器路径冲突,则依据具体需求通过正则表达式修改控制器路径的描述即可

@{...}是链接URL表达式,目的是加载特定的资源(以URL形式),
所以

<img th:src="@{images/image.png}"/>

就等价于请求
http://localhost:8080/webapp/images/image,然后把相应的对象发送回给客户端进行解析和显示,也就是会走springMvc的请求了。
所以要么你直接写:

<img src="images/image.png" alt="..." />

要么考虑用nginx做一个静态资源服务器,设置凡是走/images路径的匹配到图片资源目录

推荐问题
宣传栏