Springを使う上で、処理の流れをある程度理解できていないと色々困ることが多かったので、自身のメモも兼ねてソースを読んだ内容をまとめておきます。
DispatcherServlet
すべてのリクエストがこのServletの処理を実行します。
処理の流れを追いかけるには、doServiceメソッドからソースを眺めていけばいいと思います。
このServletが後続の処理(Controllerなど)を呼び出したり、JSPなどを利用してレスポンスを生成するために、
以下のようなBeanが必要となります。
- HandlerMapping
- HandlerAdaptor
- HandlerExceptionResolver
- ViewResolver
- LocaleResolver
- ThemeResolver
- MultipartResolver
- FlashMapManager
大まかな処理の流れとしては、以下のようになります。
- HandlerMappingを利用して、リクエストから後続の処理を取得する。
- HandlerAdapterを利用して、1で取得した処理を実行する。
3-1. 処理2を実行した結果、例外が発生しなかった場合は、ViewResolverを利用して、2の処理結果からViewを取得し、描画処理を実行する。
3-2. 処理2を実行した結果、例外が発生した場合は、HandlerExceptionResolverで発生した例外を処理するメソッドを取得し実行する。
HandlerMapping
getHandleメソッドでリクエストから後続の処理を取得し、HandlerExecutionChainを返却します。
HandlerExecutionChainはhandler(後続のControllerメソッド)だけでなく、複数のInterceptorも含めて保持することができます。
DispatcherServletはこのHandlerExecutionChainを利用して、Interceptorやhandlerを実行しています。
このインターフェースの実装でよく利用するクラスが、RequestMappingHanlderMappingクラスです。
このクラスはControllerクラスの@RequestMapping
の内容をもとに、リクエストと処理を結びつけます。
HandlerAdapter
HandlerMappingで取得したhandlerを実行するためのAdatpterクラスです。
handler実行前、実行後にいい感じに処理を行います。(ざっくり)
このインターフェースの実装でよく利用するクラスが、RequestMappingHandlerAdapterクラスです。
リクエストパラメータをオブジェクトに格納したり、Validationを行ったり、handlerの戻り値からModelAndViewを生成したりしてくれます。
(厳密には、HandlerMethodArgumentResolverやHandlerMethodReturnValueHandlerに処理を委譲していますが。)
HandlerExceptionResolver
例外が発生した場合、その例外と後続処理を結びつけます。
このインターフェースの実装でよく利用するクラスが、ExceptionHandlerExceptionResolverクラスです。
ContollerやControllerAdviceで@ExceptionHandler
を付与したメソッドは、このクラスから実行されます。
ちなみに中身を確認するとわかりますが、ControllerとControllerAdviceに同じ例外を処理する@ExceptionHandler
がある場合は、Controller側が優先されます。
ViewResolver
ViewNameからViewクラスを取得することができます。
このインターフェースの実装でよく利用するクラスが、InternalResourceViewResolverクラスです。
このクラスはViewNameからJSPを描画するためのJstlViewを取得することができます。
また、ViewNameに"redirect:"というprefixが設定されている場合は、リダイレクト処理を行うためのRedirectViewを生成したりします。
LocaleResolver
リクエストからLocaleを取得することができるそうです。
利用したことがないので詳しいことはわかりませんが、SessionLocaleResolverを利用すれば、SessionにLocaleの情報を保持できるので、利用者ごとのLocaleを管理することができそうです。
ThemeResolver
リクエストからThemeを取得することができるそうです。
そもそもSpringのThemeというものを利用したことがないので、詳しくはわかっておりません。。
MultipartResolver
multipart/form-dataリクエストからMultipartFileを生成するためのインターフェースです。
ファイルアップロードなどの機能が必要な場合には、このResolverをBean定義する必要があります。
FlashMapManager
FlashScopeを管理するためのインターフェースです。FlashScopeはリダイレクト先まで値を保持するためのスコープです。
通常はSessionFlashMapManagerを利用し、Sessionを利用してFlashScopeを実現しています。
仕組みについてはこちらにさらっと書いていますので、よろしければご参照ください。
SpringMVCでRedirectAttributesを使用せずにリダイレクト先に値を渡す