1.spring mvc入門

 

1.前端控制器是DispatcherServlet前端

2.應用控制器其實拆爲:a,處理器映射器(Handler Mapping),用於進行處理器管理web

                                    b,視圖解析器(View Resolver),用於進行視圖管理;spring

3,頁面控制器/動做/處理器爲Controller接口(包含ModelAndView handleRequest(request, response) 方法)的實現(也能夠是任何的POJO類);支持本地化(Locale)解析、主題(Theme)解析及文件上傳等;提供了很是靈活的數據驗證、格式化和數據綁定機制;提供了強大的約定大於配置(慣例優先原則)的契約式編程支持。編程

 

spring web mvc 架構設計模式

Spring Web MVC框架也是一個基於請求驅動的Web框架,而且也使用了前端控制器模式來進行設計,再根據請求映射規則分發給相應的頁面控制器(動做/處理器)進行處理(我的理解:和struts相似,經過配置文件查找相應的action)緩存

 

spring web mvc 處理請求的流程數據結構

 

 

具體執行步驟以下:架構

一、  首先用戶發送請求————>前端控制器(也就是springmvc核心,DispatcherServlet),前端控制器根據請求信息(如URL)來決定選擇哪個頁面控制器(也就是controller)進行處理並把請求委託給它,即之前的控制器的控制邏輯部分;圖中的一、2步驟;mvc

二、  頁面控制器接收到請求後,進行功能處理,首先須要收集和綁定請求參數到一個對象,這個對象在Spring Web MVC中叫命令對象,並進行驗證,而後將命令對象委託給業務對象進行處理;處理完畢後返回一個ModelAndView(模型數據和邏輯視圖名);圖中的三、四、5步驟;app

三、  前端控制器收回控制權,而後根據返回的邏輯視圖名,選擇相應的視圖進行渲染,並把模型數據傳入以便視圖渲染;圖中的步驟六、7;

四、  前端控制器再次收回控制權,將響應返回給用戶,圖中的步驟8;至此整個結束。

 

 

 

spring web mvc 架構

 

 架構圖對應的DispatcherServlet核心代碼以下:

//前端控制器分派方法  
protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {  
        HttpServletRequest processedRequest = request;  
        HandlerExecutionChain mappedHandler = null;  
        int interceptorIndex = -1;  
  
        try {  
            ModelAndView mv;  
            boolean errorView = false;  
  
            try {  
                   //步驟一、檢查是不是請求是不是multipart(如文件上傳),若是是將經過MultipartResolver解析  
                processedRequest = checkMultipart(request);  
                   //步驟二、請求處處理器(頁面控制器)的映射,經過HandlerMapping進行映射。ps:(我的理解:
//項目啓動時會註冊springmvc項目的配置文件中的bean,若是配置文件中沒有指定默認會註冊DispatcherServlet.properties配置文件中的bean,
//DispatcherServlet.properties這個配置文件是springmvc本身的,對應處理器的bean就是HandlerMapping對象,
//HandlerMapping對象爲BeanNameUrlHandlerMapping,DefaultAnnotationHandlerMapping,我的理解就是有經過url對應的,
//有的是經過註解對應的,而後將這兩個HandlerMapping放到handlerMappings這個list中,這個動做是在項目啓動時候初始化一些處理器、解析器時候操做的,
//再根據request去HandlerMapping中獲取handler也就是處理器,不爲空的handler就是要獲取的處理器,此處理器包含映射關係,
//映射關係爲請求的url具體請求哪一個controller)


                mappedHandler = getHandler(processedRequest, false);  
                if (mappedHandler == null || mappedHandler.getHandler() == null) {  
                    noHandlerFound(processedRequest, response);  
                    return;  
                }  
                   //步驟三、處理器適配,即將咱們的處理器包裝成相應的適配器(從而支持多種類型的處理器)。ps:(我的理解:
//項目啓動時也會註冊配置文件中的bean,原理和步驟2我的理解中一致,對應適配器的bean就是HandlerAdapter對象,
//HandlerAdapter對象爲HttpRequestHandlerAdapter,SimpleControllerHandlerAdapter,AnnotationMethodHandlerAdapter這些接口,
//這些接口都實現了HandlerAdapter,HandlerAdapter接口中有一個support判斷,還有一個處理請求的方法handle,
//經過傳入參數也就是處理器調用support方法來決定具體獲得哪一個適配器也就是用哪一個實現類來處理,support方法就是判斷了處理器中映射的頁面控制器是否繼承了Controller,
//再調用適配器的handle方法處理請求,也就是用實現類處理,實現類中的處理會調用handleRequest方法,此方法是Controller接口中的,
//再調用具體的實現類處理咱們的請求,此實現類也就是頁面控制器,咱們編寫的controller)


                HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());  
  
                  // 304 Not Modified緩存支持  
                //此處省略具體代碼  
  
                // 執行處理器相關的攔截器的預處理(HandlerInterceptor.preHandle)  
                //此處省略具體代碼  
  
                // 步驟四、由適配器執行處理器(調用處理器相應功能處理方法)  
                mv = ha.handle(processedRequest, response, mappedHandler.getHandler());  
  
                // Do we need view name translation?  
                if (mv != null && !mv.hasView()) {  
                    mv.setViewName(getDefaultViewName(request));  
                }  
  
                // 執行處理器相關的攔截器的後處理(HandlerInterceptor.postHandle)  
                //此處省略具體代碼  
            }  
            catch (ModelAndViewDefiningException ex) {  
                logger.debug("ModelAndViewDefiningException encountered", ex);  
                mv = ex.getModelAndView();  
            }  
            catch (Exception ex) {  
                Object handler = (mappedHandler != null ? mappedHandler.getHandler() : null);  
                mv = processHandlerException(processedRequest, response, handler, ex);  
                errorView = (mv != null);  
            }  
  
            //步驟5 步驟六、解析視圖並進行視圖的渲染  
//步驟5 由ViewResolver解析View(viewResolver.resolveViewName(viewName, locale))  
//步驟6 視圖在渲染時會把Model傳入(view.render(mv.getModelInternal(), request, response);)  
            if (mv != null && !mv.wasCleared()) {  
                render(mv, processedRequest, response);  
                if (errorView) {  
                    WebUtils.clearErrorRequestAttributes(request);  
                }  
            }  
            else {  
                if (logger.isDebugEnabled()) {  
                    logger.debug("Null ModelAndView returned to DispatcherServlet with name '" + getServletName() +  
                            "': assuming HandlerAdapter completed request handling");  
                }  
            }  
  
            // 執行處理器相關的攔截器的完成後處理(HandlerInterceptor.afterCompletion)  
            //此處省略具體代碼  
  
  
        catch (Exception ex) {  
            // Trigger after-completion for thrown exception.  
            triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, ex);  
            throw ex;  
        }  
        catch (Error err) {  
            ServletException ex = new NestedServletException("Handler processing failed", err);  
            // Trigger after-completion for thrown exception.  
            triggerAfterCompletion(mappedHandler, interceptorIndex, processedRequest, response, ex);  
            throw ex;  
        }  
  
        finally {  
            // Clean up any resources used by a multipart request.  
            if (processedRequest != request) {  
                cleanupMultipart(processedRequest);  
            }  
        }  
    }

 

核心架構的具體流程步驟以下:

一、  首先用戶發送請求——>DispatcherServlet,前端控制器收到請求後本身不進行處理,而是委託給其餘的解析器進行處理,做爲統一訪問點,進行全局的流程控制;

二、  DispatcherServlet——>HandlerMapping, HandlerMapping將會把請求映射爲HandlerExecutionChain對象(包含一個Handler處理器(頁面控制器)對象、多個HandlerInterceptor攔截器)對象,經過這種策略模式,很容易添加新的映射策略;

三、  DispatcherServlet——>HandlerAdapter,HandlerAdapter將會把處理器包裝爲適配器,從而支持多種類型的處理器,即適配器設計模式的應用,從而很容易支持不少類型的處理器;

四、  HandlerAdapter——>處理器功能處理方法的調用,HandlerAdapter將會根據適配的結果調用真正的處理器的功能處理方法,完成功能處理;並返回一個ModelAndView對象(包含模型數據、邏輯視圖名);

五、  ModelAndView的邏輯視圖名——> ViewResolver, ViewResolver將把邏輯視圖名解析爲具體的View,經過這種策略模式,很容易更換其餘視圖技術;

六、  View——>渲染,View會根據傳進來的Model模型數據進行渲染,此處的Model實際是一個Map數據結構,所以很容易支持其餘視圖技術;

七、返回控制權給DispatcherServlet,由DispatcherServlet返回響應給用戶,到此一個流程結束。

相關文章
相關標籤/搜索