摘要:前端控制器根據(jù)返回的視圖名,選擇相應(yīng)的視圖進行渲染,并將模型數(shù)據(jù)傳入到視圖中以便展示。前端控制器將響應(yīng)的結(jié)果返回給用戶。
SpringMVC總結(jié) 一、spring MVC的工作內(nèi)容
將URL映射到Java類或者方法
封裝用戶提交的數(shù)據(jù)
處理請求,調(diào)用相關(guān)的業(yè)務(wù)層,并封裝響應(yīng)的數(shù)據(jù)
將要響應(yīng)的數(shù)據(jù)進行渲染
二、SpringMVC的優(yōu)點和特點與spring無縫集成(IOC、AOP)
約定優(yōu)于配置
性能比Struts2好
設(shè)計中的角色或者職責(zé)劃分明確
Restful
JUnit測試
異常處理
本地化、國際化
數(shù)據(jù)驗證、類型轉(zhuǎn)化等
攔截器
使用的人和公司比較多
簡單、便捷、易學(xué)
springMVC處理請求的流程springMVC基于請求驅(qū)動,所有設(shè)計都圍繞一個中央servlet展開,它負(fù)責(zé)將請求分發(fā)給各個處理器(頁面控制器、Controller),下圖展示了springMVC處理請求的流程,圖中的Front Controller(前端控制器)正是springMVC的DispatcherServlet;Controller稱為處理器或應(yīng)用控制器,由它來處理具體的請求,返回數(shù)據(jù)模型;View Template為具體視圖,用于展示數(shù)據(jù),響應(yīng)請求.
用戶發(fā)送請求,被前端攔截器攔截,前端控制器根據(jù)請求的信息選擇相應(yīng)的頁面控制器,并將請求委托給此頁面控制器來處理。
頁面控制器接收到請求后,首先收集并綁定請求參數(shù)到一個命令對象(表單對象)中,并進行驗證轉(zhuǎn)換等操作,然后將命令對象委托給業(yè)務(wù)對象處理,最后返回一個modelAndView對象。
前端控制器根據(jù)返回的視圖名,選擇相應(yīng)的視圖進行渲染,并將模型數(shù)據(jù)傳入到視圖中以便展示。
前端控制器將響應(yīng)的結(jié)果返回給用戶。
先上一段代碼:
/** * Process the actual dispatching to the handler. *The handler will be obtained by applying the servlet"s HandlerMappings in order. * The HandlerAdapter will be obtained by querying the servlet"s installed HandlerAdapters * to find the first that supports the handler class. *
All HTTP methods are handled by this method. It"s up to HandlerAdapters or handlers * themselves to decide which methods are acceptable. * @param request current HTTP request * @param response current HTTP response * @throws Exception in case of any kind of processing failure */ /** * 處理實際的請求分發(fā)到處理器. * 要獲得具體的Handler, 需要先使用servlet的HandlerMappings. * 要獲得HandlerAdpter, 需要先在servlet加載的各HandlerAdapter中查找, 找到第一個支持此Handler的Adapter. * 所有的HTTP方法都通過這個方法來處理的. 這個方法中, 由HandlerAdapter或Handler自己來決定哪些方法可以被調(diào)用. * @param request current HTTP request * @param response current HTTP response * @throws Exception in case of any kind of processing failure */ protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception { HttpServletRequest processedRequest = request; HandlerExecutionChain mappedHandler = null; boolean multipartRequestParsed = false; WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request); try { ModelAndView mv = null; Exception dispatchException = null; try { // 檢查請求是否為multipart(文件上傳) processedRequest = checkMultipart(request); multipartRequestParsed = (processedRequest != request); // Determine handler for the current request. // 圖中2,3兩步, 通過HandlerMappsing映射, 獲取處理請求的Handler mappedHandler = getHandler(processedRequest); if (mappedHandler == null || mappedHandler.getHandler() == null) { noHandlerFound(processedRequest, response); return; } // Determine handler adapter for the current request. // 圖中步驟4, 將Handler包裝成Adapter HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()); // Process last-modified header, if supported by the handler. String method = request.getMethod(); boolean isGet = "GET".equals(method); if (isGet || "HEAD".equals(method)) { long lastModified = ha.getLastModified(request, mappedHandler.getHandler()); if (logger.isDebugEnabled()) { logger.debug("Last-Modified value for [" + getRequestUri(request) + "] is: " + lastModified); } if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) { return; } } // 前置攔截器 if (!mappedHandler.applyPreHandle(processedRequest, response)) { return; } // Actually invoke the handler. // 圖中5,6,7步驟, 由HandlerAdapter調(diào)用真正的處理器處理請求, 并返回ModelAndView對象 mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); if (asyncManager.isConcurrentHandlingStarted()) { return; } applyDefaultViewName(processedRequest, mv); // 后置攔截器 mappedHandler.applyPostHandle(processedRequest, response, mv); } catch (Exception ex) { dispatchException = ex; } // 圖中8,9,10,11步驟, 處理Handler的處理結(jié)果, 這個結(jié)果可能是一個ModelAndView對象, 還可能是一個異常 // 第8,9步, 由viewResolver解析視圖 // viewResolver.resolveViewName(viewName, locale) // 第10, 11步, 傳入Model, 并渲染視圖 // view.render(mv.getModelInternal(), request, response); processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException); } catch (Exception ex) { triggerAfterCompletion(processedRequest, response, mappedHandler, ex); } catch (Error err) { triggerAfterCompletionWithError(processedRequest, response, mappedHandler, err); } finally { if (asyncManager.isConcurrentHandlingStarted()) { // Instead of postHandle and afterCompletion if (mappedHandler != null) { // 完成時攔截器 mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response); } } else { // Clean up any resources used by a multipart request. if (multipartRequestParsed) { cleanupMultipart(processedRequest); } } } }
步驟①, DispatcherServlet作為前端控制器, 統(tǒng)一的請求接收點, 控制全局的請求流程. 接收到用戶請求, 自己不做處理, 而是將請求委托給其他的處理器進行處理.
步驟②③, DispatcherServlet通過HandlerMapping(處理映射器), 將請求映射為一個HandlerExecutionChain對象, 其中包括了頁面控制器和對其配置的攔截器.
步驟④, DispatcherServlet通過獲得的Handler(處理器, 頁面控制器, Controller), 查找一個合適的HandlerAdapter(處理器適配器), 通過這個HandlerAdapter調(diào)用Handler實際處理請求的方法.
步驟⑤, 提取請求中的模型數(shù)據(jù), 調(diào)用Handler實際處理請求的方法. 在調(diào)用方法時, 填充參數(shù)過程中, spring會根據(jù)配置做一些工作, 如: 數(shù)據(jù)轉(zhuǎn)換, 數(shù)據(jù)格式化, 數(shù)據(jù)驗證等.
步驟⑥⑦, Handler執(zhí)行完成后, 將返回一個ModelAndView對象給DispatherServlet. ModelAndView對象中包含邏輯視圖名或邏輯視圖名和模型.
步驟⑧, 根據(jù)ModelAndView對象選擇一個合適的ViewResolver(視圖解析器).
步驟⑨, ViewResolver將ModelAndView中的邏輯視圖名解釋成View對象. ViewResolver也是接口, 同樣采用了策略模式, 這樣就很容易切換其他的視圖類型.
步驟⑩?, 渲染視圖時, 將Model數(shù)據(jù)傳入視圖中, 這里的Model數(shù)據(jù)是一個Map, 容易與各種視圖類型相結(jié)合.
步驟?, 最后, 由DispatcherServlet將最終的響應(yīng)結(jié)果返回給用戶.
通過這些步驟, springmvc依賴幾個對象共同完成了請求到響應(yīng)的工作流程, 對于開發(fā)者來說, 這些對象是不可見的, 開發(fā)者只需要關(guān)心Handler處理器(頁面控制器)中對請求的處理業(yè)務(wù)即可.文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/68036.html
摘要:攔截器學(xué)習(xí)總結(jié)時間年月日星期六說明本文部分內(nèi)容均來自慕課網(wǎng)。慕課網(wǎng)教學(xué)示例源碼暫無。攔截器不依賴與容器,過濾器依賴與容器。攔截器只能對請求起作用,而過濾器則可以對幾乎所有的請求起作用。共性問題在攔截器中處理,可以減少重復(fù)代碼,便于維護。 《SpringMVC攔截器》學(xué)習(xí)總結(jié) 時間:2017年2月18日星期六說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.co...
摘要:起步學(xué)習(xí)總結(jié)時間年月日星期四說明本文部分內(nèi)容均來自慕課網(wǎng)。慕課網(wǎng)教學(xué)示例源碼個人學(xué)習(xí)源碼第一章簡介起步課程簡介簡介基本概念項目搭建用進行開發(fā)課程總結(jié)前端控制器開發(fā)應(yīng)用的通用架構(gòu)方式。 《SpringMVC起步》學(xué)習(xí)總結(jié) 時間:2017年2月16日星期四說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.com教學(xué)示例源碼:https://github.com/z...
摘要:數(shù)據(jù)綁定入門學(xué)習(xí)總結(jié)時間年月日星期日說明本文部分內(nèi)容均來自慕課網(wǎng)。慕課網(wǎng)教學(xué)示例源碼個人學(xué)習(xí)源碼第一章課程介紹數(shù)據(jù)綁定入門概述數(shù)據(jù)綁定概念來自百度百科簡單綁定是將一個用戶界面元素控件的屬性綁定到一個類型對象實例上的某個屬性的方法。 《SpringMVC數(shù)據(jù)綁定入門》學(xué)習(xí)總結(jié) 時間:2017年2月19日星期日說明:本文部分內(nèi)容均來自慕課網(wǎng)。@慕課網(wǎng):http://www.imooc.co...
摘要:入門筆記簡介是一種基于的實現(xiàn)了設(shè)計模式的請求驅(qū)動類型的輕量級框架,是系開源項目中的一個,和配合使用。配置在中需要添加使用的和映射規(guī)則。入門較快,而掌握起來相對較難。 SpringMVC入門筆記 1. 簡介 Spring MVC是一種基于Java的實現(xiàn)了Web MVC設(shè)計模式的請求驅(qū)動類型的輕量級Web框架 ,是Spring系開源項目中的一個,和IoC配合使用。通過策略接口,Spring...
摘要:只要有一個攔截器不放行,不能執(zhí)行完成號不放行和號不放行測試結(jié)果總結(jié)只有前邊的攔截器方法放行,下邊的攔截器的才執(zhí)行。至于他們的攔截器鏈的調(diào)用順序,和的是沒有差別的。 前言 本博文主要講解的知識點如下: 校驗器 統(tǒng)一處理異常 RESTful 攔截器 Validation 在我們的Struts2中,我們是繼承ActionSupport來實現(xiàn)校驗的...它有兩種方式來實現(xiàn)校驗的功能 手寫...
閱讀 1599·2021-11-22 09:34
閱讀 1690·2019-08-29 16:36
閱讀 2668·2019-08-29 15:43
閱讀 3113·2019-08-29 13:57
閱讀 1298·2019-08-28 18:05
閱讀 1875·2019-08-26 18:26
閱讀 3243·2019-08-26 10:39
閱讀 3455·2019-08-23 18:40