Back Ground

ModelAndView 본문

JAVA

ModelAndView

Back 2017. 6. 1. 14:47

ModelAndView는 Controller의 처리 결과를 보여줄 view와 view에서 사용할 값을 전달하는 클래스이다.


-생성자

ModelAndView() : 그냥 생성
ModelAndView(Object view) : 
렌더링 할 View
ModelAndView(Object view, Map model) : 렌더링 할 View와 View에 전달할 Map
ModelAndView(Object view, String modelName, Object modelObject) 
렌더링 할 View와 View에 전달할 객체의 이름과 값
ModelAndView(String viewName) : ViewResolver에 전달할 View 이름
ModelAndView(String viewName, Map model) : 
ViewResolver에 전달할 View 이름과 View에 전달할 Map
ModelAndView(String viewName, String modelName, Object modelObject) : ViewResolver에 전달할 View 이름과 View에 전달할 객체의 이름과 값


-사용되는 메소드
addAllObjects(Map modelMap) 
modelMap에 저장된 키-값 쌍 전체를 View에 전달

addObject(Object attributeValue) : 전달할 이름을 알아서 정해서 View에 attributeValue를 전달
addObject(String attributeName, Object attributeValue) : View에 attributeName으로 attributeValue을 전달
setViewName(String viewName) : ViewResolver에 전달할 viewName 설정

 

여기서 주목해 보아야 할 것은 2번째 메소드인 전달할 이름을 알아서 정해서 View에 전달하는 경우이다.

Spring MVC에서는 아래와 같은 규칙에 따라 디폴트로 이름을 정한다.

 

클래스 이름이 ModelClass인 경우 : modelClass

ModelClass[] 배열인 경우 : modelClassList

Collection 클래스가 ModelClass를 갖는 경우 :  modelClassList

 

이것이 그 유명한 Convention Over Configuration이다...

잘 사용하면 편리하게 사용할 수 있는데 사실 모르고 보면 이게 뭔소리야 하고 삽질하게 된다... -_-;;


그리고 혹시나 그냥 디폴트 생성자로 ModelAndView를 생성하고 setViewName() 메소드로 View 이름을 지정하지 않는 경우 곧바로 오류가 발생하지는 않는다..

왜냐하면 이것도 DefaultRequestToViewNameTranslater가 View 이름을 자동으로 지정해주기 때문이다.

이 클래스는 UrlFienameViewController와 비슷하게 /test/main.jsp 라면 test/main 으로 /main.jsp 라면 main으로 View 이름을 가져온다.

지정 안해줬는데 어쩌다 보니 View 이름이 얻어 걸려서 오류가 안나는 경우가 발생할 여지가 충분하다... (고맙기도 하지...)


마지막으로 ModelAndView로 포워드 뿐만 아니라 리다이렉트도 사용할 수 있는데...

이런 경우에는 setViewName() 메소드 파라미터에 "redirect:"를 prefix로 붙여주면 된다.

뭐 대충 /main.jsp로 보내고 싶다면 아래와 같이 사용하면 된다~ 


return ModelAndView("redirect:/main.jsp");


'JAVA' 카테고리의 다른 글

JVM/JRE/JDK 이란  (0) 2018.01.29
자바 Byte /오라클 Byte 크기 다를때 UTF-8은 3Byte  (0) 2017.07.27
JVM 메모리 구조  (1) 2017.03.09
JAVA - 배열[]  (0) 2017.02.15
GSON - java 객체(object)를 JSON 표현식으로 변환하는 API  (0) 2016.12.20
Comments