ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 스프링 viewResolver
    Spring(스프링) 2015. 9. 25. 14:55

    뷰 리졸빙(View resolving)

    사용자에게 결과를 랜더링하여 보여주기 위하여 사용


    뷰 리졸버 구현체

     뷰 리졸버

     설명

     BeannameViewResolver

     논리적 뷰 이름과 동일한 ID를 갖는 <bean> 으로 등록된 View의 구현체를 찾는다.

     ContentNegotiatingViewResolver

     요청되는 콘텐츠 형식에 기반을 두어 선택한 하나 이상의 다른 뷰 리졸버에 위임한다.

     FreeMarkerViewResolver

     FreeMarker 기반의 템플릿을 찾는다.

     경로는 논리적 뷰 이름에 접두어와 접미어를 붙여 구성

     InternalResourceViewResolver

     웹 어플리케이션의 WAR 파일 내에 포함된 뷰 템플릿을 찾는다.

     뷰 템플릿의 경로는 논리적 뷰 이름에 접두어와 접미어를 붙여 구성

     JasperReportsViewResolver

     Jasper Reports 리포트 파일로 정의된 뷰를 찾는다.

     경로는 논리적 뷰 이름에 접두어와 접미어를 붙여 구성

     TilesViewResolver

     Tiles 템플릿으로 정의된 뷰를 찾는다.

     템플릿 이름은 논리적 뷰 이름에 접두어와 접미어를 붙여 구성

     UrlBasedViewResolver

     ViewResolver의 구현체로 특별한 맵핑 정보 없이 view 이름을 URL로 사용

     View 이름과 실제 view 자원과의 이름이 같을 때 사용할 수 있다.

     ResourceBundleViewResolver

     ViewResolver 의 구현체로 리소스 파일을 사용합니다.

     views.properties 를 기본 리소스 파일로 사용합니다.

     VelocityLayoutViewResolver

     VelocityViewResolver의 서브클래스로, 스프링의 VelocityLayoutView를 통해 페이지 구성을 지원

     VelocityViewResolver

     Velocity 기반의 뷰를 찾는다.
     경로는 논리적 뷰 이름에 접두어와 접미어를 붙여 구성

     XmlViewResolver

     

     ViewResolver 의 구현체로 XML파일을 사용합니다.

     /WEB-INF/views.xml 을 기본 설정파일로 사용합니다.

     

     XsltViewResolver

     XSLT기반의 뷰를 찾는다. 

     XSLT스타일시트의 경로는 논리적 뷰 이름에 접두어와 접미어를 붙여 구성

     




    ViewResolver들의 상위에 있는 AbstractCachingViewResolver 이 클레스가 캐슁 기능을 제공하기 때문에 이 클레스의 하위 클레스들은 엄청난 성능 향상을 맛볼 수 있다. 캐슁 기능을 끄고 싶을 때는 cache 속성을 false로 하면 된다.
    런타임시 특정 view를 다시 읽어야 한다면 removeFromCache(String viewName, Locale loc) 메소드를 사용할수 있다.


    Resolver 사용 예제

    1. UrlBasedViewResolver

     

    ViewResolver 의 구현체로 특별한 맵핑 정보 없이 의미상 view 이름을 URL로 사용

    View 이름과 실제 view 자원과의 이름이 같을 때 사용

     

    <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">

        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    viewResolver는 사용자에게 보여줄 view를 생성할 때, prefix와 suffix를 지정해 줄 수 있다. 

    만약 controller에서 넘겨준 modelAndView 값이 index이라면, 위의 정의에 따라 viewResolver는 "/WEB-INF/index.jsp"를 찾는다.


    2. InternalResourceViewResolver

    UrlBasedViewResolver 를 상속 받았으며 InternalResourceView(Servlet, JSP)를 사용

    <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
      <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
      <property name="prefix" value="/WEB-INF/jsp/"/>
      <property name="suffix" value=".jsp"/>
    </bean>

    UrlBasedViewResolver를 상속받아 사용은 유사하다. 

    참고적으로 JSTL을 사용하려면 위의 viewClass를 정의해주면 된다.


    3. ResourceBundleViewResolver

    ViewResolver 의 구현체로 리소스 파일 사용(views.properties 를 기본 리소스 파일로 사용)

    다른 View 리졸버는 항상 논리적인 View 이름을 사용하여 단일한 View 구현 객체를 결정하는 반면, ResourceBundleViewResolver는 사용자의 Locale을 기초로 하여 동일한 논리적인 뷰 이름으로 서로 다른 View 구현 객체를 리턴 할 수 있다.


     

    .properties 의 문법

    viewname.class = class-name

    viewname.url = view-url


     

    viewReslover 정의

    <bean id="viewResolver" class="org.springframework.web.servlet.view.ResourceBundleViewResolver">
        <property name="basename" value="views"/>       // view.properties에 기술 
        <property name="defaultParentView" value="parentView"/>

        // views.properties 파일에 정의되지 않을 경우에는 parentView 에 정의된 사항을 따른다.
    </bean>


    views.properties 리소스 파일

    bookView.class = org.springframework.web.servlet.view.JstlView
    bookView.url = WEB-INF/jsp/book/bookView.jsp

    bookEdit.class = org.springframework.web.servlet.view.JstlView
    bookEdit.url = WEB-INF/jsp/book/bookEdit.jsp

     


    Controller 작성

    public class TestController{

    public ModelAndView index(HttpServletRequest request, HttpServletResponse response){

    Map model = new HashMap();


    return new ModelAndView("bookview", "model", model);

    }

    }

    viewResolver는 사용자에게 보여줄 view를 생성할 때, views.properties에서 정의된 URL을 참조한다.

    만약 views.properties파일에 원하는 정보가 없다면 parentView.properties파일을 참조하게 된다.

     


    4. XmlViewResolver

    ViewResolver 의 구현체로 XML파일 사용(/WEB-INF/views.xml 을 기본 설정파일로 사용)

    BeanNameViewResolver와 마찬가지로  뷰 이름과 동일한 이름을 갖는 빈을 뷰 객체로 사용


     

    <bean id="jspViewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.JstlView"/>
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>


    <bean id="excelViewResolver" class="org.springframework.web.servlet.view.XmlViewResolver">
        <property name="order" value="1"/>
        <property name="location" value="/WEB-INF/simpleviews.xml"/>
    </bean>


    simpleviews.xml

    <beans>
        <bean name="report" class="org.springframework.example.ReportExcelView"/>
    </beans>

     


    5. TilesViewResolver

    런타임 시 전체 페이지에 조립되는 페이지의 조각을 배치하기 위한 템플릿 프레임워크


    Tiles 2를 이용하기 위해서는 UrlBasedViewResolver를 정의한 후 viewClass를 org.springframework.web.servlet.view.tiles2.TilesView로 정의

    <bean id="tilesViewResolver" class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="viewClass" value="org.springframework.web.servlet.view.tiles2.TilesVIew"/>
    </bean>


    Tiles 매핑 관련 정보가 작성되어 있는 tiles definition 파일의 위치를 정의

    TilesViewResolver자체는 타일즈 정의에 대하여 아무런 정보를 가지지 않는다. 대신 해당 정보를 추적하는 TileConfigurer에 의존한다. 따라서 tiles definition의 정보를 아래와 같이 정의한다.

    <bean id="tilesConfigurer" class="org.springframework.web.servlet.view.tiles2.TIlesConfigurer">
        <property name="definitions">

            <list>

                <value>/WEB-INF/view.xml</value>

            </list>

    </bean>


    view.xml

     

    Tiles를 사용하기 위해서는 실제 Controller에서 리턴된 view 이름을 토대로 페이지에 출력해줄 tiles attribute를 정의해주는 tiles definition을 정의

     

    <definition name="template" template="/sample/layouts/main_template.jsp">  // 공통 레이아웃 정의

        <put-attribute name="header" value="/sample/layouts/top.jsp" />

        <put-attribute name="body" value="/sample/layouts/welcome.jsp" />

        <put-attribute name="footer" value="/sample/layouts/left.jsp" />

    </definition>

    <definition name="home" extends="template">                             // home 타일 정의

        <put-attribute name="body" value="/sample/view/home.jsp" />

    </definition>

     


    먼저 Layout을 정의한 jsp 페이지를 정의한다. 

    해당 main_template.jsp 페이지에서 기본적으로 사용할 페이지 구성 요소(위의 예에선 header, body, footer)들을 정의한 후 다른 view들은 미리 정의된 template이라는 definition을 extends하여 body만 설정하여 사용할 수 있다. 

    위의 예에서 home라는 이름의 view가 리턴될 경우 "/sample/view/home.jsp" 페이지의 레이아웃으로 

    header에는 "/sample/layouts/top.jsp" body는 "/sample/view/home.jsp", footer는 "/sample/layouts/left.jsp"이 될 것이다. 


    JSP에서 tiles 구성 요소를 넣을 때는 아래와 같이 tiles taglib을 정의한 후 <tiles:insertAttribute> 태그를 이용하여 사용한다.


    6. 다수의 ViewResolver 설정

    하나의 DispatcherServlet은 한 개 이상의 ViewResolver 설정 가능

    order 프로퍼티를 이용하여 뷰 이름을 검사할 ViewResolver의 순서를 결정 (order프로퍼티의 값이 작은 것이 우선)

    우선순위를 명시하지 않으면 Integer.MAX_VALUE를 order 프로퍼티의 값으로 가진다.

    우선순위가 높은 ViewReslover가 null을 리턴하면 그 다음 우선순위를 갖는 ViewResolver에 뷰를 요청


    <bean id="excelViewResolver" class="org.springframework.web.servlet.view.XmlViewResolver">
        <property name="order" value="0"/>
        <property name="location" value="/WEB-INF/simpleviews.xml"/>
    </bean>


     

    <bean id="viewResolver" class="org.springframework.web.servlet.view.UrlBasedXmlViewResolver">

        <property name="order" value="1"/>

        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

     


    우선순위 결정 시 주의점

    InternalResourceViewResolver는 항상 뷰 이름이 매핑되는 뷰 객체를 리턴하므로 마지막 순위를 갖도록 지정 (null은 리턴하지 않는다.)

    VelocityViewResolver와 VelocityLayoutViewResolver의 경우 둘 다 뷰 이름에 매필되는 Velocity 템플릿 파일이 존재 하지 않을 경우 null을 리턴하지 않고 예외를 발생 시킴 (VelocityViewResolver 역시 가장 낮은 순위를 갖도록 한다.)

     

     

    출처 - http://isstory83.tistory.com/117

Designed by Tistory.