Spring Mvc原理
控制器(Controller)
前端控制器是DispatcherServlet盐数;應(yīng)用控制器其實拆為處理器映射器(Handler Mapping)進行處理器管理和視圖解析器(View Resolver)進行視圖管理栓霜;頁面控制器/動作/處理器為Controller接口(僅包含ModelAndView handleRequest(request, response) 方法)的實現(xiàn)(也可以是任何的POJO類)鹰祸。
控制器Controller 負責(zé)處理由DispatcherServlet 分發(fā)的請求稚疹,它把用戶請求的數(shù)據(jù)經(jīng)過業(yè)務(wù)處理層處理之后封裝成一個Model ,然后再把該Model 返回給對應(yīng)的View 進行展示冤竹。在SpringMVC 中提供了一個非常簡便的定義Controller 的方法钉寝,你無需繼承特定的類或?qū)崿F(xiàn)特定的接口,只需使用@Controller 標(biāo)記一個類是Controller 管引,然后使用@RequestMapping 和@RequestParam 等一些注解用以定義URL 請求和Controller 方法之間的映射戳葵,這樣的Controller 就能被外界訪問到。此外Controller 不會直接依賴于HttpServletRequest 和HttpServletResponse 等HttpServlet 對象汉匙,它們可以通過Controller 的方法參數(shù)靈活的獲取到拱烁。
Spring MVC的具體工作流程
1.用戶發(fā)起請求到前端控制器(Controller)DispatcherServlet。
2.DispatcherServlet對請求URL進行解析噩翠,得到請求資源標(biāo)識符(URI)戏自。然后根據(jù)該URI,調(diào)用HandlerMapping獲得該Handler配置的所有相關(guān)的對象(包括Handler對象以及Handler對象對應(yīng)的攔截器)伤锚,最后以HandlerExecutionChain對象的形式返回擅笔;
HandlerMapping返回執(zhí)行鏈,包含了2部分內(nèi)容: ① Handler對象、② 攔截器數(shù)組
3.DispatcherServlet 根據(jù)獲得的Handler猛们,選擇一個合適的HandlerAdapter念脯。(附注:如果成功獲得HandlerAdapter后,此時將開始執(zhí)行攔截器的preHandler(...)方法)
4.提取Request中的模型數(shù)據(jù)弯淘,填充Handler入?yún)⒙痰辏_始執(zhí)行Handler(Controller)。 在填充Handler的入?yún)⑦^程中庐橙,根據(jù)你的配置假勿,Spring將幫你做一些額外的工作:
HttpMessageConveter: 將請求消息(如Json、xml等數(shù)據(jù))轉(zhuǎn)換成一個對象态鳖,將對象轉(zhuǎn)換為指定的響應(yīng)信息
數(shù)據(jù)轉(zhuǎn)換:對請求消息進行數(shù)據(jù)轉(zhuǎn)換转培。如String轉(zhuǎn)換成Integer、Double等
數(shù)據(jù)根式化:對請求消息進行數(shù)據(jù)格式化浆竭。 如將字符串轉(zhuǎn)換成格式化數(shù)字或格式化日期等
數(shù)據(jù)驗證: 驗證數(shù)據(jù)的有效性(長度浸须、格式等),驗證結(jié)果存儲到BindingResult或Error中邦泄。
5.Handler執(zhí)行完成后删窒,向DispatcherServlet 返回一個ModelAndView對象;
6.根據(jù)返回的ModelAndView虎韵,選擇一個適合的ViewResolver(必須是已經(jīng)注冊到Spring容器中的ViewResolver)返回給DispatcherServlet ;
7.視圖解析器(ViewResolver)返回真正的視圖對象(View)缸废。
(此時前端控制器中既有視圖又有Model對象數(shù)據(jù))前端控制器根據(jù)模型數(shù)據(jù)和視圖對象包蓝,進行視圖渲染。返回渲染后的視圖(html/json/xml).
8.將渲染結(jié)果返回給客戶端企量。