SpringMVCの大きな流れ
- 最も一般的な例として、@Controller + Forward の場合の流れは以下の通りである。
- Browerからurlリクエストを送る。
- DispatcherServletがRequestを受け、HandlerMappingに転送する。
-
HandlerMappingでurlが一致するメソッドを見つけてDispatcherServletに返却する。
- MapでUrl(Key)とメソッド(Value)をmappingさせておいて保存している。
- DispatcherServletでどのような種類のHandlerAdapterが呼び出すことができるかを確認し、該当HandlerAdapterにリクエストを伝達する。
- 該当HandlerAdapterでどのControllerが処理できるかを見て該当Controllerにリクエストを伝達する。
-
ControllerはRequestに対して実際に処理するメソッドを呼び出し、Clientに送るデータをModelオブジェクトに入れ、View名前(文字列)をDispatcherServletに返却する。
- ex. return “registerForm”;
- DispatcherServletでView名前(文字列)をViewResolverに伝達する。
-
ViewResolverでは、View名前(文字列)に接頭辞接尾辞を付け、実際にどのようなViewファイルなのかを教えてくれる。
- ex. registerForm → /WEB-INF/views/registerForm.html
- servlet-context.xmlで設定の確認及び修正が可能である。
- どのTemplateを使用するかによって、Viewを多様に渡す。
- ex。 タイムリーフの場合はThymeleafView、jspの場合はJstlViewに渡すが、その他にも様々なviewがある。
- 実際のファイルがModelを持って最終応答を作ってClientに応答する。
すぐにControllerを呼び出さずに、途中でゆるい接続をしておいた理由?
- 変更に有利だから。
- 直接接続だったら、コントロールラーではない他の種類のオブジェクトを呼び出したりすると、直接DispatcherServletの内容を修正しなければならなかった。
- しかし、HandlerAdapterを通じてControllerを呼び出すことができるようにしておけば、他の種類のオブジェクト(ex.Servlet)を呼び出すことに変わっても、他のHandlerAdapterを使うことでDispacherServletを変更しなくても良い。