본문 바로가기
Java

[Spring] ModelAndView 와 ViewResolver

by 준토리73 2022. 11. 4.

:redirect 리턴방식 비교 

ModelAndView ViewResolver
ModelAndView.setViewName()에서 
redirect:가 붙지 않으면 무조건 InternalResourceViewResolver가 설정한 prefix와 suffix 정보가 적용된 .jsp 파일을 찾고, 

redirect:가 붙으면 InternalResourceViewResolver 설정 정보는 무시되고 Context path 위치에서 .jsp 파일을 찾는다
 

 

Redirect vs Forward

http://jonggs.blogspot.com/2018/11/spring-redirect-forward.html

 

[Spring] Redirect와 Forward의 차이에 대해

들어가며 예전에 Spring Project를 진행하면서 redirect와 forward차이점에 대해 궁금하였지만 지금에 와서야 차이점을 알게 되었고 정리하기 위해 작성합니다. Redirect란? Client가 Server에 Re...

jonggs.blogspot.com

 

ModelAndView ViewResolver
Model과 View를 한번에 담을 수 있는 객체 
메소드를 String이 아닌 ModelAndView로 만들고, 그 객체에 addObject를 이용하여 데이터를 담을 수 있음 

Controller 처리 결과 후 응답할 View와 View에 전달할 값을 저장 
: 렌더링하고자 하는 View의 논리적 이름과 해당 View에서 사용할 Model을 함께 설정 
✔ 실행할 view를 찾는 일을 한다
✔ 페이지 컨트롤러가 리턴한 뷰 이름에 해당하는 뷰 컴포넌트를 찾는 역할 

ModelAndView

: Controller 처리 결과 후 응답할 View와 View에 전달할 값을 저장 

 

 

생성자 

- ModelAndView(String viewName) : 응답할 View 설정 

- ModelAndView(String viewName, Map values) : 응답할 view와 view로 전달할 값들을 저장한 Map 객체

@RequestMapping("/response-view-v1")
public ModelAndView responseViewV1() {
    ModelAndView modelAndView = new ModelAndView("response/hello").addObject("data", "test");
    return modelAndView;
}

 

ModelAndView 주요 메소드 

  • setViewName(String View)
  • addObject(String Name, Object value) 
    • requestScope에 설정됨 
  • addAllObject(Map values) : view에 전달할 값을 Map에 name-value로 저장하여 한번에 설정 

 

Redirect 방식 전송 

- View이름에 redirect : 접두어 붙이기 

ex) mv.setViewName("redirect:/welcome.html");

 

ViewResolver

Controller가 넘긴 View이름을 통해 알맞은 View를 찾는 역할 

- Controller는 ModelAndView 객체에 응답할 

 

context에 선언 해주어야함 

 

ViewResolver 종류 

✔ ResourceBundleViewResolver

properties에서 뷰 이름에 해당하는 컴포넌트의 URL을 찾는다 

✔ InternalResourceViewResolver

미리 지정된 접두사, 접미사를 사용하여 뷰 이름으로 컴포넌트의 URL을 완성해 URL 지정하기편리

교체 방법은 XML 에서 설정하는 방법과 Java Config로 설정하는 방법 

 

 

실행과정 

1. 페이지 컨트롤러는 클라이언트가 요청한 작업을 실행한 후 그 결과를 출력할 뷰의 이름 리턴 

2. 프론트 컨트롤러는 RequestHandler가 리턴한 URL을 ViewResolver에게 전달

3. ViewResolver는 자신의 정책에 맞춰서 뷰 URL 준비

4. InternalResourceViewResolver의 경우 RequestHandler가 리턴한 URL 앞, 뒤에 접두사와 접미사를 붙여 JSP를 찾음

5. 프론트 컨트롤러는 ViewResolver가 준비한 URL을 가지고 View 객체를 통해 해당 URL의 자원을 실행

 

 

 

 <!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
    <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <beans:property name="prefix" value="/WEB-INF/views/" />
        <beans:property name="suffix" value=".jsp" />
    </beans:bean>
@RequestMapping("/response-view-v2")
public String responseViewV2(Model model) {    
    return "response/hello";
}

 

 

 

 

 

redirect관련 참고 

https://developer-joe.tistory.com/222

 

ModelAndView의 setViewName() 메소드에 redirect: 사용하는 법

ModelAndView의 setViewName() 메소드에 redirect: 사용하는 법 ModelAndview는 Model 정보(DB로 부터 획득한 데이터 정보)와 View 정보(이동할 페이지의 .jsp 파일 정보)를 같이 담아서 넘기는 클래스인데 ViewResolver

developer-joe.tistory.com

 

댓글