【2016-05-09】SpringMVC結構簡介(half done)

前面寫了篇文章Jersey vs. SpringMVC從使用角度簡單寫了下二者的區別,寫完後發現對兩個框架都不瞭解,因而蒐集了SpringMVC的資料,本文爲整理的內容。html

1、SpringMVC中重要的概念:前端

  • DispatcherServletjava

  • HandlerMapping:經過request找到handler的web

  • HandlerAdapterspring

  • Controllerapi

  • ViewResolverapp

  • View框架

 

2、Request處理流程async

SpringMVC中最重要的類是DispatcherServlet,即前端控制器,負責處理request,生成response的整個過程。post

DispatcherServlet自己是個Servlet,所以配在web.xml中,簡單配置以下:

<servlet>
    <servlet-name>springWebMVC</servlet-name>
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    <load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
    <servlet-name>springWebMVC</servlet-name>
    <url-pattern>/</url-pattern>
</servlet-mapping>

Web容器啓動項目的時候會加載DispatcherServlet,同時會在onRefresh方法中初始化了一系列HandlerMapping、HandlerAdapter、ViewResolver等bean。

處理Request的流程以下圖(圖片來自refer1)

  • 調用HandlerMapping的getHandler方法找到對應的HandlerExecutionChain(Intecepter和Handler);

  • 找到了Handler,調用Handler的handle方法,處理request;

  • 將處理結果轉換成對應的View,好比JSP、FreeMarker、PDF、Excel等。

doDispatch源碼以下(Spring版本:3.2.8.RELEASE):

protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
    HttpServletRequest processedRequest = request;
    HandlerExecutionChain mappedHandler = null;
    boolean multipartRequestParsed = false;
    WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);
    try {
        ModelAndView mv = null;
        Exception dispatchException = null;
        try {
            processedRequest = checkMultipart(request);
            multipartRequestParsed = processedRequest != request;
            // Determine handler for the current request.
            mappedHandler = getHandler(processedRequest, false);
            if (mappedHandler == null || mappedHandler.getHandler() == null) {
                noHandlerFound(processedRequest, response);
                return;
            }
            // Determine handler adapter for the current request.
            HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
            // Process last-modified header, if supported by the handler.
            String method = request.getMethod();
            boolean isGet = "GET".equals(method);
            if (isGet || "HEAD".equals(method)) {
                long lastModified = ha.getLastModified(request, mappedHandler.getHandler());
                if (logger.isDebugEnabled()) {
                    String requestUri = urlPathHelper.getRequestUri(request);
                    logger.debug("Last-Modified value for [" + requestUri + "] is: " + lastModified);
                }
                if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                    return;
                }
            }
            if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                return;
            }
            try {
                // Actually invoke the handler.
                mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
            }
            finally {
                if (asyncManager.isConcurrentHandlingStarted()) {
                    return;
                }
            }
            applyDefaultViewName(request, mv);
            mappedHandler.applyPostHandle(processedRequest, response, mv);
        }
        catch (Exception ex) {
            dispatchException = ex;
        }
        processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
    }
    catch (Exception ex) {
        triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
    }
    catch (Error err) {
        triggerAfterCompletionWithError(processedRequest, response, mappedHandler, err);
    }
    finally {
        if (asyncManager.isConcurrentHandlingStarted()) {
            // Instead of postHandle and afterCompletion
            mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);
            return;
        }
        // Clean up any resources used by a multipart request.
        if (multipartRequestParsed) {
            cleanupMultipart(processedRequest);
        }
    }
}

@Controller

 

 

@RequestMapping

http://docs.spring.io/spring/docs/current/javadoc-api/org/springframework/web/bind/annotation/RequestMapping.html

 

refer1:

一、Spring MVC 入門示例講解:http://www.importnew.com/15141.html

相關文章
相關標籤/搜索