4

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 + "]";
    }
}

問題は、コントローラーのこの時点でログインがnullになることです。

String login = searchForm.getSearchQuery();

POSTメソッド用に作成された新しいSearchFormオブジェクトのように見えますが、GETステップで作成され、検索クエリが含まれているはずのオブジェクトがすでに存在します。私はそのような行動を理解することはできません。

4

3 に答える 3

3

Springは、HTMLフォーム属性をモデルにマップする必要があります:SearchForm

Spring MVCは、リクエストパラメーターとモデルオブジェクトプロパティを使用してアコーディオンを構築し、オブジェクトをコントローラーメソッドに渡す前に、一致するプロパティをモデルオブジェクトに設定します。

HTMLプロパティにid="search"という名前を付けました(そしてパラメータ名を自動的に要求します)。しかし、SearchFormにはそのようなプロパティはありません。代わりに、searchQueryプロパティがあります。したがって、Spring MVCがsearchQuery値をSearchFormに設定できなくなった後、null属性を持つモデルを渡します。

于 2013-01-27T12:19:28.850 に答える
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";
    }

}

form-test-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;
    }
}

参照

于 2016-12-20T04:36:38.820 に答える