복붙노트

[SPRING] Spring에서 다중 ViewResolvers를 사용하는 방법?

SPRING

Spring에서 다중 ViewResolvers를 사용하는 방법?

나는 아파치 타일 (2.1.2)을 사용하는 대부분의 웹 페이지가있는 웹 응용 프로그램에서 작업하고 있지만 그 중 일부는 단순한 jsp이어야합니다.

InternalResourceViewResolver와 UrlBasedViewResolver가 모두 상관없이 뷰를 확인하려고 시도 할 것이므로 어떤 순서로 사용하든 관계없이 일반 JSP 페이지 나 타일 페이지에서 오류가 발생한다는 문제가 있습니다.

다음은 config입니다.

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

<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver">
    <property name="prefix" value="/"/>
    <property name="suffix" value=".jsp"/>
    <property name="order" value="1"/>
</bean>

내가 뭘하려고하는지 명확하게하기 위해서, 나는 다음과 같은 뷰 상태를 가질 수 있어야한다 :

<view-state id="someState" view="/someDir/foo"><!--render foo.jsp -->
    <transition on="foo" to="bar"/>
</view-state>

<view-state id="someState" view="something.core"><!--render tile defintion named 'something.core' -->
    <transition on="foo" to="bar"/>
</view-state>

누구든지 타일 정의와 일반 jsp를 렌더링 할 수 있도록 구성하는 방법을 알고 있습니까?

해결법

  1. ==============================

    1.당신이 말했듯이, 당신은 이것을 함께 연결할 수 없습니다. 두 상태에 대한 javadoc은 둘 다 해석자 체인의 끝에 있어야 함을 분명히합니다.

    당신이 말했듯이, 당신은 이것을 함께 연결할 수 없습니다. 두 상태에 대한 javadoc은 둘 다 해석자 체인의 끝에 있어야 함을 분명히합니다.

    이 togather를 실제로 사용해야하는 경우 뷰 이름을 사용하는 ViewResolver의 간단한 사용자 정의 구현을 작성하고 두 개의 "실제"뷰 확인자 중 어느 쪽이 위임 할 것인지 결정합니다. 이것은 뷰 이름을 기반으로 호출 할 resolver를 알 수 있다고 가정합니다.

    따라서 다음과 같이 사용자 정의 ViewResolver를 정의 할 수 있습니다.

    public class MyViewResolver implements ViewResolver {
    
        private ViewResolver tilesResolver;
        private ViewResolver jspResolver;
    
        public void setJspResolver(ViewResolver jspResolver) {
            this.jspResolver = jspResolver;
        }
    
        public void setTilesResolver(ViewResolver tilesResolver) {
            this.tilesResolver = tilesResolver;
        }
    
        public View resolveViewName(String viewName, Locale locale) throws Exception {
            if (isTilesView(viewName)) {
                return tilesResolver.resolveViewName(viewName, locale);
            } else {
                return jspResolver.resolveViewName(viewName, locale);
            }
        }
    
        private boolean isTilesView(String viewName) {
        .....
        }
    }
    

    위임 할 리졸버를 결정하려면 isTilesView 메서드를 구현해야합니다.

    XML 설정에서이 새로운 뷰 해석기를 정의하고 다른 버전보다 먼저 표시되는지 확인하십시오.

    <bean class="MyViewResolver">
        <property name="tilesResolver" ref="tilesViewResolver"/>
        <property name="jspResolver" ref="viewResolver"/>
    </bean>
    
  2. ==============================

    2.나는 * -servlet.xml 설정 파일을 두 개로 나눠서 같은 문제를 해결했다. 필자의 경우 메인 애플리케이션은 Tiles를 사용하지만, 간단한 JSP로 QUnit 테스트를 원한다.

    나는 * -servlet.xml 설정 파일을 두 개로 나눠서 같은 문제를 해결했다. 필자의 경우 메인 애플리케이션은 Tiles를 사용하지만, 간단한 JSP로 QUnit 테스트를 원한다.

    app-servlet.xml에는 Tiles보기 확인자 만 포함되며 tests-servlet.xml에는 JSP보기 확인자 만 포함되며 web.xml 매핑은 URL을 기반으로하는 올바른 서블릿에 요청을 발송합니다.

    <servlet-mapping>
      <servlet-name>app</servlet-name> <!-- will reach app-servlet.xml -->
      <url-pattern>/foo</url-pattern> <!-- will use "foo" Tile -->
      <url-pattern>/bar</url-pattern> <!-- will use "bar" Tile -->
    </servlet-mapping>
    
    <servlet-mapping>
      <servlet-name>tests</servlet-name> <!-- will reach tests-servlet.xml -->
      <url-pattern>/foo-test</url-pattern> <!-- will use foo-test.jsp -->
      <url-pattern>/bar-test</url-pattern> <!-- will use bar-test.jsp -->
    </servlet-mapping>
    
  3. ==============================

    3.자신이 올바른 길을 가고있는 것처럼 보이지만, 일부보기 확인자는 항상보기를 해결 한 것처럼 행동한다는 점을 명심해야합니다. 이러한 확인자를 주문할 때 마지막으로 넣어야합니다. 나는 Tiles view가 그러한 것이라고 생각한다.

    자신이 올바른 길을 가고있는 것처럼 보이지만, 일부보기 확인자는 항상보기를 해결 한 것처럼 행동한다는 점을 명심해야합니다. 이러한 확인자를 주문할 때 마지막으로 넣어야합니다. 나는 Tiles view가 그러한 것이라고 생각한다.

    편집 : whoops ... 예, 다른 포스터가 올바른지,이 확인자는 둘 다 '항상 일치'할 것이므로 둘 다 체인에서 사용할 수는 없습니다. 또 다른 대안은 구성된 타일 뷰를 찾을 수없는 경우 TilesView를 확장하여 간단한 JSP 렌더링을 시도하는 것입니다.

  4. ==============================

    4.예. 프로젝트에서 뷰 분석기를 원하는 수만큼 사용할 수 있습니다.

    예. 프로젝트에서 뷰 분석기를 원하는 수만큼 사용할 수 있습니다.

    따라서 동일한 프로젝트에서 '분석기보기'와 '내부보기 분석기'를 모두 사용할 수 있습니다. .

    ContentNegotiatingViewResolver를 설정해야한다. .

    보기 확인자에게 순서 값을 제공하십시오.

    <property name="order" value="int Value here" />
    

    마치 타일 resolver 2와 internalviewresolver 3을 보았습니다. 타일이 보이지 않으면 타일 정의를 먼저 검사합니다. InternalViewResolver에서 검사됩니다.

    여기에 나를 위해 일하는 몇 가지 구성이 있습니다.

        <bean
            class="org.springframework.web.servlet.view.ContentNegotiatingViewResolver">
            <property name="order" value="1" />
            <property name="mediaTypes">
                <map>
                    <entry key="json" value="application/json" />
                    <entry key="html" value="text/html" />
                </map>
            </property>
            <property name="parameterName" value="accept"></property>
            <property name="favorParameter" value="true"></property>
            <property name="defaultContentType" value="text/html"></property>
            <property name="viewResolvers">
                <list>
                    <ref bean="tilesViewResolver" />
                    <ref bean="internalViewResolver" />
                </list>
            </property>
            <property name="defaultViews">
                <list>
                    <bean
                        class="org.springframework.web.servlet.view.json.MappingJacksonJsonView" />
                </list>
            </property>
            <property name="ignoreAcceptHeader" value="true" />
        </bean>
    
    <!--    Configures the Tiles layout system  -->
        <bean class="org.springframework.web.servlet.view.tiles2.TilesConfigurer"
            id="tilesConfigurer">
            <property name="definitions">
                <list>
                    <value>/WEB-INF/layouts/layouts.xml</value>
                <!-- Scan views directory for Tiles configurations  -->
                    <value>/WEB-INF/views/**/views.xml</value>
                </list>
            </property>
        </bean>
        <bean id="tilesViewResolver"
            class="org.springframework.web.servlet.view.UrlBasedViewResolver"
            p:viewClass="org.springframework.web.servlet.view.tiles2.TilesView">
            <property name="order" value="3" />
        </bean>
    
    
        <bean id="internalViewResolver"
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="order" value="2" />
            <property name="prefix">
                <value>/WEB-INF/views/</value>
            </property>
            <property name="suffix">
                <value>.jsp</value>
            </property>
        </bean>
    
  5. ==============================

    5.이 문제는 다음과 같이 일반 jsp의 레이아웃에 타일 정의를 추가하는 것으로 해결되었습니다.

    이 문제는 다음과 같이 일반 jsp의 레이아웃에 타일 정의를 추가하는 것으로 해결되었습니다.

      <definition name="plain-jsp.layout" template="/WEB-INF/layouts/plainJsp.jspx" >
        <put-attribute name="content" value=""/>
      </definition>
    

    그런 다음이 레이아웃을 간단한 jsp 파일을 포함하는 템플릿으로 사용할 수 있습니다.

      <definition name="catalog/details" extends="plain-jsp.layout">
        <put-attribute name="content" value="/WEB-INF/views/catalog/details.jspx"/>
      </definition>
    

    레이아웃 템플릿 파일 :

    <html xmlns:tiles="http://tiles.apache.org/tags-tiles"
          xmlns:jsp="http://java.sun.com/JSP/Page" version="2.0">
    
      <jsp:output doctype-root-element="HTML"/>
      <jsp:directive.page contentType="text/html;charset=UTF-8" />  
      <jsp:directive.page pageEncoding="UTF-8" />
    
      <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
        <meta http-equiv="X-UA-Compatible" content="IE=8" />      
      </head>
      <body>
        <div id="content">
          <tiles:insertAttribute name="content"/>
        </div>
      </body>
    </html>
    
  6. from https://stackoverflow.com/questions/1029193/how-to-use-multiple-viewresolvers-in-spring by cc-by-sa and MIT license