我在使用Thymeleaf和Spring-MVC进行表单处理方面存在问题。 这是我的观点:
<html xmlns:th="http://www.thymeleaf.org">
<head>
</head>
<body>
<div class="container" id="containerFragment" th:fragment="containerFragment">
<form
action="#"
th:action="@{/search}"
th:object="${searchInfo}"
method="post" >
<fieldset id="search-query">
<input
type="text"
name="search"
value=""
id="search"
placeholder="Search for user"
required="required"
th:value="*{searchQuery}" />
<input
type="submit"
value="Search"
name="submit"
class="submit"/>
</fieldset>
</form>
</div>
</body>
</html>
这是我的控制者:
/** Search form */
@RequestMapping(value = "/search", method = RequestMethod.GET)
public String search(Model model) {
model.addAttribute("searchInfo", new SearchForm());
return "search";
}
/** Search form */
@RequestMapping(value = "/search", method = RequestMethod.POST)
public ModelAndView search(BindingResult result,
@Valid @ModelAttribute("searchInfo") SearchForm searchForm) {
String login = searchForm.getSearchQuery();
User user = userService.findUserByLogin(login);
ModelAndView modelAndView = new ModelAndView();
modelAndView.setViewName("search-results");
modelAndView.addObject("user", user);
return modelAndView;
}
,搜索表单为:
public class SearchForm {
String searchQuery;
public String getSearchQuery() {
return searchQuery;
}
public void setSearchQuery(String searchQuery) {
this.searchQuery = searchQuery;
}
@Override
public String toString() {
return "SearchForm [searchQuery=" + searchQuery + "]";
}
}
问题是控制器此时登录为空:
String login = searchForm.getSearchQuery();
它看起来像是为POST方法创建的一个新的SearchForm对象,但是已经有一个在GET步骤创建并且应该包含搜索查询的对象。 我无法理解这种行为。
答案 0 :(得分:3)
Spring应该将HTML表单属性映射到您的模型: SearchForm 。
Spring MVC使用请求参数和模型对象属性构建手风琴,并在将对象传递到控制器方法之前将匹配属性设置到模型对象中。
您将HTML属性(并自动请求参数名称)命名为id =“search”。但SearchForm没有这样的属性。相反,它有searchQuery property。因此,在Spring MVC无法将searchQuery值设置到您的SearchForm之后,它会使用 null 属性传递模型。
答案 1 :(得分:0)
请将th:value =“ {searchQuery}”更改为:field =“ {searchQuery}”。
我希望它能奏效。
答案 2 :(得分:0)
它对我有用:
FormTestController.java
@Controller
public class FormTestController {
@RequestMapping(value = "/form-test-1.jhtml", method = RequestMethod.GET)
public String formTest1(@ModelAttribute("form1") Form1TestVO form1TestVO, Model model){
System.out.println("You've submited: " + form1TestVO.getName())
model.addAttribute("form1", new Form1TestVO("Form 1 test"));
return "form-test-1";
}
}
形式试验1.HTML
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml" xmlns:th="http://www.thymeleaf.org" xmlns:layout="http://www.thymeleaf.org" >
<head>
<title>Form test 1</title>
</head>
<body >
<form th:object="${form1}" th:action="@{/form-test-1.jhtml}" >
<input th:field="*{name}" />
<button>Send</button>
</form>
</body>
</html>
Form1TestVO
public class Form1TestVO {
private String name;
public Form1TestVO() {
}
public Form1TestVO(String name) {
this.name = name;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
}