-
Spring MVC(RedirectAttribute)웹개발/Spring 2020. 7. 30. 19:31
이 내용은 인프런의 스프링 웹 MVC강좌를 참고하여 만들었습니다.
이전에 폼 서블릿 오류로 인하여 post방식으로 받은 것을 다시 get 매핑으로 redirect 하여 처리하는 것에 대하여 공부를 하였다.
이번에는 redirect를 할 때 값을 전달하는 몇 가지 방법에 대하여 살펴본다.
1, model을 이용하는 방법
- 기본적으로 스프링 부트에서는 지원을 하지 않는다.(WebMvcProperties에서 ignoreDefaultModelOnRedirect값이 true 이기 때문)
- 설정을 바꾸기 위해서는 application.properties에 다음과 같은 구문을 추가
spring.mvc.ignore-default-model-on-redirect=false
2, 파라미터로 RedirectAttributes를 사용하면 넘기기 원하는 파라미터를 넘길 수 있다.
- URI에 파라미터가 노출이 될 수 있는 단점을 가지고 있음
-redirect요청을 처리하는 곳에서 쿼리 매개변수를 @RequestParam 혹은 @ModelAttribute로 받을 수 있다.
- model.getAttribute()를 하게 되면 위에 @SessionAttributes어노테이션의 인지와 이름이 같으면 자동적으로 세션이 생성이 된다.
@Controller @SessionAttributes("event") public class EventController { @GetMapping("/events/form/name") public String eventsForm(Model model){ model.addAttribute("event",new Event()); return "events/form-name"; } @PostMapping("/events/form/name") public String getEvent(@Valid @ModelAttribute Event event, BindingResult bindingResult, Model model) { if(bindingResult.hasErrors()){ return "events/form-name"; } return "redirect:/events/form/limit"; } @GetMapping("/events/form/limit") public String eventsForm2(@ModelAttribute Event event, Model model){ model.addAttribute("event",event); return "events/form-limit"; } @PostMapping("/events/form/limit") public String getEvent2(@Valid @ModelAttribute Event event, BindingResult bindingResult, Model model, RedirectAttributes attributes) { if(bindingResult.hasErrors()){ return "events/form-limit"; } attributes.addAttribute("name",event.getName()); attributes.addAttribute("limit",event.getLimit()); return "redirect:/events/list"; } @GetMapping("/events/list") public String getEvents( @ModelAttribute("newEvent") Event event, Model model){ Event event1 = new Event(); event1.setName(event.getName()); event1.setLimit(event.getLimit()); Event event2 = new Event(); event2.setName("test"); event2.setLimit(10); List<Event> eventList = new ArrayList<>(); eventList.add(event2); eventList.add(event1); model.addAttribute(eventList); return "events/list"; } }
3, RedirectAttributes변수에서 addFlashAttribute를 사용해서도 인자 전달이 가능하다.
- 데이터가 URI에 노출이 되지 않는다.
- 임의의 객체를 저장할 수 있고 http 세션을 사용하기 때문에 redirect요청을 처리하게 되면 그 즉시 제거를 한다.
-@ModelAttribute를 사용 시 인자를 name명과 맞춰 주워야 찾아서 매핑이 가능하다.
@Controller @SessionAttributes("event") public class EventController { @GetMapping("/events/form/name") public String eventsForm(Model model){ model.addAttribute("event",new Event()); return "events/form-name"; } @PostMapping("/events/form/name") public String getEvent(@Valid @ModelAttribute Event event, BindingResult bindingResult, Model model) { if(bindingResult.hasErrors()){ return "events/form-name"; } return "redirect:/events/form/limit"; } @GetMapping("/events/form/limit") public String eventsForm2(@ModelAttribute Event event, Model model){ model.addAttribute("event",event); return "events/form-limit"; } @PostMapping("/events/form/limit") public String getEvent2(@Valid @ModelAttribute Event event, BindingResult bindingResult, Model model, RedirectAttributes attributes) { if(bindingResult.hasErrors()){ return "events/form-limit"; } attributes.addFlashAttribute("newEvent",event); return "redirect:/events/list"; } @GetMapping("/events/list") public String getEvents( @ModelAttribute("newEvent") Event event, Model model){ Event event1 = new Event(); event1.setName(event.getName()); event1.setLimit(event.getLimit()); Event event2 = new Event(); event2.setName("test"); event2.setLimit(10); List<Event> eventList = new ArrayList<>(); eventList.add(event2); eventList.add(event1); model.addAttribute(eventList); return "events/list"; } }
'웹개발 > Spring' 카테고리의 다른 글
Spring MVC(@RequestBody, HttpEntity, @ResponseBody, ResponseEntity) (0) 2020.07.30 Spring MVC(MultipartFile와ResponseEntity) (0) 2020.07.30 Spring MVC(세션 관리) (0) 2020.07.28 Spring MVC(폼 서블릿 오류 해결) (0) 2020.07.28 Spring MVC(@ModelAttribute, @Valid, @Validated) (0) 2020.07.28