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
相关产品推荐
相关产品推荐

