如何在 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
,然后将东西放入其中。免去添加额外参数时修改方法的麻烦,只需更改 SearchParameters
和 BookService
实现即可。
现在让您的表单使用 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>
像上面这样的事情应该做。
我有一个端点:
@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
,然后将东西放入其中。免去添加额外参数时修改方法的麻烦,只需更改 SearchParameters
和 BookService
实现即可。
现在让您的表单使用 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>
像上面这样的事情应该做。