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


Spring MVCとは、Servlet APIをベースに構築されたフレームワークであり、リクエストによって実行するアクションを決定し処理の結果をHTMLとして返却するModel、View、Controlerを用いたアーキテクチャのことである。

詳しくは、Spring Framework Documentationを参照されたい。


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

Thymeleafを使う場合は、

  • org.thymeleaf.spring6.view.ThymeleafViewResolver

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

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

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

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

2.2.2.4. Implementation of View

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

View Hierarchy
Viewは、返したいレスポンスの種類によって変わる。
  • JSPを返す場合

    org.springframework.web.servlet.view.JstlViewが使用される

  • Thymeleafにより生成されたHTMLを返す場合

    org.thymeleaf.spring6.view.ThymeleafViewが使用される。

Springおよび依存ライブラリから提供されていないViewを扱いたい場合、Viewインタフェースを実装したクラスを拡張する必要がある。
詳細はファイルダウンロードを参照されたい。