0

これは複雑な質問ですので、長い説明を通してご容赦ください。

現在のシナリオ

SpringMVC3.0.5とApacheTiles2.2を使用しています。現在、Springベースのタイル構成は次のようになっています。

<bean id="tilesConfigurer"
    class="org.springframework.web.servlet.view.tiles2.TilesConfigurer">
    <property name="definitions">
        <list>
            <value>/WEB-INF/**/views.xml</value>
        </list>
    </property>

    <!-- resolving preparer names as Spring bean definition names -->
    <property name="preparerFactoryClass" 
        value="org.springframework.web.servlet.view.tiles2.SpringBeanPreparerFactory" />
</bean>

<bean id="tilesViewResolver"
    class="org.springframework.web.servlet.view.UrlBasedViewResolver"
    p:order="1" p:viewClass="org.springframework.web.servlet.view.tiles2.TilesView" />

(タイル)ビュー定義はすべてのviews.xmlファイルから読み取られ、Springコントローラーがレンダリングされる論理ビュー名として「ホームページ」を生成すると、「ホームページ」という名前の対応するタイル定義が表示されます。

標的

ここで、Webアプリケーション内のさまざまなディレクトリからさまざまなビュー定義のセットを許可する予定です。理由は、さまざまなユーザーグループがグループに応じてカスタマイズされたテンプレートを使用するためです。

私の現在のビュー定義がすべてにあるとしましょう

 /WEB-INF/default-views/**/views.xml

そして、2番目のフォルダを追加したい

 /WEB-INF/administrator-views/**/views.xml

この2番目のフォルダーには、フォルダーと同じ名前のビュー定義が含まれている必要がありdefault-viewsます。ただし、URLパターンに応じて、どちらか一方が表示されます。次に2つのサンプルを示します。

http://example.com/default/foobar 
==> Controller yields logical view name "foobar"
==> definition "foobar" from "default-views" folder shall be displayed

http://example.com/admin/foobar 
==> Controller yields logical view name "foobar"
==> definition "foobar" from "administrator-views" folder shall be displayed

さらに、フォールバックメカニズムを許可したいと思います。対応するビューフォルダに特殊なビュー名(上記の例では「admin」)が存在しない場合は、他のフォルダのデフォルトバージョンを表示します。

ここのところ

現在、私はいくつかの出発点について考えています。多分私は微調整している可能性がありますTilesConfigurer。これにより、ビュー定義が作成されたフォルダーを区別せずに、タイルビュー定義を単一のプロパティに保持します。

もう1つのオプションは、チェーンビューリゾルバーを使用してこれを実現しようとすることです。特殊なものはチェーンのさらに上にあり、デフォルトのものは最後にあります。

3番目のオプションは、異なるビュー名を使用し、コントローラーからのビュー名応答をインターセプトして、HandlerInterceptorそれを特殊なビューにマップすることです(存在しない場合は機能しない可能性があります)。

質問

  • このビュー解決メカニズムを実装するための良いオプションは何ですか?
    • ビュー定義を他の人/より専門的なものによって上書きできるようにする
    • 表示をリクエストのURLパターンに依存させる

現時点では、私のオプション#2は、本当に必要でないときにSpringsクラスをいじるのを防ぎたいので、最も説得力があるように聞こえます。しかし、チェーンされたビューリゾルバーとのビュー定義リストの間の接続がありませんTilesConfigurer

これまでの忍耐と読書に感謝します。

4

1 に答える 1

2

このような問題が発生する可能性がある人のために、次のように実装しました。

  • カスタムHandlerInterceptorAdapter#postHandle(..)実装を使用して、URLパスコンポーネントを論理ビュー名プレフィックスに変換します
  • views.xmlすべてのファイルでこれらのURLプレフィックスを持つタイルビュー定義名を使用する
  • カスタムUrlBasedViewResolver#loadView(..)実装を使用して、最初にControllerandHandlerInterceptorで指定されたビュー名を試してください。ビュー名が存在しない場合(super.loadView(..)nullが生成される場合)、代わりにデフォルトのプレフィックスを試してください。

これが十分に明確であることを願っています。

于 2011-04-15T16:52:58.673 に答える