문제

저는 대부분의 페이지가 Apache 타일(2.1.2)을 사용하는 웹 앱을 작업 중이지만 그 중 일부는 일반 JSP여야 합니다.

나는 둘 다에 문제가 있습니다 InternalResourceViewResolver 그리고 UrlBasedViewResolver 어떤 순서를 사용하더라도 일반 JSP 페이지나 타일 페이지에서 실패할 수 있도록 뷰를 해결하려고 시도합니다.

구성은 다음과 같습니다.

<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를 렌더링할 수 있도록 구성하는 방법을 아는 사람이 있나요?

도움이 되었습니까?

해결책

당신이 말했듯이, 이것들을 서로 연결할 수는 없습니다.두 가지에 대한 javadoc에서는 둘 다 리졸버 체인의 끝에 있어야 함을 명확하게 명시하고 있습니다.

정말로 이들을 함께 사용해야 한다면 뷰 이름을 취하고 위임할 두 개의 "실제" 뷰 리졸버 중 어느 것을 결정하는 ViewResolver의 간단한 사용자 정의 구현을 작성하는 것이 좋습니다.이는 뷰 이름을 기반으로 어떤 리졸버를 호출할지 알 수 있다고 가정합니다.


따라서 다음과 같이 사용자 정의 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>

다른 팁

방금 분할하여 동일한 문제를 해결했습니다. *-servlet.xml 두 개의 구성 파일;내 경우에는 기본 애플리케이션이 Tiles를 사용하지만 QUnit 테스트가 단순한 JSP가 되기를 원합니다.

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>

올바른 방향으로 가고 있는 것 같지만 명심해야 할 점은 일부 뷰 리졸버는 항상 뷰를 리졸브한 것처럼 동작한다는 것입니다.이러한 리졸버를 주문 시 마지막에 넣어야 합니다.저는 Tiles 뷰가 그러한 뷰 중 하나라고 생각합니다.

편집하다:앗...예, 다른 포스터가 맞습니다. 이 리졸버는 모두 '항상 일치'하므로 체인에서 둘 다 사용할 수 없습니다.또 다른 대안은 구성된 타일 보기를 찾을 수 없는 경우 TilesView를 확장하여 간단한 JSP 렌더링을 수행하는 것입니다.

예, 프로젝트에서 뷰 리졸버를 원하는 만큼 사용할 수 있습니다.

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

ContentNegotiatingViewResolver를 구성해야 합니다..

뷰 리졸버에 주문 값을 제공합니다.

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

타일 ​​뷰 리졸버 2와 Internalviewresolver 3을 제공한 것처럼요..타일에서 뷰를 찾을 수 없으면 먼저 타일 정의를 확인하고 InternaiViewResolver에서 확인합니다.

여기 나에게 맞는 몇 가지 구성이 있습니다.

    <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>

다음과 같이 일반 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>
라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top