當前位置:
首頁 >
前端技术
> javascript
>内容正文
javascript
面试问烂的 Spring MVC 过程
生活随笔
收集整理的這篇文章主要介紹了
面试问烂的 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 过程的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 浅析 Mybatis 与 Hiberna
- 下一篇: 面试 Java 高级后端开发,要准备哪些