You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

SpringBoot(Thymeleaf指定版本):如何根据变量构造表单th:action URL?

解决Thymeleaf动态表单action的问题

你的写法问题出在混淆了Thymeleaf URL模板的占位符用法和直接表达式拼接的语法,导致引擎无法正确解析动态URL。咱们来一步步修正:

原写法的核心问题

你试图把条件表达式放在URL模板占位符{baseUrl}中,再通过(baseUrl=${...})赋值,这种混合写法不符合Thymeleaf的URL语法规范,自然无法生效。

正确的实现方式

根据你的需求(当name为空时提交到根路径/,否则提交到/user/find/),可以用以下两种简洁的写法:

方式一:直接在@{}中嵌入条件表达式

这是最直观的写法,直接通过Thymeleaf的表达式生成完整的action URL:

<form method="get" th:action="@{${#strings.isEmpty(name) ? '/' : '/user/find/'}}">
    <input type="text" th:value="${name}" name="name"/>
    <button type="submit">Find</button>
</form>

注意:我给input加了name="name"属性,这样提交时name的值才能作为GET参数传递到后端,否则参数会丢失。

方式二:如果需要将name嵌入路径中(比如/user/find/{name})

如果你的实际需求是当name不为空时,URL直接包含name(而非作为参数),可以这样写:

<form method="get" th:action="@{${#strings.isEmpty(name) ? '/' : '/user/find/' + name}}">
    <input type="text" th:value="${name}" name="name"/>
    <button type="submit">Find</button>
</form>

这种写法会在name不为空时生成类似/user/find/john的URL,同时依然保留input的参数传递(如果需要的话)。

补充说明

Thymeleaf的@{}语法支持直接嵌入Spring EL表达式,所以不需要额外的占位符来拼接动态内容。只要表达式返回合法的字符串路径,就能正确渲染出对应的action URL。

内容的提问来源于stack exchange,提问作者Victor IT

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.25 02:23:51