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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 前端技术 > javascript >内容正文

javascript

面试问烂的 Spring MVC 过程

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

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

Spring MVC 過程

先來張圖:

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

(沒錯,就是 Spring 1.0 的代碼,大道至簡,現(xiàn)在的 Spring 經(jīng)過 15 年的發(fā)展,已經(jīng)太過臃腫,從學(xué)習(xí)角度來說,interface 21 是最好的代碼,不接受反駁)

代碼如下:

1. 設(shè)置屬性

//?1.?設(shè)置屬性 //?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. 根據(jù) Request 請求的 URL 得到對應(yīng)的 handler 執(zhí)行鏈,其實就是攔截器和 Controller 代理對象。

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

3. 得到 handler 的適配器

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

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

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

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

4. 循環(huán)執(zhí)行 handler 的 pre 攔截器

//?4.?循環(huán)執(zhí)行?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. 執(zhí)行真正的 handler,并返回 ModelAndView(Handler 是個代理對象,可能會執(zhí)行 AOP )

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

6. 循環(huán)執(zhí)行 handler 的 post 攔截器

//?6.?循環(huán)執(zhí)行?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. 根據(jù) ModelAndView 信息得到 View 實例

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

8. 渲染 View 返回

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

總結(jié)

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

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。