스프링 웹 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";
    }





© 2019. by jaeuk