Spring MVC @ModelAttribute не содержит отправленных результатов формы

У меня проблема с обработкой форм с использованием 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 и должен содержать поисковый запрос. Я не могу понять такое поведение.


person Maxim Kolesnikov    schedule 27.01.2013    source источник
comment
Попробуйте отобразить не на FieldSet, а на тег id = search html.   -  person Taky    schedule 27.01.2013
comment
Не могли бы вы быть более конкретными? У меня нет явных сопоставлений с FieldSet, его идентификатором или тегом формы. Объект формы сопоставлен с атрибутом th: object тимелеафа. Даже если я полностью удалю тег FieldSet, проблема все равно останется.   -  person Maxim Kolesnikov    schedule 27.01.2013


Ответы (3)


Spring должен сопоставить атрибуты HTML-формы с вашей моделью: SearchForm.

Spring MVC создает аккордеоны с параметрами запроса и свойствами объекта модели и устанавливает соответствующие свойства в объект модели перед передачей объекта в метод контроллера.

Вы назвали свойство HTML (и имя параметра запроса автоматически) как id = "search". Но у SearchForm такого свойства нет. Вместо этого у него есть свойство searchQuery. Поэтому после того, как Spring MVC не смог установить значение searchQuery в вашу SearchForm, он передает модель с атрибутом null.

person Taky    schedule 27.01.2013
comment
Вы правы, проблема решена. Это было довольно глупо. Атрибут name на моей странице должен содержать значение searchQuery. Он должен быть таким же, как имя атрибута формы. - person Maxim Kolesnikov; 27.01.2013

Измените th: value = "{searchQuery}" на th: field = " {searchQuery}".

Я надеюсь, что это сработает.

person SKC...    schedule 07.01.2014

У меня сработало:

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

Справочник

person deFreitas    schedule 20.12.2016