스프링 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;
    }
 }

  □ 스프링이 제공하는 주요 ViewResolver 구현 클래스

  □ ViewResolver 인터페이스
    ■ 정의
 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;
 }
      ○ getContentType() 메서드
        - "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;
      ○ InternalResourceViewResolver가 사용하는 자원 경로


    ■ 스프링의 국제화와 관련 정보를 JSTL에서 사용
      - 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 설정
    ■ 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" />
         - 결과를 보여주는 View 클래스는 이름이 "download"인 DownloadView 클래스.
         - ViewResolver로서 BeanNameViewResolver 클래스를 사용.
         - DownloadController 클래스의 처리 결과를 DownloadView가 생성.

  □ XmlViewResolver 설정
    ■ XmlViewResolver 클래스
      - BeanNameViewResolver와 마찬가지로  뷰 이름과 동일한 이름을 갖는 빈을 뷰 객체로 사용.
      - 차이점 : 별도의 XML 설정 파일로부터 빈 객체를 검색.
    ■ 설정
      - location 프로퍼티를 이용하여 외부 설정 파일의 경로를 지정.
 <bean id="viewResolver"
    class="org.springframework.web.servlet.view.XmlViewResolver"
    p:location="/WEB/INF/nonHtml-view.xml" />
      - location 프로퍼티의 값을 지정하지 않을 경우 기본값은 "/WEB-INF/views.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" 리소스로부터 설정 정보를 로딩.
         - "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 템플릿 파일이 존재하지 않을
        경우 null을 리턴하지 않고 예외를 발생 시킴.
        (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
: