Spring MVC — паттерн PRG (Post/Redirect/Get)
Краткое описание шаблона веб проектирования PRG можно посмотреть здесь.
Перейдем к реализации PRG в Spring MVC.
В спринге шаблон можно реализовать несколькими способами. Для начала самый простой.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
@RequestMapping(value = "/secondPage", method = RequestMethod.POST) public String checkUser(@Valid @ModelAttribute("user") User user, BindingResult bindingResult, RedirectAttributes redirectAttributes) { if (!bindingResult.hasErrors()) { redirectAttributes.addFlashAttribute(object)); return "redirect:/mainpage" } return "indexpage"; } @RequestMapping(value = "/mainpage", method = RequestMethod.GET) public String goMainPage(HttpServletRequest request) { Map<String, ?> map = RequestContextUtils.getInputFlashMap(request); if (map != null) { logger.info("It is redirect!"); } else { logger.info("It is update!"); } a return "main"; } |
Здесь показан пример проверки данных указанных в форме логин-пароль и дальнейшее перенаправление на другую страницу. После нажатия на кнопку Submit в форме выполняется action="secondPage" , который попадает в первый метод. С помощью аннотации @Valid идет проверка данных и результат передается в bindingResult . Если ошибок нет, то возвращается значение с перенаправлением на страницу "redirect:/mainpage" . Затем мы попадаем в метод
1 2 |
@RequestMapping(value = "/mainpage", method = RequestMethod.GET) public String goMainPage(HttpServletRequest request) |
Где мы получаем указание перейти на страницу «main.jsp».
Часто возникает вопрос как определить текущая страница получилась путем перенаправления или пользователь открыл её сам. Для этого в Spring MVC предусмотрен интерфейс
1 |
public interface RedirectAttributes extends Model {} |
у которого есть методы добавления «флэш-аттрибутов». В отличии от других атрибутов перенаправления, которые указываются в конце целевого URL, «flash attributes» сохраняются в HTTP сессии (и следовательно не отображаются в URL). После обновления страницы они будут удалены.
Достать их можно с помощью такого выражения
Map<String, ?> map = RequestContextUtils.getInputFlashMap(request)
Map будет null, если на эту страницу мы были не перенаправлены.
Вторая реализация pattern’а PRG с помощью Spring MVC выглядит интереснее и позволяет использовать больше параметров.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
@RequestMapping(value = "/secondPage", method = RequestMethod.POST) public ModelAndView checkUser(@Valid @ModelAttribute("user") User user, BindingResult bindingResult, RedirectAttributes redirectAttributes) { ModelAndView modelAndView = new ModelAndView(); if (!bindingResult.hasErrors()) { RedirectView redirectView = new RedirectView("mainpage"); redirectView.setStatusCode(HttpStatus.MOVED_PERMANENTLY); modelAndView.setView(redirectView); redirectAttributes.addFlashAttribute(object)); } else { modelAndView.setViewName("indexPage"); } return modelAndView; } @RequestMapping(value = "/mainpage", method = RequestMethod.GET) public String goMainPage(HttpServletRequest request) { Map<String, ?> map = RequestContextUtils.getInputFlashMap(request); if (map != null) { logger.info("It is redirect!"); } else { logger.info("It is update!"); } a return "main"; } |
Здесь использован класс
1 |
public class RedirectView extends AbstractUrlBasedView implements SmartView {} |
и в качестве примера его метод void setStatusCode(HttpStatus statusCode) с указанием HttpStatus. Такая реализация дает больше возможностей и при этом совсем не сложная.
12One thought on “Spring MVC — паттерн PRG (Post/Redirect/Get)”
Добавить комментарий
Для отправки комментария вам необходимо авторизоваться.
В примерах переменная object не определена.