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の処理フローを、以下の図に示す。
DispatcherServletが、リクエストを受け取る。DispatcherServletは、リクエスト処理を行うControllerの選択をHandlerMappingに委譲する。HandlerMappingは、リクエストURLにマッピングされているControllerを選定し(Choose Handler)、ControllerをDispatcherServletへ返却する。DispatcherServletは、Controllerのビジネスロジック処理の実行をHandlerAdapterに委譲する。HandlerAdapterは、Controllerのビジネスロジック処理を呼び出す。Controllerは、ビジネスロジックを実行し、処理結果をModelに設定し、ビューの論理名をHandlerAdapterに返却する。DispatcherServletは、ビュー名に対応するViewの解決を、ViewResolverに委譲する。ViewResolverは、ビュー名にマッピングされているViewを返却する。DispatcherServletは、返却されたViewにレンダリング処理を委譲する。Viewは、Modelの持つ情報をレンダリングしてレスポンスを返却する。
2.2.2. Implementations of each component¶
これまで説明したコンポーネントのうち、拡張可能なコンポーネントを紹介する。
2.2.2.1. Implementation of HandlerMapping¶
Springから提供されているHandlerMappingのクラス階層を、以下に示す。
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMappingである。Contorllerから@RequestMappingアノテーションを読み取り、ControllerのメソッドをHandlerクラスとして扱うクラスである。RequestMappingHandlerMappingは、DispatcherServletが読み込むBean定義ファイルに、<mvc:annotation-driven>の設定がある場合、デフォルトで設定される。<mvc:annotation-driven>アノテーションで有効になる設定は、Spring Framework Documentation -Enable MVC Configuration-を参照されたい。)2.2.2.2. Implementation of HandlerAdapter¶
Springから提供されているHandlerAdapterのクラス階層を、以下に示す。
org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapterである。HandlerMappingによって選択されたHandlerクラス(Controller)のメソッドを呼び出すクラスである。<mvc:annotation-driven>の設定がある場合、デフォルトで設定される。2.2.2.3. Implementation of ViewResolver¶
Springおよび依存ライブラリから提供されているViewResolverのクラスを、以下に示す。
JSPを使う場合は、
org.springframework.web.servlet.view.InternalResourceViewResolver
Thymeleafを使う場合は、
org.thymeleaf.spring6.view.ThymeleafViewResolver
ファイルダウンロード用にストリームを返す場合は
org.springframework.web.servlet.view.BeanNameViewResolver
のように、返すViewによって使い分ける必要がある。
Viewを扱う場合、ViewResolverの定義が複数必要となるケースがある。ViewResolverを使う代表的な例として、ファイルのダウンロード処理が存在する画面アプリケーションが挙げられる。InternalResourceViewResolverでViewを解決し、ThymeleafViewResolverでViewを解決し、BeanNameViewResolverなどを使ってViewを解決する。2.2.2.4. Implementation of View¶
Springおよび依存ライブラリから提供されているViewのクラスを、以下に示す。
Viewは、返したいレスポンスの種類によって変わる。JSPを返す場合
org.springframework.web.servlet.view.JstlViewが使用されるThymeleafにより生成されたHTMLを返す場合
org.thymeleaf.spring6.view.ThymeleafViewが使用される。
Viewを扱いたい場合、Viewインタフェースを実装したクラスを拡張する必要がある。