-
핸들러 메소드 12부 - FlashAttributesSPRING/스프링 MVC 2021. 7. 9. 01:09
주로 리다이렉트시에 데이터를 전달할 때 사용한다.
- 데이터가 URI에 노출되지 않는다.
- 임의의 객체를 저장할 수 있다.
- 보통 HTTP 세션을 사용한다.
리다이렉트 하기 전에 데이터를 HTTP 세션에 저장하고 리다이렉트 요청을 처리 한 다음 그 즉시 제거한다. RedirectAttributes를 통해 사용할 수 있다.
@Controller @SessionAttributes("event") public class SampleController2 { // 이름 Form 화면 @GetMapping("/events/form/name") public String eventsForm(Model model, HttpSession httpSession) { model.addAttribute("event",new Event()); return "/events/form-name"; } // 이름 form에서 입력받은 내용 전송 @PostMapping("/events/form/name") public String eventForNameSubmit(@ModelAttribute @Validated(Event.ValidateName.class) Event event, BindingResult bindingResult, Model model, SessionStatus sessionStatus) { // @Validated 어노테이션을 통하여 Validation 체크에 맞지 않으면 다시 form으로 리턴 if(bindingResult.hasErrors()) { return "/events/form-name"; } // POST-REDIRECT-GET 패턴 // ( Post 이후에 브라우저를 리프래시 하더라도 폼 서브밋이 발생하지 않도록 하는 패턴) return "redirect:/events/form/limit"; } // limit Form 화면 @GetMapping("/events/form/limit") public String eventForLimit(@ModelAttribute Event event, Model model) { model.addAttribute("event",event); return "events/form-limit"; } // limit form에서 입력받은 내용 전송 @PostMapping("/events/form/limit") public String eventForLimitSubmit(@ModelAttribute @Validated(Event.ValidateLimit.class) Event event, BindingResult bindingResult, RedirectAttributes attributes, SessionStatus sessionStatus) { if(bindingResult.hasErrors()) { return "/events/form-limit"; } // 세션 데이터 초기화 sessionStatus.setComplete(); attributes.addFlashAttribute("newEvent",event); return "redirect:/events/list"; } // 이벤트 목록 페이지 @GetMapping("/events/list") public String getEvents(@ModelAttribute("newEvent") Event newEvent, Model model, @SessionAttribute LocalDateTime visitTime) { System.out.println(visitTime); // 리스트를 불러오는 부분 Event event = new Event(); event.setName("spring"); event.setLimit(10); List<Event> eventList = new ArrayList<>(); eventList.add(event); eventList.add(newEvent); model.addAttribute(eventList); return "/events/list"; } }
RedirectAttributes : redirect 시 URI 쿼리 파라미터에 데이터를 붙여 전송하기 때문에 String 타입으로 변환가능한 데이터만 전달할 수 있다.
FlashAttributes : 객체를 세션에 넣어서 전송할 수 있다.
데이터를 받는 쪽에서는 @ModelAttributes나 @Model을 이용하여 데이터를 전달 받을 수 있다.
1. @ModelAttribute
// 이벤트 목록 페이지 @GetMapping("/events/list") public String getEvents(@ModelAttribute("newEvent") Event newEvent, Model model, @SessionAttribute LocalDateTime visitTime) { System.out.println(visitTime); // 리스트를 불러오는 부분 Event event = new Event(); event.setName("spring"); event.setLimit(10); List<Event> eventList = new ArrayList<>(); eventList.add(event); eventList.add(newEvent); model.addAttribute(eventList); return "/events/list"; }
2. @Model
- model.asMap().get("newEvent"); 사용
// 이벤트 목록 페이지 @GetMapping("/events/list") public String getEvents( Model model, @SessionAttribute LocalDateTime visitTime) { System.out.println(visitTime); // 리스트를 불러오는 부분 Event event = new Event(); event.setName("spring"); event.setLimit(10); Event newEvent = (Event) model.asMap().get("newEvent"); List<Event> eventList = new ArrayList<>(); eventList.add(event); eventList.add(newEvent); model.addAttribute(eventList); return "/events/list"; }
'SPRING > 스프링 MVC' 카테고리의 다른 글
핸들러 메소드 14부 ResponseEntity 예제:) 다운로드 (0) 2021.07.10 핸들러 메소드 13부: MultipartFile (0) 2021.07.09 핸들러 메소드 11부 RedirectAttributes (0) 2021.07.08 핸들러 메소드 10부: @SessionAttribute (0) 2021.07.05 핸들러 메소드 9부 멀티 폼 서브밋 (0) 2021.07.05