Spring MVC:如何在 Thymeleaf 中获取当前 url

Posted

技术标签:

【中文标题】Spring MVC:如何在 Thymeleaf 中获取当前 url【英文标题】:Spring MVC: How do I get current url in Thymeleaf 【发布时间】:2014-06-21 09:07:51 【问题描述】:

我正在将Thymeleaf Template Engine 与 Spring Web MVC 一起使用,但在当前 url 的帮助下创建 url 时我被卡住了。有没有办法在 Thymeleaf html 文件中获取最新信息? eg:假设我当前浏览器地址栏中的url是:

http://localhost:8080/project/web/category/mobiles

现在我想创建一个这样的网址http://localhost:8080/project/web/category/mobiles/store/samsung

http://localhost:8080/project/web/category/mobiles?min_price=10&max_price=100

所以我的代码看起来像这样

<a th:with="currentUrl='http://localhost:8080/project/web/category/mobiles'" 
   th:href="@__$currentUrl__/__$store.name__">
    Click to More Result
</a>

这里我使用带有硬编码 url 的 currentUrl 变量,所以我想要一些相同的解决方案。硬编码值不会每次都有效,因为我有动态类别。

我对相对 url 进行了同样的尝试,但它对我不起作用。

<a th:href="@/store/__$store.name__">Click to More</a>

//will produce: http://localhost:8080/project/web/store/samsung
//I want: http://localhost:8080/project/web/category/mobiles/store/samsung

请看一下,如果我做错了什么,请告诉我。

【问题讨论】:

为什么需要完整的 URL?为什么不简单地使用相对 URL? 在我的情况下,http://localhost:8080/project 是我的基本网址,/web/category/categoryName 由控制器映射。我尝试了相对但它似乎不起作用,我将它用于相对网址&lt;a th:href="@/store/__$store.name__&gt;" Click to More&lt;/a&gt; 【参考方案1】:

哦,我找到了解决方案。我错过了文档中的#httpServletRequest.requestURI

这是对我有用的解决方案:

<a th:href="@__$#httpServletRequest.requestURI__/store/__$store.name__">Click to More</a>
//Will produce: http://localhost:8080/project/web/category/mobiles/store/samsung

【讨论】:

$#httpServletRequest.requestURI 工作得很好(Thymeleaf Spring4 2.1.5) 在我的应用程序中,requestURI 给我这样的东西:[/store/something] 而 requestURL 给我这样的东西:[example.com/store/something]。我选择 requestURL 因为完整的 url 更适合我的用例。 给未来的读者; you can use $#request.requestURI in Thymeleaf 3.0(Link) 请注意#httpServletRequest.requestURI 不包括查询字符串或片段。【参考方案2】:

您可以使用两个单引号 ' 获取当前 URL。示例:

<a th:href="@''(lang=de)">Deutsch</a>

请注意,这很遗憾不包括现有的 URL 参数。

【讨论】:

我刚刚又试了一次,它成功了...:当前页面。你的 Thymeleaf 版本是什么?我用的是 3.0.2。 对我也不起作用。我正在使用 3.0.3;你的例子呈现了这个&lt;a href=""&gt;Current Page&lt;/a&gt; 不错的解决方案。适用于 Spring 5.0.4、Spring Boot 2.0、Thymeleaf 3.0.9 请注意,虽然这可行,但它不会返回完整的 url;它生成相对网址【参考方案3】:

如果请求的 url 例如:http://localhost:8080/my-page

我可以得到这个值:/my-page 使用这个:httpServletRequest.requestURI

例如,如果你必须加载一些资源,你可以使用:

<script th:src="@|$#httpServletRequest.requestURI/main.js|"></script>

渲染后的 html 将是:

<script src="/my-page/main.js"></script>

【讨论】:

以上是关于Spring MVC:如何在 Thymeleaf 中获取当前 url的主要内容,如果未能解决你的问题,请参考以下文章

Spring MVC:如何在每个 Thymeleaf 页面上重新加载数据库中的登录用户信息?

Spring MVC、Tiles2、ThymeLeaf 和自然模板

Spring MVC 3.2 Thymeleaf Ajax 片段

Spring MVC + Thymeleaf:将变量添加到所有模板的上下文中

Thymeleaf 和 Spring MVC 的表单参数为空

Spring-Boot + Spring-MVC + Thymeleaf + Apache Tiles