kagamihogeの日記

kagamihogeの日記です。

What does the InternalResourceViewResolver do in Spring MVC?をテキトーに訳した

http://javarevisited.blogspot.jp/2017/08/what-does-internalresourceviewresolver-do-in-spring-mvc.html を読んだ。

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. デフォルトでは、InternalResourceViewResolverInternalResourceView(つまりServletJSP)を返しますが、以下のように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. InteralResourceViewResolverSpring 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で公開されている設問を見ておくことを推奨します。