What does the InternalResourceViewResolver do in Spring MVC?
InternalResourceViewResolver
はSpring MVCフレームワークのViewResolver
の実装で、"hello"などの論理的なビュー名を、ServletやWEB-INFフォルダー内に配置されるjspファイルなどの内部的な物理リソースへの解決を担当します。このクラスはUrlBasedViewResolver
のサブクラスで、Springコントローラーが返す論理的なビュー名を実際の物理的なビューへ変換するのに、"prefix"と"suffix"を使います。たとえば、ユーザがURL/home
にアクセスしてHomeControllerが"home"を返すとすると、DispatcherServletはInternalResourceViewResolverに問い合わせて、webアプリケーションが必要とする実際の物理的なビューを参照するためにprefixとsuffixを使用します。たとえば、prefixが"/WEB-INF/views/"
でsuffixが".jsp"
の場合、"home"
はInternalResourceViewResolverによって"/WEB-INF/home.jsp"
に解決されます。
このため、WEB-INFディレクトリ内にJSPファイルを配置する場合、それらのJSPファイルに直接アクセス(例:URLの直接入力)できなくするのが望ましいです。そうする場合、コントローラーだけがそれらのファイルにアクセス可能です。
How to configure InternalResorveViewResolver in Spring MVC
以下に示すように、Java ConfigurationとXML configurationのどちらかでViewResolver を設定できます。
Configuring ViewResolver using XML in Spring
以下はSpringでview resolverを設定するXMLの例で、XMLベースでSpringプロジェクトを動かしている場合には以下のようにします。
<bean id="viewResolver" class="org.springframework.web.servlet.view.InternalResourceViewResolver" prefix="/WEB-INF/" suffix=".jsp" />
Configuring ViewResolver using Java Configuration
Spring 3.0以降はXMLではなくJavaでview resolverを設定できます。internal resource view resolverを設定するには以下のようにします。
@Bean public ViewResolver viewResolver() { InternalResourceViewResolver irv = new InternalResourceViewResolver(); irv.setPrefix("/WEB-INF/"); irv.setSuffix(".jsp"); return irv; }
XMLでもJavaでもSpringでinternal resource view resolverを設定する方法は簡単です。
Important points about InteralResourceViewResolver in Spring MVC
Spring MVCフレームワークの便利なこのクラスについて、以下に知っておいたほうが良い点を述べます。springプロジェクトの処理の流れを知るのに役立つかと思います。
1. 複数のViewResolverをチェーンさせる場合、InternalResourceViewResolver
は常に最後にする必要があり、これはビュー名を解決しようとするとき基底のリソースが本当に存在するかどうかに関係無く解決が行われるためです。
2. Spring MVCフレームワークのフロントコントローラDispatcherServletのデフォルトview resolverはInternalResourceViewResolverhです。
3. デフォルトでは、InternalResourceViewResolver
はInternalResourceView
(つまりServletとJSP)を返しますが、以下のようにviewClass
属性でJstlViewを返すように設定できます。
/** * Sets the default setViewClass view class to requiredViewClass: by default * InternalResourceView, or JstlView if the JSTL API is present. */ public InternalResourceViewResolver() { Class viewClass = requiredViewClass(); if (viewClass.equals(InternalResourceView.class) && jstlPresent) { viewClass = JstlView.class; } setViewClass(viewClass); } /** * このresolverはInternalResourceViewが必要。 */ @Override protected Class requiredViewClass() { return InternalResourceView.class; }
JstlView
の利点はJSTL tagsで、これはLocaleとSpringに設定したメッセージリソースを取得できます。表示メッセージのフォーマットにJSTLタグを使う場合には特に重要です。
JSTLのフォーマットタグは通貨や日付などをロケール固有のフォーマットで適切に行うにはLocale
が必要です。このメッセージタグは、Springのメッセージソースと、HTMLのレンダリングをするのに適切なメッセージ選択を行うためのLocaleを使用します。JstlView
クラスの詳細についてはSpring in Action by Craig Wallsを参照してください。
4. InteralResourceViewResolver
はSpring frameworkが提供するview resolerのうちの一つで、場合によっては以下のクラスのほうが便利な場合があります。
BeanNameViewResolver
- Springのアプリケーションコンテキスト内のbeanで、ビュー名とbean IDが同一かどうか、でviewを解決します。たとえば、id = "home"
のbeanがありコントローラーが論理的なビュー名"home"
を返す場合、BeanNameViewResolverによる解決はこのbeanになります。FreeMarkerViewResolver
- FreeMarkerのテンプレートとしてビューを解決します。JasperReportsViewResolver
- JasperReportの定義としてビューを解決します。XsltViewResolver
- XSLT変換の結果としてレンダリングするためのビューを解決します。
Springのview resolverのそれぞれの種類について知るにはBryan Hassen氏のIntroduction to Spring MVC 4を参照してください。
5. Spring MVCでViewResolverを使う最大のメリットは、ビューのレンダリングとコントローラーのリクエストハンドリングを切り離せる点です。つまり、コントローラーはビューのレンダリングに使われる技術について知らなくてもよい、ということです。
返すのは論理的なビュー名だけで、この名前でJSP, FreeMarker template, Apache tilesなどのビュー技術を解決します。また、論理的なビュー名が同一であればコントローラーを変更することなくビューレイヤを変更できることも意味します。
以上が、Spring MVCでInternalResourceViewResolverがが何をしているか、もしくはInternalResourceViewResolverの役割、の解説になります。Spring MVCの便利なこのクラスは、Java Springの使用者は知っておいたほうが良いでしょう。Spring MVCのビュー解決の考え方は、Springの採用面接やSpring certificationの点でも重要です。Spring certificationを受ける場合、Spring MVCのビュー解決の考え方の知識を確認するのにDavid MayerのSpring Mock examで公開されている設問を見ておくことを推奨します。