Как передать значения th:object из html в контроллер

Как передать значения тимелеафа (th: object) в контроллер.

HTML:

<form id="searchPersonForm" action="#" th:object="${person}" method="post" >  
</form>

Сечперсонконтроллер:

@RequestMapping(value = "/modify/{pid}", method = RequestMethod.GET)
    public String modifyPersonData(Principal principal, @ModelAttribute("person") Person person, UserRoles userRoles, Model model, @PathVariable("pid") Long pid ) {
         //modify data
    }

Я пытаюсь пройти как @ModelAttribute("person") Person person, но это не получение значений формы с предыдущей страницы.

Может ли кто-нибудь помочь в этом.

Спасибо.


person Java_User    schedule 17.08.2015    source источник


Ответы (1)


Предпочтительно использовать th:action в качестве атрибута формы вместо action и указать привязку следующим образом:

<form th:action="@{/the-action-url}" method="post"
    th:object="${myEntity}">

    <div class="modal-body">
        <div class="form-group">
            <label for="name">Name</label> <input type="text"
                class="form-control" id="name" th:field="*{name}"> </input>
        </div>

        <div class="form-group">
            <label for="description">Description</label> <input type="text"
                class="form-control" id="description"
                th:field="*{description}"> </input>
        </div>
    </div>
</form>

Я поддерживаю эту форму контроллером Spring, который инициализирует атрибут модели (объект myEntity в форме). Это соответствующая часть класса контроллера:

@ModelAttribute(value = "myEntity")
public Entity newEntity()
{
    return new Entity();
}

Аннотация @ModelAttribute гарантирует, что объект модели инициализируется Spring для каждого запроса.

Установите модель с именем «command» во время первого запроса на получение вашего контроллера:

@RequestMapping(value = "/", method = RequestMethod.GET)
public ModelAndView getRanks(Model model, HttpServletRequest request)
{
    String view = "the-view-name";
    return new ModelAndView(view, "command", model);
}

И, чтобы получить доступ к модели в том виде, в каком она получается после отправки формы, реализуйте относительный метод:

@RequestMapping(value = "/the-action-url", method = RequestMethod.POST)
public View action(Model model, @ModelAttribute("myEntity") Entity myEntity)
{
    // save the entity or do whatever you need

    return new RedirectView("/user/ranks");
}

Здесь параметр, аннотированный @ModelAttribute, автоматически привязывается к отправленному объекту.

person Evil Toad    schedule 17.08.2015
comment
Спасибо за объяснение. Могу ли я задать несколько сомнений. 1. У меня есть 5 кнопок отправки на текущей странице (странице поиска), таких как поиск, копирование, просмотр/изменение,.. Таким образом, у нас нет URL-адреса по умолчанию для указания th:action="@{/the-action-url}" . 2. Раньше я использовал `RequestMethod.POST` для modifyPersonData и получал Person значения формы из представления, просто используя Person person без @ModelAttribute("person"). Но когда я изменил значения `RequestMethod.GET, I am not able to retrieve Person` и попытался использовать @ModelAttribute("person") Person person, это тоже не работает. - person Java_User; 18.08.2015
comment
1. Вы можете использовать 5 форм (по одной для каждой кнопки) с разными URL-адресами действий ИЛИ дополнительным параметром (например, скрытым полем) и небольшим количеством javascript, чтобы различать нажатую кнопку. 2. Если вы сопоставите метод контроллера с запросами GET ( @RequestMapping(value = "/modify/{pid}", method = RequestMethod.GET) ), то он не будет соответствовать форме, настроенной на использование поста. - person Evil Toad; 18.08.2015
comment
Спасибо, Злой Тодд. Я хочу сопоставить контроллер с запросами GET, поэтому мне нужно изменить форму как получить. Но это передает все поля ввода в URL-адресе. Поэтому я подумал, что атрибут модели может обрабатывать, когда форма настроена на публикацию, а контроллер получен. - person Java_User; 19.08.2015