Spring Boot Thymeleaf路径变量不起作用,我做错了什么?

zlhcx6iw  于 2023-06-22  发布在  Spring
关注(0)|答案(2)|浏览(166)

有些东西阻止我在HTML表单中使用Thymeleaf和HTML设置路径变量。我想简单地在表单中输入33并获得localhost:8080/blog/33作为URL,但我只能获得查询字符串或格式错误的括号等。
一些示例尝试和结果:
@{/blog/{id}(id =${id})}
localhost:8080/blog/?ID = 33
@{/blog/+${id}}
localhost:8080/blog/+%20$%7Bid%7D?ID = 33
我想要的是
localhost:8080/blog/33
此表单的完整代码如下:

<!DOCTYPE HTML>
<html xmlns:th="https://www.thymeleaf.org">
    <head>
        <title>Form Submission</title>
        <style>
            button{
                margin-top:20px;
                width: 250px;
            }
        </style>
    </head>
    <body>
        <h2>Delete Entry</h2>
        <form action="#" th:action="@{/blog/{id}(id = ${id})}" th:object="${blog}" method="get" >  
            <fieldset>
                <p>Delete ID: <input type="text" th:field="*{id}" required /></p>
                <p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
            </fieldset>
        </form>
        <button onclick="window.location.href = '/'">Menu</button>
    </body>
</html>
tjrkku2a

tjrkku2a1#

此语法正确:@{/blog/{id}(id = ${id})}
你得到localhost:8080/blog/?id=33的原因可能是因为在表单创建时${id}是空的,当你点击提交按钮时,它将?id=33添加到url中(因为方法是get,你有一个相同的name="id"输入:<input type="text" th:field="*{id}" required />
没有html/thymeleaf方法(没有JavaScript)可以将表单字段放入URL的路径部分(如果这是您所期望的)。如果你想这样做,你必须使用一个JavaScript库。

5gfr0r5j

5gfr0r5j2#

我也有同样的问题,但我对这应该如何工作有一个误解。所以对于每个仍在为此而奋斗的人来说,这里有另一个描述。也许会有帮助
我喜欢在浏览器中看到的是:

data-url="jobendpoint/deletestatistics/16/57?jobStatisticsId=3"

Spring模型中的预设:jobid=16ts.id=57js.id=3
所以我做的是:

th:data-url="@{jobendpoint/deletestatistics/{jobid}/{ts.id}(jobStatisticsId = ${js.id})}"

这导致浏览器中的以下输出(错误):

data-url="jobendpoint/deletestatistics/{jobid}/{ts.id}?jobStatisticsId=3"

但如果我做了以下事情

th:data-url="|jobendpoint/deletestatistics/${jobid}/${ts.id}/${js.id}|"

这导致浏览器中的输出(工作,但不像它应该的那样):

data-url="jobendpoint/deletestatistics/16/57/3"

现在我可以确定值在后端设置正确。但是为什么他们没有正确地打印出来呢?

正确的方法是:

th:data-url="@{jobendpoint/deletestatistics/{jobid}/{ts.id}(jobid=${jobid}, ts.id=${ts.id}, jobStatisticsId = ${js.id})}"

或者说得更明白些

th:data-url="@{jobendpoint/deletestatistics/{a}/{b}(a=${jobid}, b=${ts.id}, jobStatisticsId = ${js.id})}"

所以关键是,这个表达式@{jobendpoint/deletestatistics/{jobid}/{ts.id}...的第一部分中的路径变量是thymeleaf的一些局部变量,当然局部变量必须被设置/初始化。这发生在支架部分(jobid=${jobid}**, ...)中。
Spring-Boot模型变量只在括号部分可见,所以我必须“复制/重新初始化”它们,使它们在表达式本身中也可用。
希望这能帮助到其他人...

相关问题