当前位置: 首页 > 知识库问答 >
问题:

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

李凯定
2023-04-27

问题描述

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改变位置

共有2个答案

姬欣怡
2023-04-27

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

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

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

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

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

夏侯涵映
2023-04-27

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

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

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

 类似资料:
  • 我的双链表有两个虚拟节点,头部和尾部。函数对我来说非常适合,但是当我尝试使用与相同的算法时,它会一直为我打印虚拟节点。为什么会这样? 预期结果: 我的结果:

  • 我正在使用Bootstrap4框架创建一个移动第一站点。我正在尝试创建一个JavaScript函数,它将在

  • 本文向大家介绍js中的如何定位固定层的位置,包括了js中的如何定位固定层的位置的使用技巧和注意事项,需要的朋友参考一下 需要获取一些HTML的对象的坐标来更灵活的设置目标层的坐标,这里可以通过用到document.body.scrollTop等属性,但是这些属性在xhtml的标准网页中或更简单的说就是带<!DOCTYPE...>的标签中得到的值是0;如果不要此标签则一切正常,那么在xhtml中如何

  • 本文向大家介绍Spring Boot 中的静态资源放置位置,包括了Spring Boot 中的静态资源放置位置的使用技巧和注意事项,需要的朋友参考一下 当我们使用 SpringMVC 框架时,静态资源会被拦截,需要添加额外配置,之前老有小伙伴在微信上问松哥Spring Boot 中的静态资源加载问题:“松哥,我的HTML页面好像没有样式?”,今天我就通过一篇文章,来和大伙仔细聊一聊这个问题。 SS