Я пытаюсь реализовать УСПОКОИТЕЛЬНЫЕ URL в своем Spring приложение MVC. Все хорошо за исключением обработки представлений формы. Я должен перенаправить или назад к исходной форме или к странице "успеха".
@Controller
@RequestMapping("/form")
public class MyController {
@RequestMapping(method = RequestMethod.GET)
public String setupForm() {
// do my stuff
return "myform";
}
@RequestMapping(method = RequestMethod.POST)
public String processForm(ModelMap model) {
// process form data
model.addAttribute("notification", "Successfully did it!");
return "redirect:/form";
}
}
Однако когда я читал в документации Spring, если Вы перенаправите какие-либо параметры, то будет помещен в URL. И это не работает на меня. Каков был бы самый корректный путь вокруг этого?
http://jira.springframework.org/browse/SPR-6464 предоставил мне то, что мне было нужно, чтобы заставить все работать, пока Spring MVC не предложит эту функциональность (потенциально в релизе 3.0.2). Пока я просто временно реализовал имеющиеся у них классы и добавил фильтр в контекст моего веб-приложения. Работает отлично!
Вместо этого можно заставить processForm()
возвращать объект View, и пусть он возвращает конкретный тип RedirectView
, который имеет параметр для setExposeModelAttributes()
.
Когда вы возвращаете имя представления с префиксом "redirect:"
, Spring MVC все равно преобразует его в объект RedirectView
, только делает это с setExposeModelAttributes
в true (что, на мой взгляд, является странным значением по умолчанию).
Если вы не хотите, чтобы в URL-адресе отображалось сообщение об успешном завершении, то один из вариантов - поместить его в сеанс (в методе processForm), а затем проверить для него (и удалите его) в методе setupForm.
Отредактировано для добавления: если это сложно сделать вручную, вы можете написать подкласс RedirectView, который добавляет атрибут «сообщение» и завершает процесс его вставки в сеанс. Не уверен, однако, есть ли простой способ обернуть получение сообщения обратно из сеанса ...
Честно говоря, я не думаю, что есть простой ответ - природа перенаправления HTTP такова, что состояние isn ' t перенесено; если вы все равно хотите поддерживать состояние, вы застряли с различными обычными способами поддержания состояния в веб-приложениях: сеанс, файл cookie, строка запроса ...