中文字幕av专区_日韩电影在线播放_精品国产精品久久一区免费式_av在线免费观看网站

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

從源碼角度看spring mvc的請求處理過程

發布時間:2020-10-06 02:55:14 來源:腳本之家 閱讀:159 作者:zxin1 欄目:編程語言

在分析spring mvc源碼之前,先看一張圖:

從源碼角度看spring mvc的請求處理過程

請求處理的過程:

1.DispatcherServelt作為前端控制器,攔截request對象。

2.DispatcherServlet接收到request對象之后,查詢HandlerMapping,得到一個HandlerExecutionChain對象。

3.DispatcherServlet將Handler對象交由HandlerAdapter(適配器模式的典型應用),調用相應的controller方法。

4.Controller方法返回ModelAndView對象,DispatcherServlet將view交由ViewResolver進行解析,得到相應的視圖。用model渲染視圖。

5.返回響應結果。

整個過程的流程其實就是DispatcherServelt中doDispatch()方法的調用過程。

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
//第一步攔截request對象,doDispatch()方法在doService()方法中被調用,request對象是經過處理的。
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.
//主要看這里,這里是得到HandlerExecutionChain的方法。關于Handler()方法向下看
mappedHandler = getHandler(processedRequest);
if (mappedHandler == null || mappedHandler.getHandler() == null) {
noHandlerFound(processedRequest, response);
return;
}
// Determine handler adapter for the current request.
//這里已經獲取到HandlerExecutionChain對象,接下來就要獲取HandlerAdapter對象,調用Handler對象的方法。
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
// Process last-modified header, if supported by the handler
//有關瀏覽器緩存的設定(304)
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;
}
}
//pan'du
if (!mappedHandler.applyPreHandle(processedRequest, response)) {
return;
}
// Actually invoke the handler.
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
if (asyncManager.isConcurrentHandlingStarted()) {
return;
}
//解析視圖,數據渲染
applyDefaultViewName(request, mv);
mappedHandler.applyPostHandle(processedRequest, response, mv);
}
catch (Exception ex) {
dispatchException = ex;
}
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);
}
}
}
}
protected HandlerExecutionChain getHandler(HttpServletRequest request) throws Exception {
//遍歷HandlerMappingList對象(存儲若干個HandlerMapping對象),不斷調用,直到不為空為止,否則返回null
for (HandlerMapping hm : this.handlerMappings) {
if (logger.isTraceEnabled()) {
logger.trace(
"Testing handler map [" + hm + "] in DispatcherServlet with name '" + getServletName() + "'");
}
HandlerExecutionChain handler = hm.getHandler(request);
if (handler != null) {
return handler;
}
}
return null;
}

以上就是本文的全部內容,希望對大家的學習有所幫助,也希望大家多多支持億速云。

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

屏东县| 尚志市| 阳江市| 临潭县| 奇台县| 米易县| 泰安市| 运城市| 横山县| 陈巴尔虎旗| 乌什县| 大石桥市| 梓潼县| 双城市| 龙门县| 那曲县| 开鲁县| 定远县| 乐昌市| 长葛市| 宁明县| 周口市| 铁岭县| 阿拉善右旗| 响水县| 正定县| 丹寨县| 犍为县| 静安区| 平谷区| 松滋市| 肇州县| 白银市| 林芝县| 唐河县| 宾川县| 永丰县| 马龙县| 四子王旗| 景谷| 嘉定区|