如何在 Thymeleaf 中获取请求参数

How to get Request params in Thymeleaf

我有一个端点:

 @GetMapping("book/param")
    public String bookByParam(
   @RequestParam(required = false,name = "name") String name,
   @RequestParam(required = false,name = "author") String author,
   @RequestParam(required = false,name = "genre") String genre,
   @RequestParam(required = false,name = "genre") int price, Model m
){
  List<Books> books = bookService.showSpecificBooks(name, author, genre,price);
        m.addAttribute("books", books);
        return "book";
    }

对于参数,我编写了查询,因此它们可以为空,这意味着如果我不输入任何内容,我将获得所有书籍。

现在我的 books.html 模板具有以下实现:

<form th:action="@{book/param}" th:object="${books}" method="get">

<label for="name">name:</label><br>
    <input type="text" id=name th:field="name" placeholder="name">

    <label for="author">author:</label><br>
    <input type="text" id=author th:name="author" placeholder="author">

    <label for="genre">genre:</label><br>
    <input type="text" id=genre th:name="genre" placeholder="genre">

 <label for="price">price:</label><br>
    <input type="number" id=price th:name="price" placeholder="price">
</form>

我希望我能得到提交值范围内的书籍列表,当我没有输入时,我会得到(因为我的查询)所有书籍,但我得到的只是一个 TemplateInputException:一个错误在模板解析期间发生。我还尝试像这样包装对象名称:

 <input type="text" id=name th:field="*{name}" placeholder="name">

   

或者像这样:

 <input type="text" id=name th:field="${name}" placeholder="name">

但不幸的是它没有用。任何人都可以看到我在做什么。 提前致谢

th:field 适用于实体。据我所知 name 是一个请求参数。尝试使用 th:name,就像您对作者、流派、价格所做的那样。

 <input type="text" id=name th:name="name" placeholder="name">

为了遍历图书列表,您可以尝试这样做:

<tr th:each="book : ${books}"> 
   <td><span th:text="${book.name}"> Title </span></td> 
   <td><span th:text="${book.author}"> Author </span></td> 
   <td><span th:text="${book.genre}"> Genre</span></td> 
   <td><span th:text="${book.price}"> Price</span></td> 
</tr> 

在这种情况下,不需要 @RequestParam,因为字段可以在 Book 实体中找到。

使用模型对象并将其绑定到表单而不是单独的查询参数。 \

public class SearchParameters {

  private String name, genre, author;
  private int price;

  // getters / setters
}

@ModelAttribute("params")
public SearchParams params() {
  return new SearchParamters ();
}

@GetMapping("book/param")
public String bookByParam(@ModelAttribute("params") SearchParamters params, Model m
){
 List<Books> books = bookService.showSpecificBooks(params.getName(), params().getAuthor(), params.getGenre(), params.getPrice());
  m.addAttribute("books", books);
  return "book";
}

提示:您也可以将 SearchParameters 传递给您的 BookService,然后将东西放入其中。免去添加额外参数时修改方法的麻烦,只需更改 SearchParametersBookService 实现即可。

现在让您的表单使用 params 作为对象并引用字段。

<form th:action="@{book/param}" th:object="${params}" method="get">

<label for="name">name:</label><br>
    <input type="text" id=name th:field="name" placeholder="name">

    <label for="author">author:</label><br>
    <input type="text" id=author th:field="author" placeholder="author">

    <label for="genre">genre:</label><br>
    <input type="text" id=genre th:field="genre" placeholder="genre">

    <label for="price">price:</label><br>
    <input type="number" id=price th:field="price" placeholder="price">
</form>

这会将您的表单对象绑定到 thymeleaf 表单,您将看到之前输入的数据。

要显示您的结果,您需要遍历 books 列表并将它们显示在 table(或其他内容)中。

<table>
  <tr><th>Name</th><th>author</th><th>Genre</th><th>Price</th></tr>
    <tr th:each="book : ${books}">
      <td th:text="${book.name}">Name</td>
      <td th:text="${book.author}">Author</td>
      <td th:text="${book.genre}">Genre</td>
      <td th:text="${book.price}">Price</td>
    <tr>
</table>

像上面这样的事情应该做。