【问题标题】:Create urls using forms in Thymeleaf在 Thymeleaf 中使用表单创建 url
【发布时间】:2020-04-01 08:40:21
【问题描述】:

我是 Thymeleaf 的新手,在使用表单动态创建 URL 时遇到问题。

我有一个简单的 Spring Boot 应用程序,将对象存储在数据库中,我可以使用简单的 url 查询数据库。例如,url /distance/0.3 将返回距离属性小于或等于 0.3 的对象。当我在浏览器中编辑这些 url 时,它们可以完美运行。

我希望用户能够自己设置这些搜索值。我尝试创建一个简单的表单来使用用户输入创建上述 url,但我收到以下错误:

    Neither BindingResult nor plain target object for bean name 'dist' available as request attribute

我已经在 html 文档中尝试过:

<form th:action="@{/distance/{pathParam}(pathParam=${dist}}">`
    <p>Distance: <input type="text" th:field="*{dist}" /></p>
    <p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
</form>

并尝试来自this discussion 的各种答案,但没有运气。

我也尝试按照here 的建议使用控制器,在控制器中使用这个:

@GetMapping("/distance/search/")
public String userSetDistance(@RequestParam("dist") String dist) {

    return "redirect:/distance/" + dist;
}

这在 html 文件中:

<form th:action="@{/distance/search/}">
    <p>Distance: <input type="text" th:field="*{dist}" /></p>
    <p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
</form>

但这也不起作用。

你能帮我解决这个问题吗?这个想法很简单,但我无法得到有效的东西......谢谢!

更新

根据 MohamedSanaulla 的以下回答,我决定使用控制器来执行此操作,创建了一个包含必填字段的“表单”对象,并按如下方式编辑了我的代码:

<form action="#" th:action="@{/distance/search}" th:object="${param}" method="post">`
    <p>Distance: <input type="text" th:field="*{dist}"/></p>
    <p><input type="submit" value="Submit" /> <input type="reset" value="Reset" /></p>
</form>


@PostMapping("/distance/search")
 public String userGetClose(@ModelAttribute ("param") Forms form) {
    String distance = String.valueOf(form.getDist());
 return "redirect:/distance/" + distance;
 }

理想情况下,我想直接从 html 页面创建和调用 url,以避免返回控制器只是为了创建 url,但这工作正常。

【问题讨论】:

    标签: spring-boot url thymeleaf


    【解决方案1】:

    您必须在控制器中使用ModelMapModel,然后使用addAttribute 设置dist

    public String controllerMethod(@RequestParam("dist") String dist, 
      Model model){
      model.addAttribute("dist", dist);
      return "viewName";
    }
    

    或者 Thymeleaf 提供上下文对象来直接在您的 HTML 中获取查询参数,例如 ${param.dist}

    更新:

    刚刚看到控制器中有一个redirect:。所以dist 在请求参数中不再可用,因此${param.dist} 将不起作用。更简单的解决方案是使用ModelMap 并将dist 作为视图模型的一部分。

    【讨论】:

    • 感谢您的回答。直接在 html 文件中执行此操作将是我的首选解决方案,但是当我执行此操作时:
      `

      Distance :

      或者这个:
      `

      距离:

      我还是报错
    • 我得到的错误是:Bean name 'param' 的 BindingResult 和普通目标对象都不能用作请求属性
    • 基于thymeleaf.org/doc/tutorials/3.0/…。您应该能够在 param 对象中获取查询参数。
    猜你喜欢
    • 2015-10-08
    • 2015-04-19
    • 2017-10-08
    • 2023-01-01
    • 2020-07-28
    • 2015-10-05
    • 2015-09-15
    • 2021-03-12
    • 1970-01-01
    相关资源
    最近更新 更多