복붙노트

[SPRING] 다중 뷰 해석자가있는 Spring MVC

SPRING

다중 뷰 해석자가있는 Spring MVC

2 개의보기 확인자를 사용하려고했습니다.

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
    xsi:schemaLocation="
        http://www.springframework.org/schema/beans     
        http://www.springframework.org/schema/beans/spring-beans.xsd
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context.xsd
        http://www.springframework.org/schema/mvc
        http://www.springframework.org/schema/mvc/spring-mvc.xsd">

    <context:component-scan base-package="com.evgeni.dfr.controller" />

    <context:annotation-config />
    <mvc:annotation-driven />

    <bean id="viewResolver"
        class="org.springframework.web.servlet.view.UrlBasedViewResolver">
        <property name="cache" value="false" />
        <property name="viewClass" value="com.evgeni.drf.faces.FacesView" />
        <property name="prefix" value="/WEB-INF/pages/" />
        <property name="suffix" value=".xhtml" />

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

    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix">
            <value>/WEB-INF/views/</value>
        </property>
        <property name="suffix">
            <value>.jsp</value>
        </property>
        <property name="order" value="0" />
    </bean>
</beans>

응용 프로그램은 항상 가장 낮은 순서의 것을 사용하지만 다른 순서는 사용하지 않습니다. 현재의 경우 내 컨트롤러가 "someView"를 반환하면 앱이 응답합니다. 요청한 리소스 (/MyProject/WEB-INF/views/someView.jsp)를 사용할 수 없습니다. "pages / someView.xhtml"이 있더라도.

봄 버전 - 3.2.3

편집하다: 컨트롤러에 method가 2 개 있고 methodA가 "viewA"를 반환하면 메서드는 "viewBAG"를 반환합니다. 'views'폴더에는 viewA.jsp가 있고 'pages'에는 view.html이 있습니다.

Case1 : UrlBasedViewResolver -> order = 1, InternalResourceViewResolver -> order = 2

methodA -> 요청한 리소스 (/MyProject/WEB-INF/pages/viewA.xhtml)를 사용할 수 없습니다.

methodB -> OK

Case2 : UrlBasedViewResolver -> order = 2, InternalResourceViewResolver -> order = 1

methodA -> OK;

methodB -> `The requested resource (/MyProject/WEB-INF/views/viewB.jsp) is not available.`;

해결법

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

    1.주문 우선 순위를 잘못 이해했다고 생각합니다. 최고 순위의 ViewResolver가 체인의 마지막 결정자입니다. InternalResourceViewResolver에 0의 순서를 부여했기 때문에 체인의 첫 번째 확인자가되고 InternalResourceViewResolver는 반환 된 모든보기 이름을보기로 해결합니다. 따라서 여러 개의 확인자를 원하면 InternalResourceViewResolver가 가장 높은 순서의 확인자 여야합니다.

    주문 우선 순위를 잘못 이해했다고 생각합니다. 최고 순위의 ViewResolver가 체인의 마지막 결정자입니다. InternalResourceViewResolver에 0의 순서를 부여했기 때문에 체인의 첫 번째 확인자가되고 InternalResourceViewResolver는 반환 된 모든보기 이름을보기로 해결합니다. 따라서 여러 개의 확인자를 원하면 InternalResourceViewResolver가 가장 높은 순서의 확인자 여야합니다.

    InternalResourceViewResolver 순서 값을 2로 변경하십시오.

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:context="http://www.springframework.org/schema/context"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:mvc="http://www.springframework.org/schema/mvc"
        xsi:schemaLocation="
            http://www.springframework.org/schema/beans     
            http://www.springframework.org/schema/beans/spring-beans.xsd
            http://www.springframework.org/schema/context 
            http://www.springframework.org/schema/context/spring-context.xsd
            http://www.springframework.org/schema/mvc
            http://www.springframework.org/schema/mvc/spring-mvc.xsd">
    
        <context:component-scan base-package="com.evgeni.dfr.controller" />
    
        <context:annotation-config />
        <mvc:annotation-driven />
    
        <bean id="viewResolver"
            class="org.springframework.web.servlet.view.UrlBasedViewResolver">
            <property name="cache" value="false" />
            <property name="viewClass" value="com.evgeni.drf.faces.FacesView" />
            <property name="prefix" value="/WEB-INF/pages/" />
            <property name="suffix" value=".xhtml" />
            <property name="order" value="1" />
        </bean>
    
        <bean
            class="org.springframework.web.servlet.view.InternalResourceViewResolver">
            <property name="prefix">
                <value>/WEB-INF/views/</value>
            </property>
            <property name="suffix">
                <value>.jsp</value>
            </property>
            <property name="order" value="2" />
        </bean>
    </beans>
    

    편집하다 :

    javadoc을 확인한 후에 InternalResourceViewResolver가 UrlBasedViewResolver (InternalResourceViewResolver가 UrlBasedViewResolver를 확장)이므로이 두 해결자가 체인으로 연결될 수없는 것으로 보입니다. 두 resolver는 항상 반환 값과 일치합니다. 나는 당신이 이것을 할 수 있도록 뭔가 특별한 것을 필요로한다고 생각합니다.

  2. ==============================

    2.InternalResourceViewResolver의 Chage 순서는 0부터 1까지입니다. InternalResourceViewResolver는 가장 큰 순서 (낮은 우선 순위)를 가져야합니다.

    InternalResourceViewResolver의 Chage 순서는 0부터 1까지입니다. InternalResourceViewResolver는 가장 큰 순서 (낮은 우선 순위)를 가져야합니다.

  3. from https://stackoverflow.com/questions/18215402/spring-mvc-with-multiple-view-resolvers by cc-by-sa and MIT license