ビューリゾルバー
Spring MVC は ViewResolver
および View
インターフェースを定義し、特定のビューテクノロジーに縛られることなくブラウザーでモデルをレンダリングできるようにします。ViewResolver
は、ビュー名と実際のビュー間のマッピングを提供します。View
は、特定のビューテクノロジーに引き渡す前のデータの準備に対処します。
次の表に、ViewResolver
階層の詳細を示します。
ViewResolver | 説明 |
---|---|
|
|
| 明示的なマッピング定義なしで、論理ビュー名を URL に直接解決する |
|
|
|
|
| リクエストファイル名または |
| 現在のアプリケーションコンテキストでビュー名を 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
は互換性のある一致です。