写出一个你自己的MVC框架-基于对springMVC源码实现和理解(6):执行,调度和渲染(一)

来源:互联网 发布:notepad格式化php代码 编辑:程序博客网 时间:2024/06/05 07:25

数据初始化结束后,我们需要考虑对请求如何处理。回到springMVC源代码中,找到方法doService(),七七八八的一大片,想来想去核心的可能只有这句了:

[java] view plaincopy
  1. try {  
  2.             doDispatch(request, response);  
  3.         }  

我们再来看看doDispatch(),又是一大片:
[java] view plaincopy
  1. protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {  
  2.         HttpServletRequest processedRequest = request;  
  3.         HandlerExecutionChain mappedHandler = null;  
  4.         boolean multipartRequestParsed = false;  
  5.   
  6.         WebAsyncManager asyncManager = WebAsyncUtils.getAsyncManager(request);  
  7.   
  8.         try {  
  9.             ModelAndView mv = null;  
  10.             Exception dispatchException = null;  
  11.   
  12.             try {  
  13.                 processedRequest = checkMultipart(request);  
  14.                 multipartRequestParsed = (processedRequest != request);  
  15.   
  16.                 // Determine handler for the current request.  
  17.                 mappedHandler = getHandler(processedRequest);  
  18.                 if (mappedHandler == null || mappedHandler.getHandler() == null) {  
  19.                     noHandlerFound(processedRequest, response);  
  20.                     return;  
  21.                 }  
  22.   
  23.                 // Determine handler adapter for the current request.  
  24.                 HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());  
  25.   
  26.                 // Process last-modified header, if supported by the handler.  
  27.                 String method = request.getMethod();  
  28.                 boolean isGet = "GET".equals(method);  
  29.                 if (isGet || "HEAD".equals(method)) {  
  30.                     long lastModified = ha.getLastModified(request, mappedHandler.getHandler());  
  31.                     if (logger.isDebugEnabled()) {  
  32.                         logger.debug("Last-Modified value for [" + getRequestUri(request) + "] is: " + lastModified);  
  33.                     }  
  34.                     if (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {  
  35.                         return;  
  36.                     }  
  37.                 }  
  38.   
  39.                 if (!mappedHandler.applyPreHandle(processedRequest, response)) {  
  40.                     return;  
  41.                 }  
  42.   
  43.                 try {  
  44.                     // Actually invoke the handler.  
  45.                     mv = ha.handle(processedRequest, response, mappedHandler.getHandler());  
  46.                 }  
  47.                 finally {  
  48.                     if (asyncManager.isConcurrentHandlingStarted()) {  
  49.                         return;  
  50.                     }  
  51.                 }  
  52.   
  53.                 applyDefaultViewName(request, mv);  
  54.                 mappedHandler.applyPostHandle(processedRequest, response, mv);  
  55.             }  
  56.             catch (Exception ex) {  
  57.                 dispatchException = ex;  
  58.             }  
  59.             processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);  
  60.         }  
  61.         catch (Exception ex) {  
  62.             triggerAfterCompletion(processedRequest, response, mappedHandler, ex);  
  63.         }  
  64.         catch (Error err) {  
  65.             triggerAfterCompletionWithError(processedRequest, response, mappedHandler, err);  
  66.         }  
  67.         finally {  
  68.             if (asyncManager.isConcurrentHandlingStarted()) {  
  69.                 // Instead of postHandle and afterCompletion  
  70.                 mappedHandler.applyAfterConcurrentHandlingStarted(processedRequest, response);  
  71.                 return;  
  72.             }  
  73.             // Clean up any resources used by a multipart request.  
  74.             if (multipartRequestParsed) {  
  75.                 cleanupMultipart(processedRequest);  
  76.             }  
  77.         }  
  78.     }  
其实核心就是那么几个过程:
[java] view plaincopy
  1. mappedHandler = getHandler(processedRequest);  
获得了HandlerExecutionChain执行模块链。
[java] view plaincopy
  1. // Determine handler adapter for the current request.  
  2.                 HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());  
获得request匹配的handlerAdapter
[java] view plaincopy
  1. if (!mappedHandler.applyPreHandle(processedRequest, response)) {  
  2.                     return;  
  3.                 }  

调用HandlerExecutionChain中所有拦截器的preHandler方法,根据返回值判断是否继续。

[java] view plaincopy
  1. try {  
  2.                     // Actually invoke the handler.  
  3.                     mv = ha.handle(processedRequest, response, mappedHandler.getHandler());  
  4.                 }  
如果preHander都返回true则执行handler
[java] view plaincopy
  1. mappedHandler.applyPostHandle(processedRequest, response, mv);  

结束后执行postHande方法

[java] view plaincopy
  1. processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);  
完成页面渲染
[java] view plaincopy
  1. triggerAfterCompletion(processedRequest, response, mappedHandler, ex);  

最后根据判断结果执行各种afterCompletion

0 0
原创粉丝点击