日韩av黄I国产麻豆传媒I国产91av视频在线观看I日韩一区二区三区在线看I美女国产在线I麻豆视频国产在线观看I成人黄色短片

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 >

面试问烂的 Spring MVC 过程

發布時間:2025/3/21 29 豆豆
生活随笔 收集整理的這篇文章主要介紹了 面试问烂的 Spring MVC 过程 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

SpringMVC ,這個應該是國內面試必問題,網上有很多答案,其實背背就可以。但今天筆者帶大家一起深入淺出源碼,看看他的原理。以期讓印象更加深刻,面試的時候游刃有余。

Spring MVC 過程

先來張圖:

代碼位置:com.interface21.web.servlet.DispatcherServlet#doService

(沒錯,就是 Spring 1.0 的代碼,大道至簡,現在的 Spring 經過 15 年的發展,已經太過臃腫,從學習角度來說,interface 21 是最好的代碼,不接受反駁)

代碼如下:

1. 設置屬性

//?1.?設置屬性 //?Make?web?application?context?available request.setAttribute(WEB_APPLICATION_CONTEXT_ATTRIBUTE,?getWebApplicationContext());//?Make?locale?resolver?available request.setAttribute(LOCALE_RESOLVER_ATTRIBUTE,?this.localeResolver);//?Make?theme?resolver?available request.setAttribute(THEME_RESOLVER_ATTRIBUTE,?this.themeResolver);

2. 根據 Request 請求的 URL 得到對應的 handler 執行鏈,其實就是攔截器和 Controller 代理對象。

//?2.?找?handler?返回執行鏈 HandlerExecutionChain?mappedHandler?=?getHandler(request);

3. 得到 handler 的適配器

//?This?will?throw?an?exception?if?no?adapter?is?found //?3.?返回?handler?的適配器 HandlerAdapter?ha?=?getHandlerAdapter(mappedHandler.getHandler());

關于這個適配器,作用到底是啥呢?HandlerAdapter 注釋寫到:This interface is not intended for application developers. It is available to handlers who want to develop their own web workflow.
譯:此接口不適用于應用程序開發人員。它適用于想要開發自己的Web工作流程的處理程序。

也就說說,如果你想要在處理 handler 之前做一些操作的話,可能需要這個,即適配一下這個 handler。例如 Spring 的測試程序做的那樣:

public?ModelAndView?handle(HttpServletRequest?request,?HttpServletResponse?response,?Object?delegate)throws?IOException,?ServletException?{//?你可能需要?doSomething.......((MyHandler)?delegate).doSomething(request);return?null;}

4. 循環執行 handler 的 pre 攔截器

//?4.?循環執行?handler?的?pre?攔截器 for?(int?i?=?0;?i?<?mappedHandler.getInterceptors().length;?i++)?{HandlerInterceptor?interceptor?=?mappedHandler.getInterceptors()[i];//?pre?攔截器if?(!interceptor.preHandle(request,?response,?mappedHandler.getHandler()))?{return;} }

這個沒什么好講的吧?

5. 執行真正的 handler,并返回 ModelAndView(Handler 是個代理對象,可能會執行 AOP )

//?5.?執行真正的?handler,并返回??ModelAndView(Handler?是個代理對象,可能會執行?AOP?) ModelAndView?mv?=?ha.handle(request,?response,?mappedHandler.getHandler());

6. 循環執行 handler 的 post 攔截器

//?6.?循環執行?handler?的?post?攔截器 for?(int?i?=?mappedHandler.getInterceptors().length?-?1;?i?>=0?;?i--)?{HandlerInterceptor?interceptor?=?mappedHandler.getInterceptors()[i];//?post?攔截器interceptor.postHandle(request,?response,?mappedHandler.getHandler()); }

7. 根據 ModelAndView 信息得到 View 實例

View?view?=?null; if?(mv.isReference())?{//?We?need?to?resolve?this?view?name//?7.?根據?ModelAndView?信息得到?View?實例view?=?this.viewResolver.resolveViewName(mv.getViewName(),?locale); }

8. 渲染 View 返回

//?8.?渲染?View?返回 view.render(mv.getModel(),?request,?response);

總結

以上是生活随笔為你收集整理的面试问烂的 Spring MVC 过程的全部內容,希望文章能夠幫你解決所遇到的問題。

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