前面寫了篇文章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); } } }
@RequestMapping
refer1:
一、Spring MVC 入門示例講解:http://www.importnew.com/15141.html