스프링 MVC - 뷰 영역 구현
Language/JSP 2012. 10. 31. 17:50스프링 MVC - 뷰 영역 구현
1. ViewResolver 설정
□ 스프링 컨트롤러의 특징
- 뷰에 의존적이지 않음.
- 결과를 생성할 뷰의 이름만 지정.
- 컨트롤러가 지정한 뷰 이름으로부터 응답 결과 화면을 생성하는 View 객체는 ViewResolver가 구함.
public class HelloController extends AbstractController { ... @Override protected ModelAndView handleRequestInternal(HttpServletRequest request, HttpServletResponse response) throws Exception { ModelAndView mav = new ModelAndView(); // 컨트롤러는 뷰의 이름만 지정. mav.setViewName("hello"); ... return mav; } } |
■ 정의
package org.springframework.web.servlet; import java.util.Locale; public interface ViewResolver { View resolveViewName(String viewName, Locale locale) throws Exception; } |
- 뷰 이름과 지역화를 위한 Locale을 파라미터로 전달 받음.
- 매핑되는 View 객체를 리턴.
- 매핑되는 View 객체가 존재하지 않으면 null을 리턴.
□ View 객체
■ View 객체
- 응답 결과를 생성.
- 모든 뷰 클래스는 View 인터페이스를 구현.
■ View 인터페이스
package org.springframework.web.servlet; import java.util.Map; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public interface View { String getContentType(); void render(Map model, HttpServletRequest request, HttpServletResponse response) throws Exception; } |
- "text/html"과 같은 응답 결과의 커텐트 타입을 리턴.
○ render() 메서드
- 실제로 응답 결과를 생성.
- 첫 번째 파라미터인 model에는 컨트롤러가 리턴한 ModelAndView 객체의 모델 데이터가 전달됨.
- 각각의 View 객체는 이 모델 데이터로부터 응답 결과를 생성하는데 필요한 정보를 구함.
□ InternalResourceViewResolver 설정
■ InternalResourceViewResolver 클래스
- JSP 나 HTML 파일과 같이 웹 어플리케이션의 내부 자원을 이용하여 뷰를 생성하는 AbstractUrlBasedView 타입의 뷰 객체를
리턴.
- 기본적으로 사용하는 View 클래스는 InternalResourceView 클래스. (지정한 자원 경로로 요청을 전달.)
■ 설정
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/viewjsp/" p:suffix=".jsp" /> |
- 컨트롤러가 지정한 뷰 이름 앞뒤로 prefix 프로퍼티와 suffix 프로퍼티를 붙인 값이 실제로 사용될 자원의 경로가 됨.
○ 컨트롤러에서 뷰 이름 지정
ModelAndView mav = new ModelAndView("hello"); return mav; |
- JstlView 클래스를 viewClass 프로퍼티로 지정.
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:viewClass="org.springframework.web.servlet.view.JstlView" p:prefix="/WEB-INF/viewjsp/" p:suffix=".jsp" /> |
■ BeanNameViewResolver 클래스
- 뷰 이름과 동일한 이름을 갖는 빈을 뷰 객체로 사용.
- 주로 커스텀 View 클래스를 뷰로 사용해야하는 경우에 사용.
■ 예
- 파일 다운로드를 위한 정보를 읽어와 뷰에 전달하는 컨트롤러.
- 다운로드 관련 정보를 뷰에 전달.
○ 컨트롤러 생성
public class DownloadController implements Controller { @Override public ModelAndView handleRequest(HttpServletRequest request, HttpServletResponse response) throws Exception { File downloadFile = getFile(request); return new ModelAndView("download", "downloadFile", downloadFile); } ... } |
<bean id="viewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver" /> <bean id="download" class="keme.spring.chap05.view.DownloadView" /> |
- ViewResolver로서 BeanNameViewResolver 클래스를 사용.
- DownloadController 클래스의 처리 결과를 DownloadView가 생성.
■ XmlViewResolver 클래스
- BeanNameViewResolver와 마찬가지로 뷰 이름과 동일한 이름을 갖는 빈을 뷰 객체로 사용.
- 차이점 : 별도의 XML 설정 파일로부터 빈 객체를 검색.
■ 설정
- location 프로퍼티를 이용하여 외부 설정 파일의 경로를 지정.
<bean id="viewResolver" class="org.springframework.web.servlet.view.XmlViewResolver" p:location="/WEB/INF/nonHtml-view.xml" /> |
- location 프로퍼티에 지정하는 파일은 스프링 XML 설정 파일.
□ ResourceBundleViewResolver 설정
■ ResourceBundleViewResolver 클래스
- 리소스 번들(프로퍼티 파일)로부터 뷰 이름과 매핑되는 View 클래스를 구함.
■ 설정
- ResourceBundleMessageSource와 마찬가지로 basename 프로퍼티나 basenames 프로퍼티를 이용해서 뷰 클래스 정보를 저장
한 리소스 경로를 명시.
<bean id="viewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver" p:basename="views/views" /> |
- "views/views.properties", "views.views_en.properties" 등 Locale에 따라 알맞은 프로퍼티 파일로부터 뷰 매핑 정보를 로딩.
- '뷰이름.class=뷰클래스' 형태로 뷰 이름과 뷰 클래스 사이의 매핑을 입력.
download.class=kame.spring.chap05.view.DownloadView |
□ 다수의 ViewResolver 설정
- 하나의 DispatcherServlet은 한 개 이상의 ViewResolver를 설정 가능.
■ 다수의 ViewResolver를 설정한 경우
- order 프로퍼티를 이용하여 뷰 이름을 검사할 ViewResolver의 순서를 결정.
- order 프로퍼티의 값이 작은 ViewResolver가 높은 우선순위를 가짐.
- 우선순위를 명시하지 않으면 Integer.MAX_VALUE 를 order 프로퍼티의 값으로 가짐.
■ 특징
- 우선순위가 높은 ViewResolver가 null을 리턴하면 그 다음 우선순위를 갖는 ViewResolver에 뷰를 요청.
- 뷰 객체를 구하면 뷰 객체를 이용하여 응답 결과를 생성.
■ 설정
<bean class="org.springframework.web.servlet.view.XmlViewResolver" p:location="/WEB-INF/nonHtml-view.xml" p:order="0" /> <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:prefix="/WEB-INF/viewjsp/" p:suffix=".jsp" p:order="1" /> |
- InternalResourceViewResolver는 항방 뷰 이름에 매핑되는 뷰 객체를 리턴(null을 리턴하지 않음.)하므로 마지막 순위를 갖도록
- VelocityViewResolver와 VelocityLayoutViewResolver의 경우 둘 다 뷰 이름에 매핑되는 Velocity 템플릿 파일이 존재하지 않을
(VelocityViewResolver 역시 가장 낮은 우선순위를 갖도록 해야함.)
'Language > JSP' 카테고리의 다른 글
Basic of JSP (0) | 2012.11.02 |
---|---|
ServletContext와 RequestDispatcher (0) | 2012.11.02 |
web.xml (servlet) (0) | 2012.10.31 |
Spring MVC (0) | 2012.10.31 |
MyBatis-Spring (0) | 2012.10.31 |