LoginSignup
10
14

More than 5 years have passed since last update.

SpringWebMVCでのリクエストからレスポンスまでのざっくりした流れを理解する

Posted at

Springを使う上で、処理の流れをある程度理解できていないと色々困ることが多かったので、自身のメモも兼ねてソースを読んだ内容をまとめておきます。

DispatcherServlet

すべてのリクエストがこのServletの処理を実行します。
処理の流れを追いかけるには、doServiceメソッドからソースを眺めていけばいいと思います。

このServletが後続の処理(Controllerなど)を呼び出したり、JSPなどを利用してレスポンスを生成するために、
以下のようなBeanが必要となります。

  • HandlerMapping
  • HandlerAdaptor
  • HandlerExceptionResolver
  • ViewResolver
  • LocaleResolver
  • ThemeResolver
  • MultipartResolver
  • FlashMapManager

大まかな処理の流れとしては、以下のようになります。
1. HandlerMappingを利用して、リクエストから後続の処理を取得する。
2. 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を使用せずにリダイレクト先に値を渡す

10
14
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
10
14