美文网首页
SpringMvc流程

SpringMvc流程

作者: hcq0514 | 来源:发表于2019-06-27 16:45 被阅读0次
请求处理流程

DispatcherServlet

在springMVC里请求都是由DispatcherServlet 接收,类继承图为



由图可知,他其实本质上是一个Servlet,所以他也会实现Servlet的init(),service(),destroy()等方法(Servlet讲解可参考Servlet文章)
这边介绍DispatcherServlet的init()方法

  • init()

他的init初始化方法其实是在父类HttpServletBean里面写了


  • HttpServletBean.init()
    @Override
    public final void init() throws ServletException {

        // Set bean properties from init parameters.
        PropertyValues pvs = new ServletConfigPropertyValues(getServletConfig(), this.requiredProperties);
        if (!pvs.isEmpty()) {
            try {
                BeanWrapper bw = PropertyAccessorFactory.forBeanPropertyAccess(this);
                ResourceLoader resourceLoader = new ServletContextResourceLoader(getServletContext());
                bw.registerCustomEditor(Resource.class, new ResourceEditor(resourceLoader, getEnvironment()));
                initBeanWrapper(bw);
                bw.setPropertyValues(pvs, true);
            }
            catch (BeansException ex) {
                if (logger.isErrorEnabled()) {
                    logger.error("Failed to set bean properties on servlet '" + getServletName() + "'", ex);
                }
                throw ex;
            }
        }

        // Let subclasses do whatever initialization they like.
        initServletBean();
    }
//接上面代码(省略不重要代码)
    @Override
    protected final void initServletBean() throws ServletException {
        getServletContext().log("Initializing Spring " + getClass().getSimpleName() + " '" + getServletName() + "'");
        try {
            this.webApplicationContext = initWebApplicationContext();
            initFrameworkServlet();
        }
        catch (ServletException | RuntimeException ex) {
            logger.error("Context initialization failed", ex);
            throw ex;
        }
    }

//接initWebApplicationContext,初始化各种策略
    protected void initStrategies(ApplicationContext context) {
//文件上传解析器的接口
        initMultipartResolver(context);
//初始化国际化配置的处理类
        initLocaleResolver(context);
//初始化主题资源的处理类
        initThemeResolver(context);
//初始化处理请求的类,主要负责处理请求调用Controller的处理类。
        initHandlerMappings(context);
//初始化HandlerAdapter的适配器
        initHandlerAdapters(context);
//初始化异常处理类。
        initHandlerExceptionResolvers(context);
//初始化视图转换器,用于直接将请求转换为逻辑视图名。
        initRequestToViewNameTranslator(context);
//初始化视图解析器,定义了如何通过view 名称来解析对应View实例的行为
        initViewResolvers(context);
//初始化Flash Map,提供一个请求存储属性,可供其它请求使用。
        initFlashMapManager(context);
    }
  • HttpServletBean.init()时序图
image.png

dispatchServlet流程处理


流程图

 protected void doDispatch(HttpServletRequest request, HttpServletResponse response) throws Exception {
                //先判断是否Multipart类型的请求。如果是则通过multipartResolver解析request
                processedRequest = checkMultipart(request);
                multipartRequestParsed = (processedRequest != request);
                // 通过getHandler方法找到从HandlerMapping,然后找到该请求对应的handler,如果没有找到对应的handler则抛出异常。
                mappedHandler = getHandler(processedRequest);
                if (mappedHandler == null) {
                    noHandlerFound(processedRequest, response);
                    return;
                }
                // 通过getHandlerAdapter方法找到handler对应的HandlerAdapter
                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 (new ServletWebRequest(request, response).checkNotModified(lastModified) && isGet) {
                        return;
                    }
                }
                //如果有拦截器,执行拦截器preHandler方法
                if (!mappedHandler.applyPreHandle(processedRequest, response)) {
                    return;
                }
                // 真正HandlerAdapter执行handle方法处理请求,返回ModelAndView。
                mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
                if (asyncManager.isConcurrentHandlingStarted()) {
                    return;
                }
                applyDefaultViewName(processedRequest, mv);
                //如果有拦截器,执行拦截器postHandle方法
                mappedHandler.applyPostHandle(processedRequest, response, mv);
            }
            //然后调用processDispatchResult方法处理请求结果,封装到response中。
            processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
        }

相关文章

网友评论

      本文标题:SpringMvc流程

      本文链接:https://www.haomeiwen.com/subject/qorrcctx.html