1 minute read

ModelAndView 객체

데이터 저장 용도의 Model 객체와 view 페이지 포워딩 정보를 함께 관리하는 객체다. 매핑 메서드 정의 시 리턴타입을 ModelAndView 타입으로 지정한다. 데이터 저장 작업은 Map(HashMap) 객체를 활용한다.(Model 타입도 가능하다.) 데이터 저장 및 뷰페이지로 포워딩하는 작업을 일관된 방식으로 처리 가능해진다.

@Controller
public class TestController {
    @GetMapping("mav")
	public ModelAndView mav() {
		// => Map<String, 저장할데이터타입> 형식으로 제네릭타입 설정
		Map<String, Object> map = new HashMap<String, Object>();
		
		PersonVO person = new PersonVO();
		person.setName("이순신");
		person.setAge(44);
		map.put("person", person);
		
		TestVO test = new TestVO("제목", "내용");
		map.put("test", test);

		return new ModelAndView("test2/model_and_view", "map", map);
	}
}

ModelAndView 객체를 생성 시 포워딩 할 뷰페이지 지정 및 전송할 객체(Map)를 지정한다.
객체 생성 : new ModelAndView(“이동할페이지”, “저장데이터속성명”, 저장데이터);
포워딩 방식은 디스패치 방식이며, 경로 지정은 return 문 뒤에 기술하는 경로와 동일하다. return 문을 통해 ModelAndView 객체를 리턴한다.(매핑 메서드 리턴타입 ModelAndView 필수).

@Controller
public class TestController {
	@GetMapping("mav")
	public ModelAndView mav(Map<String, Object> map) {
		PersonVO person = new PersonVO();
		person.setName("홍길동");
		person.setAge(20);
		map.put("person", person);
		
		TestVO test = new TestVO("제목2", "내용2");
		map.put("test", test);

		return new ModelAndView("test2/model_and_view", "map", map);
	}
}

메서드 내에서 공통으로 사용될 객체가 존재할 경우(ex. Map, List 등) 해당 인스턴스를 직접 생성할 필요없이 매핑 메서드 파라미터로 선언만 하면 자동으로 객체 생성까지 수행된다. 단, Map 객체가 파라미터 데이터 저장용이 아니므로 @RequestParam 어노테이션은 사용하지 않는다.

<body>
    <h1>test2/model_and_view.jsp</h1>
    <hr>
    <%-- 전달받은 Map 객체(속성명 : "map") 내의 PersonVO 객체( : "person") 접근하여 데이터 출력 --%>
    <h3>이름 : ${map.person.name }</h3>
    <h3>나이 : ${map.person.age }</h3>
    <%-- 전달받은 Map 객체(속성명 : "map") 내의 TestVO 객체( : "test") 접근하여 데이터 출력 --%>
    <h3>이름 : ${map.test.subject }</h3>
    <h3>나이 : ${map.test.content }</h3>
</body>

뷰페이지에선 이렇게 접근하면 된다.

Leave a comment