ModelAndView
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");