写出一个你自己的MVC框架-基于对springMVC源码实现和理解(6):执行,调度和渲染(一)
来源:互联网 发布:notepad格式化php代码 编辑:程序博客网 时间:2024/06/05 07:25
数据初始化结束后,我们需要考虑对请求如何处理。回到springMVC源代码中,找到方法doService(),七七八八的一大片,想来想去核心的可能只有这句了:
- try {
- doDispatch(request, response);
- }
我们再来看看doDispatch(),又是一大片:
- 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);
- 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()) {
- logger.debug("Last-Modified value for [" + getRequestUri(request) + "] 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);
- }
- }
- }
- mappedHandler = getHandler(processedRequest);
- // Determine handler adapter for the current request.
- HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
- if (!mappedHandler.applyPreHandle(processedRequest, response)) {
- return;
- }
调用HandlerExecutionChain中所有拦截器的preHandler方法,根据返回值判断是否继续。
- try {
- // Actually invoke the handler.
- mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
- }
- mappedHandler.applyPostHandle(processedRequest, response, mv);
结束后执行postHande方法
- processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
- triggerAfterCompletion(processedRequest, response, mappedHandler, ex);
最后根据判断结果执行各种afterCompletion
0 0
- 写出一个你自己的MVC框架-基于对springMVC源码实现和理解(6):执行,调度和渲染(一)
- 写出一个你自己的MVC框架-基于对springMVC源码实现和理解(6):执行,调度和渲染(一)
- 写出一个你自己的MVC框架-基于对springMVC源码实现和理解(7):执行,调度和渲染(二)
- 写出一个你自己的MVC框架-基于对springMVC源码实现和理解(7):执行,调度和渲染(二)
- 写出一个你自己的MVC框架-基于对springMVC源码实现和理解(2):数据初始化(一)
- 写出一个你自己的MVC框架-基于对springMVC源码实现和理解(2):数据初始化(一)
- 写出一个你自己的MVC框架-基于对springMVC源码实现和理解(1):入口所在
- 写出一个你自己的MVC框架-基于对springMVC源码实现和理解(3):数据初始化(二)
- 写出一个你自己的MVC框架-基于对springMVC源码实现和理解(4):数据初始化(三)
- 写出一个你自己的MVC框架-基于对springMVC源码实现和理解(5):数据初始化(四)
- 写出一个你自己的MVC框架-基于对springMVC源码实现和理解(1):入口所在
- 写出一个你自己的MVC框架-基于对springMVC源码实现和理解(3):数据初始化(二)
- 写出一个你自己的MVC框架-基于对springMVC源码实现和理解(4):数据初始化(三)
- 写出一个你自己的MVC框架-基于对springMVC源码实现和理解(5):数据初始化(四)
- 写出一个你自己的MVC框架-基于对springMVC源码实现和理解(8):总结和对以后版本的展望
- 写出一个你自己的MVC框架-基于对springMVC源码实现和理解(8):总结和对以后版本的展望
- 基于ASP.NET MVC(C#)和Quartz.Net组件实现的定时执行任务调度
- 基于ASP.NET MVC(C#)和Quartz.Net组件实现的定时执行任务调度
- Yod Framework v1.3.5 发布,基于 C 的 PHP 框架
- BIRT参数设置详解
- 【LeetCode从零单排】No189.Rotate Array
- SDK 镜像整合工具
- Intent启动Activity,怎么匹配intent-Filter
- 写出一个你自己的MVC框架-基于对springMVC源码实现和理解(6):执行,调度和渲染(一)
- 网络流模板
- 从今天开始开更博客
- Word2013 图片或数学公式显示不全解决方法
- Ubuntu常用软件安装及解决情况
- 小酱油开博大业,以此博客记录我的学习之路
- Oracle PLSQL语句实例
- leetcode: wildcard matching
- C++的I/O流