20

私はほとんどのページでapacheタイル(2.1.2)を使用しているWebアプリに取り組んでいますが、そのうちのいくつかはプレーンなjspsである必要があります。

InternalResourceViewResolverとaの両方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をレンダリングできるように構成する方法を知っている人はいますか?

4

5 に答える 5

22

あなたが言うように、これらを一緒に連鎖させることはできません。両方のjavadocは、両方がリゾルバーチェーンの最後にある必要があることを明確に示しています。

これらを一緒に使用する必要がある場合は、ビュー名を取得し、2つの「実際の」ビューリゾルバーのどちらに委任するかを決定する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>
于 2009-06-22T20:23:54.023 に答える
3

*-servlet.xml設定ファイルを2つに分割することで、同じ問題を解決しました。私の場合、メインアプリケーションはタイルを使用しますが、QUnitテストを単純なJSPにしたいです。

app-servlet.xmlTilesビューリゾルバー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>
于 2012-08-01T09:50:49.553 に答える
1

あなたは正しい方向に進んでいるように見えますが、覚えておくべきことは、一部のビューリゾルバーは常にビューを解決したかのように動作するということです。そのようなリゾルバを注文の最後に置くようにする必要があります。Tilesビューはそのようなものの1つだと思います。

編集:おっと...はい、他のポスターは正しいです。これらのリゾルバーは両方とも「常に一致」するため、両方をチェーンで使用することはできません。もう1つの方法は、構成済みのタイルビューが見つからない場合に、TilesViewを拡張して単純なJSPレンダリングを実行することです。

于 2009-06-22T20:23:47.487 に答える
0

はい、プロジェクトで任意の数のビューリゾルバーを使用できます。

したがって、同じプロジェクトで「タイルビューリゾルバー」と「内部ビューリゾルバー」の両方を使用できます。。

ContentNegotiatingViewResolverを構成する必要があります。。

ビューリゾルバーで注文値を指定します。

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

タイルビューリゾルバー2とinternalviewresolver3を指定したように。タイルにビューが見つからない場合は、最初にタイル定義をチェックインし、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>
于 2014-09-22T10:28:39.387 に答える
0

この問題は、次のように、プレーン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>
于 2016-05-14T21:24:18.767 に答える