日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

请求成功得到返回数据还是走到catch_面试:SpringMVC在接收到请求后的调用细节是什么?...

發布時間:2025/4/16 javascript 35 豆豆
生活随笔 收集整理的這篇文章主要介紹了 请求成功得到返回数据还是走到catch_面试:SpringMVC在接收到请求后的调用细节是什么?... 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

分享自己在Java方面的所思所想,希望你看完之后能有更多更深入的了解

本人微信公眾號(jwfy的學習分享),歡迎關注~

接收到一個新的請求之后,spring就會去根據請求的URL信息選擇具體的代碼塊去執行操作,如圖就是接收到一個新的請求調用圖,從Tomcat開始直到把請求分發到spring中,最后到了doDispatch方法。

本篇學習筆記主要就是講一個新的請求被分發到spring中spring如何處理,至于如何掃描包中的controller,得到URL配置信息可以看 你是否清楚Spring MVC中的URL映射管理器的工作原理 ,而本篇主要介紹了

  • 獲取執行鏈
  • 404頁面設置
  • 獲取適配器
  • LastModified
  • 內容方法調用(invoke)
  • 視圖渲染

讓我們更加清楚的知道spring中一般的方法是如何確定調用的具體方法的,適配不同的模板引擎,達到渲染的地步,再者有時候又是API一般只需要返回json結構的數據,其背后的原理是如何實現的,以及我們在使用過程中如何避免出現的各種問題。

doDispatch 方法

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; // 初始化設置模板為null Exception dispatchException = null; // 初始化異常為null try { processedRequest = checkMultipart(request); multipartRequestParsed = (processedRequest != request); // 文件上傳的相關設置和操作 mappedHandler = getHandler(processedRequest); // 根據request獲取對應的請求執行鏈 if (mappedHandler == null || mappedHandler.getHandler() == null) { // 如果沒有對應的handler對于,則應該是定義為404,通過noHandlerFound確認 noHandlerFound(processedRequest, response); return; } // 通過handler獲得合適的handler適配器 HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler()); String method = request.getMethod(); boolean isGet = "GET".equals(method); if (isGet || "HEAD".equals(method)) { // 是get方法或者head方法 long lastModified = ha.getLastModified(request, mappedHandler.getHandler()); // 如果handler 是LastModified類,則獲取其lastModified值,否則返回-1 // lastModify 是spring添加了緩存機制,當重復請求同樣的內容,返回403,而不會返回真正的內容,具體可看下面的LastModified機制這一小節 if (logger.isDebugEnabled()) { logger.debug("Last-Modified value for [" + getRequestUri(request) + "] is: " + lastModified); } if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) { return; } } // 前置的handler預處理,就是獲取執行鏈的攔截器,對請求進行攔截處理 if (!mappedHandler.applyPreHandle(processedRequest, response)) { // 如果攔截器攔截成功,返回false,直接結束了 // 當然在這其中攔截器肯定需要特定返回自身的內容到response中,便于展示在頁面上 // 不過從頁面角度出發并沒有非常實質性的攔截器處理,這點存疑? return; } // 真正的調用各自的執行方法,返回ModelAndView后續在invoke這一小節細說 mv = ha.handle(processedRequest, response, mappedHandler.getHandler()); if (asyncManager.isConcurrentHandlingStarted()) { return; } applyDefaultViewName(processedRequest, mv); // 如果mv沒有包含有效的視圖,則從dispatch的viewNameTranslator屬性上獲取對應的默認視圖 mappedHandler.applyPostHandle(processedRequest, response, mv); // 攔截器的后置處理 } catch (Exception ex) { dispatchException = ex; } catch (Throwable err) { dispatchException = new NestedServletException("Handler dispatch failed

總結

以上是生活随笔為你收集整理的请求成功得到返回数据还是走到catch_面试:SpringMVC在接收到请求后的调用细节是什么?...的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。