現在基于請求驅動的Web框架基本都是由單一的Servlet作為整個應用程式的前置處理器(Front Controller),該Servlet接收到具體的Web處理請求之后,會參照預先可配置的映射資訊,將待處理的Web請求轉發給次一級的控制器來處理,
DispatcherServlet就是Spring MVC框架中的這個單一的Servlet,它就是Spring MVC框架如此簡單好用的原因,我們只需要定義一個Controller,寫上自己的業務邏輯之后,即可處理Web請求了,原理就是Spring MVC已經幫我們周到的設計好了整個MVC處理的流程,該流程中的每個角色各司其職,我們需要做的僅僅只是按照模板流程填充我們的Controller代碼即可,DispatcherServlet就是這個流程的指揮官,負責這與各個角色之間的互動,在決議Spring MVC原始碼之前,有必要先介紹框架中的各個角色及其職能,
- DispatcherServlet:前置處理器,即指揮官,它本質就是Web容器里的Servlet,將各項作業細化并分離給了各個獨立的角色來完成
- HandlerMapping:處理器映射器,專門管理Web請求到具體的處理類之間的映射關系
- HandlerAdaptor:處理器配接器,Spring MVC并不只是支持Controller一種Handler型別,HandlerApapter可以幫助其使用其他型別的Handler,即幫助DispatcherServlet一統呼叫具體Handler的方法名,這樣當提供自定義的Handler時,也需提供對應的HandlerAdaptor
- Handler:處理器,負責實作對應某個具體Web請求的處理邏輯,Controller、Interceptor、Endpoint、Action(Struts)等都是處理器
- ModelAndView:邏輯視圖名稱和模型資料
- ViewResolver:處理邏輯視圖名與具體的View實體之間的映射關系
- View:處理最終的視圖渲染作業
了解了各個角色的職能后,那么這些角色間是如何互動的呢,Spring MVC處理流程如下:

其中,Handler即為我們的親密伙伴,只需通過注解@Controller、@RequestMapping即可完成功能開發,Spring3.1之后,基于注解的Controller對應的HandlerMapping和HandlerAdapter實作類分別為:
RequestMappingHandlerMapping和RequestMappingHandlerAdapter,他們都與@RequestMapping注解相關,分別幫助指揮官找到Controller和Controller中相應的方法,
DispatcherServlet中的核心代碼如下:
- 查找處理器:
// Determine handler for the current request.
mappedHandler = getHandler(processedRequest);
if (mappedHandler == null) {
noHandlerFound(processedRequest, response);
return;
}
- 查找處理器配接器:
// Determine handler adapter for the current request.
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
- 委托處理器配接器呼叫Handler,回傳ModelAndView:
// Actually invoke the handler.
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
處理器配接器呼叫Handler核心代碼如下:
- 引數系結:
invocableMethod.setDataBinderFactory(binderFactory);
invocableMethod.setParameterNameDiscoverer(this.parameterNameDiscoverer);
- ModelAndView初始化:
ModelAndViewContainer mavContainer = new ModelAndViewContainer();
mavContainer.addAllAttributes(RequestContextUtils.getInputFlashMap(request));
modelFactory.initModel(webRequest, mavContainer, invocableMethod);
mavContainer.setIgnoreDefaultModelOnRedirect(this.ignoreDefaultModelOnRedirect);
- 通過反射呼叫Handler中業務代碼:
invocableMethod.invokeAndHandle(webRequest, mavContainer);
轉載請註明出處,本文鏈接:https://www.uj5u.com/ruanti/279686.html
標籤:其他
上一篇:MVC三層架構
