Spring MVC @ModelAttribute不包含提交的表单结果

时间:2013-01-27 11:25:28

标签: java spring-mvc thymeleaf

我在使用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步骤创建并且应该包含搜索查询的对象。 我无法理解这种行为。

3 个答案:

答案 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;
    }
}

Reference