zoukankan      html  css  js  c++  java
  • SpringMVC一点简单地源码解析

    .

    1.1 init(初始化)
    在第一次发出请求时,会调用HttpServletBean 的init()方法
    
    org.springframework.web.servlet.HttpServletBean.init() //读取配置文件,初始化等操作
     org.springframework.web.servlet.FrameworkServlet.initServletBean() //初始化ServletBean
      this.webApplicationContext = initWebApplicationContext(); //初始化上下文
       org.springframework.web.servlet.DispatcherServlet.onRefresh(wac); //刷新上下文,包括初始化策略等
        initStrategies(context); //初始化各个策略
         initMultipartResolver(context);
         initLocaleResolver(context);
         initThemeResolver(context);
         initHandlerMappings(context);
         initHandlerAdapters(context);
         initHandlerExceptionResolvers(context);
         initRequestToViewNameTranslator(context);
         initViewResolvers(context);
         initFlashMapManager(context);
      initFrameworkServlet(); //初始化Servlet
    
    1.2 发出请求
    org.springframework.web.servlet.FrameworkServlet.doGet() //发出get请求,走此方法
     processRequest() //get和post请求都走这个方法,通过org.springframework.web.context.request.RequestContextHolder中的ThreadLocal的成员变量获取上下文信息,完了把最新的上下文信息设置到ThreadLocal中
      doServise() //设置一系列SpringMVC相关的请求参数:request.setAttribute 
       org.springframework.web.servlet.DispatcherServlet.doDispatch() //DispatcherServlet核心方法,根据请求获取对应的Controller,对请求做分发处理,控制器得到结果,通过mav处理,再继续渲染返回给前端
        HandlerExecutionChain mappedHandler = getHandler(request) //根据请求获取对应的控制器(从IOC容器中通过bean名字获取),包括拦截器等等(这里处理了跨域)
         org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandler() 
          org.springframework.web.servlet.handler.AbstractHandlerMapping.getHandlerExecutionChain() //得到系统中的拦截器,并返回处理器链 
          org.springframework.web.servlet.handler.AbstractHandlerMapping.getCorsHandlerExecutionChain() //先判断请求头,再得到系统中的跨域拦截器 
        org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal() //处理请求:到了Controller中
         org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter.handleInternal() //处理请求:到了Controller中
          org.springframework.web.servlet.mvc.method.annotation.ServletInvocableHandlerMethod.invokeAndHandle() //到Controller中处理请求并得到参数
          org.springframework.web.method.support.HandlerMethodReturnValueHandlerComposite.handleReturnValue() //处理请求参数,如果参数的类型符合直接返回的类型,则会在这里直接响应

     来点文字的东西吧

    1.SpringMVC是由一个DispatcherServlet对所有的请求进行分发的;

    2.SpringMVC会初始化每个Controller的信息,通过HandlerMapping接口,和请求的url,找到应该用哪个Controller的哪个方法,并且还要处理拦截器等;

    3.得到HandlerMapping之后,判断选择使用哪个HandlerAdapter,这个HandlerAdapter就拥有了执行Controller方法的全部内容了,执行完成之后返回数据或者ModelAndView;

    4.最后如果是数据则返回,如果是ModelAndView,则通过其解析器渲染,然后返回。

    .

  • 相关阅读:
    为什么 TCP 建立连接是三次握手,关闭连接确是四次挥手呢?
    一文搞懂 Java 中的枚举,写得非常好!
    IntelliJ IDEA For Mac 快捷键,够骚,速度收藏!
    Java Bean 为什么必须要有一个无参构造函数?
    18 个示例带你掌握 Java 8 日期时间处理!
    从入门到熟悉 HTTPS 的 9 个问题
    MyBatis的动态SQL详解
    MyBatis总结-实现关联表查询
    AngularJS
    Spring MVC url提交参数和获取参数
  • 原文地址:https://www.cnblogs.com/lcmlyj/p/12340707.html
Copyright © 2011-2022 走看看