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

Caution

本バージョンの内容は既に古くなっています。最新のガイドラインはこちらからご参照ください。

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

Spring Reference Document.

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 は、HandlerAdapterに対して、Controllerのビジネスロジック処理の実行を委譲する。
  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. Implementaion of HandlerMapping

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

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

2.2.2.2. Implementaion of HandlerAdapter

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

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

2.2.2.3. Implementaion of ViewResolver

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

ViewResolver Hierarchy

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

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

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

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

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

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

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

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

2.2.2.4. Implementaion of View

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

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