ビューリゾルバー

Spring MVC は ViewResolver および View インターフェースを定義し、特定のビューテクノロジーに縛られることなくブラウザーでモデルをレンダリングできるようにします。ViewResolver は、ビュー名と実際のビュー間のマッピングを提供します。View は、特定のビューテクノロジーに引き渡す前のデータの準備に対処します。

次の表に、ViewResolver 階層の詳細を示します。

表 1: ViewResolver の実装
ViewResolver 説明

AbstractCachingViewResolver

AbstractCachingViewResolver キャッシュのサブクラスは、それらが解決するビューインスタンスをキャッシュします。キャッシュにより、特定のビュー技術のパフォーマンスが向上します。cache プロパティを false に設定すると、キャッシュをオフにできます。さらに、実行時に特定のビューをリフレッシュする必要がある場合(たとえば、FreeMarker テンプレートが変更された場合)、removeFromCache(String viewName, Locale loc) メソッドを使用できます。

UrlBasedViewResolver

明示的なマッピング定義なしで、論理ビュー名を URL に直接解決する ViewResolver インターフェースの単純な実装。これは、論理名が任意のマッピングを必要とせずに、ビューリソースの名前と簡単に一致する場合に適しています。

InternalResourceViewResolver

InternalResourceView (事実上、サーブレットと JSP) および JstlView などのサブクラスをサポートする UrlBasedViewResolver の便利なサブクラス。setViewClass(..) を使用して、このリゾルバーによって生成されるすべてのビューのビュークラスを指定できます。詳細については、UrlBasedViewResolver javadoc を参照してください。

FreeMarkerViewResolver

FreeMarkerView およびそれらのカスタムサブクラスをサポートする UrlBasedViewResolver の便利なサブクラス。

ContentNegotiatingViewResolver

リクエストファイル名または Accept ヘッダーに基づいてビューを解決する ViewResolver インターフェースの実装。コンテンツネゴシエーションを参照してください。

BeanNameViewResolver

現在のアプリケーションコンテキストでビュー名を Bean 名として解釈する ViewResolver インターフェースの実装。これは非常に柔軟なバリアントであり、異なるビュー名に基づいてさまざまなビュー型を混在させたり一致させたりできます。このような各 View は、たとえば XML または構成クラスで Bean として定義できます。

ハンドリング

複数のリゾルバー Bean を宣言し、必要に応じて order プロパティを設定して順序を指定することにより、リゾルバーをチェーンで表示できます。順序プロパティが高いほど、後でビューリゾルバーがチェーンに配置されます。

ViewResolver の契約は、ビューが見つからなかったことを示すために null を返すことができることを指定しています。ただし、JSP と InternalResourceViewResolver の場合、JSP が存在するかどうかを判断する唯一の方法は、RequestDispatcher を介してディスパッチを実行することです。常にビューリゾルバーの全体的な順序で最後になるように InternalResourceViewResolver を構成する必要があります。

ビューリゾルバーの構成は、ViewResolver Bean を Spring 構成に追加するのと同じくらい簡単です。MVC 構成は、リゾルバーを表示およびコントローラーロジックなしの HTML テンプレートレンダリングに役立つロジックレスビューコントローラーを追加するための専用の構成 API を提供します。

リダイレクト

ビュー名の特別な redirect: プレフィックスを使用すると、リダイレクトを実行できます。UrlBasedViewResolver (およびそのサブクラス)は、これをリダイレクトが必要な命令として認識します。ビュー名の残りはリダイレクト URL です。

最終的な効果は、コントローラーが RedirectView を返した場合と同じですが、コントローラー自体が論理ビュー名の観点から動作できるようになりました。論理ビュー名(redirect:/myapp/some/resource など)は現在のサーブレットコンテキストに関連してリダイレクトし、redirect:https://myhost.com/some/arbitrary/path などの名前は絶対 URL にリダイレクトします。

フォワード

最終的に UrlBasedViewResolver およびサブクラスによって解決されるビュー名に特別な forward: プレフィックスを使用することもできます。これにより、RequestDispatcher.forward() を行う InternalResourceView が作成されます。このプレフィックスは InternalResourceViewResolver および InternalResourceView (JSP の場合)では有用ではありませんが、別のビューテクノロジーを使用しているが、リソースの転送をサーブレット / JSP エンジンで処理したい場合に役立ちます。代わりに、複数のビューリゾルバーチェーンを使用することもできます。

コンテンツネゴシエーション

ContentNegotiatingViewResolver (Javadoc) はビュー自体を解決するのではなく、他のビューリゾルバーに委譲し、クライアントがリクエストする表現に似たビューを選択します。表現は、Accept ヘッダーまたは照会パラメーター(たとえば、"/path?format=pdf")から判別できます。

ContentNegotiatingViewResolver は、各 ViewResolvers に関連付けられた View がサポートするメディア型(Content-Type とも呼ばれる)とリクエストメディア型を比較することにより、適切な View を選択してリクエストを処理します。互換性のある Content-Type を持つリストの最初の View は、表現をクライアントに返します。ViewResolver チェーンが互換性のあるビューを提供できない場合、DefaultViews プロパティを介して指定されたビューのリストが参照されます。この後者のオプションは、論理ビュー名に関係なく現在のリソースの適切な表現をレンダリングできるシングルトン Views に適しています。Accept ヘッダーにはワイルドカード(たとえば text/*)を含めることができます。その場合、Content-Type が text/xml である View は互換性のある一致です。

構成の詳細については、MVC 構成リゾルバーを表示を参照してください。