2.2. Spring MVCアーキテクチャ概要

Spring MVCは、公式で以下のように説明されている。

Spring Framework Documentation.

Spring’s web MVC framework is, like many other web MVC frameworks, request-driven, designed around a central Servlet that dispatches requests to controllers and offers other functionality that facilitates the development of web applications. Spring’s DispatcherServlet however, does more than just that. It is completely integrated with the Spring IoC container and as such allows you to use every other feature that Spring has.

2.2.1. Overview of Spring MVC Processing Sequence

リクエストを受けてから、レスポンスを返すまでのSpring MVCの処理フローを、以下の図に示す。

request lifecycle
  1. DispatcherServletが、リクエストを受け取る。
  2. DispatcherServletは、リクエスト処理を行うControllerの選択をHandlerMappingに委譲する。HandlerMappingは、リクエストURLにマッピングされているControllerを選定し(Choose Handler)ControllerDispatcherServletへ返却する。
  3. DispatcherServlet は、Controllerのビジネスロジック処理の実行をHandlerAdapterに委譲する。
  4. HandlerAdapter は、Controllerのビジネスロジック処理を呼び出す。
  5. Controllerは、ビジネスロジックを実行し、処理結果をModelに設定し、ビューの論理名をHandlerAdapterに返却する。
  6. DispatcherServletは、ビュー名に対応するViewの解決を、ViewResolverに委譲する。ViewResolverは、ビュー名にマッピングされているViewを返却する。
  7. DispatcherServletは、返却されたViewにレンダリング処理を委譲する。
  8. Viewは、Modelの持つ情報をレンダリングしてレスポンスを返却する。

2.2.2. Implementations of each component

これまで説明したコンポーネントのうち、拡張可能なコンポーネントを紹介する。

2.2.2.1. Implementation of HandlerMapping

Springから提供されているHandlerMappingのクラス階層を、以下に示す。

HandlerMapping Hierarchy
通常使用するのは、org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMappingである。
このクラスは、Bean定義されているContorllerから@RequestMappingアノテーションを読み取り、
URLと合致するControllerのメソッドをHandlerクラスとして扱うクラスである。
Spring Framework 3.1からは、RequestMappingHandlerMappingは、DispatcherServletが読み込むBean定義ファイルに、
<mvc:annotation-driven>の設定がある場合、デフォルトで設定される。
(<mvc:annotation-driven>アノテーションで有効になる設定は、Spring Framework Documentation -Enable MVC Configuration-を参照されたい。)

2.2.2.2. Implementation of HandlerAdapter

Springから提供されているHandlerAdapterのクラス階層を、以下に示す。

HandlerAdapter Hierarchy
通常使用するのは、org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapterである。
このクラスは、HandlerMappingによって選択されたHandlerクラス(Controller)のメソッドを呼び出すクラスである。
このクラスもSpring Framework 3.1からは、<mvc:annotation-driven>の設定がある場合、デフォルトで設定される。

2.2.2.3. Implementation of ViewResolver

Springおよび依存ライブラリから提供されているViewResolverのクラスを、以下に示す。

ViewResolver Hierarchy

通常(JSPを使う場合)は、

  • org.springframework.web.servlet.view.InternalResourceViewResolverを使用するが、

テンプレートエンジンTilesを使う場合は、

  • org.springframework.web.servlet.view.tiles3.TilesViewResolver

ファイルダウンロード用にストリームを返す場合は

  • org.springframework.web.servlet.view.BeanNameViewResolver

のように、返すViewによって使い分ける必要がある。

複数の種類のViewを扱う場合、ViewResolverの定義が複数必要となるケースがある。
複数のViewResolverを使う代表的な例として、ファイルのダウンロード処理が存在する画面アプリケーションが挙げられる。
画面(JSP)は、InternalResourceViewResolverViewを解決し、
ファイルダウンロードは、BeanNameViewResolverなどを使ってViewを解決する。
詳細はファイルダウンロードを参照されたい。

2.2.2.4. Implementation of View

Springおよび依存ライブラリから提供されているViewのクラスを、以下に示す。

View Hierarchy
Viewは、返したいレスポンスの種類によって変わる。
JSPを返す場合、org.springframework.web.servlet.view.JstlViewが使用される。
Springおよび依存ライブラリから提供されていないViewを扱いたい場合、Viewインタフェースを実装したクラスを拡張する必要がある。
詳細はファイルダウンロードを参照されたい。