스프링 웹 MVC-21.RedirectAttributes핸들러 메소드)
핸들러 메소드 11부: RedirectAttributes
리다이렉트 할 때 기본적으로 Model에 들어있는 primitive type 데이터는 URI 쿼리 매개변수에 추가된다.
- 스프링 부트에서는 이 기능이 기본적으로 비활성화 되어 있다.
- Ignore-default-model-on-redirect 프로퍼티를 사용해서 활성화 할 수 있다.
원하는 값만 리다이렉트 할 때 전달하고 싶다면 RedirectAttributes에 명시적으로 추가할 수 있다.
리다이렉트 요청을 처리하는 곳에서 쿼리 매개변수를 @RequestParam 또는 @ModelAttribute로 받을 수 있다.
@PostMapping(value = "/events/form/age")
public String eventsFormAgeSubmit(@Validated @ModelAttribute Event event,
BindingResult bindingResult,
SessionStatus sessionStatus,
Model model) {
if(bindingResult.hasErrors()){
return "/events/form-age";
}
// DB 저장
sessionStatus.setComplete();
// model에 담아놓으면
model.addAttribute("name", event.getName());
model.addAttribute("age", event.getAge());
return "redirect:/events/list"; // 쿼리스트링 자동으로 붙음
// ex.http://localhost:8080/events/list?name=aaaa&age=33
}
# 부트에서는 설정이 꺼져있음
spring.mvc.ignore-default-model-on-redirect=false
age 폼에서 실행하면,
리다이렉트 링크가 http://localhost:8080/events/list?name=aaaa&age=33 로 감.
하지만 원하는 값들만 주고 싶다면?
spring.mvc.ignore-default-model-on-redirect=false 설정은 없애고,
@PostMapping(value = "/events/form/age")
public String eventsFormAgeSubmit(@Validated @ModelAttribute Event event,
BindingResult bindingResult,
SessionStatus sessionStatus,
RedirectAttributes attributes) {
if(bindingResult.hasErrors()){
return "/events/form-age";
}
// DB 저장
sessionStatus.setComplete();
// 특정 값들만 주고 싶다면? model -> RedirectAttributes
attributes.addAttribute("name", event.getName()); // add한 것들만 쿼리스트링
attributes.addAttribute("age", event.getAge());
return "redirect:/events/list";
}
@GetMapping("/events/list")
public String getEvents(// @RequestParam 쿼리파라미터 / 하나씩 받아도 되고,
//@RequestParam String name,
//@RequestParam Integer age,
// 모델로 받아도 된다.
//@ModelAttribute Event newEvent, 이름 미지정시 에러, 세션에서 가져오려고 한다.
@ModelAttribute("newEvent") Event newEvent,
Model model,
@SessionAttribute LocalDateTime visitTime){
System.out.println(visitTime);
Event event = new Event();
event.setName("jaeuk");
event.setAge(30);
List<Event> eventList = new ArrayList<>();
eventList.add(event);
eventList.add(newEvent);
model.addAttribute(eventList);
return "/events/list";
}