• SpringMvc执行流程及底层代码流程


    SpringMVC执行流程

     

     

    01.客户端发送请求被我们在web.xml中配置DispatcherServlet(核心控制器)拦截;

    默认执行DispatcherServlet中的

    protected void doDispatch(HttpServletRequest req,HttpServletResponse resp) throws Exception{}

    此方法中定义了HandlerExecutionChain mapperHandler=null;//处理器执行链

    MapperHandler = getHandler(processedRequest);//根据用户的请求获取处理器执行

    链;

    02.核心控制器请求HandlerMapping(处理器映射器)查找需要的HandlerController)并返回此Handler

    进入protected HandlerExecutionChain getHandler(HttpServletRequest req) throws Exception{}

    //在处理器映射器中遍历查找请求的Handler

    for(HandlerMapping hm:this.handlerMappings){ //handlerMappings==>List<HandlerMapping>

    //hmList<HandlerMapping>集合中的一个元素==HandlerMapping

       HandlerExecutionChain handler = hm.getHandler(req);

     

    继续跟进HandlerMapping接口的实现类AbstractHandlerMapping类中的

    public final HandlerExecutionChain getHandler(HttpServletRequest req) throws Exception{};

    Object handler = getHandlerInternal(req);//获取要执行的Handler

    HandlerExecutionChain executionChain = getHandlerExecutionChain(handler,req);

    跟进getHandlerExecutionChain();

    For(HandlerInterceptor interceptor : this.adaptedInterceptor){

    chain.addInterceptor(interceptor);//添加了一些处理器拦截器

    }

    由此可知:处理器执行链中包含了一个即将执行的handler和一些intercpetor拦截器。

    03.核心控制器DispatcherServlet调用HandlerAdapter(处理器适配器)去执行Handler

    经过以上操作,现在核心控制器已经拿到要执行的handler

    回到DispatcherServlet中的doDispather方法继续往下执行;

    //获取处理器适配器,参数为处理器执行链中获取处理器

    HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());

    跟进protected HandlerAdapter getHandlerAdapter(Object handler) throws ServletException{};

    //handlerAdapters ==> List<HandlerAdapter>

    for(HandlerAdapter ha : this.handlerAdapters){

           …

    If(ha.support(handler)){

    return ha; //返回需要的处理器适配器 handlerAdapter

    }

    }

     

    跟进 support()方法;

    boolean support(Object handler);HandlerAdapter接口中的方法;

    此方法有5个实现类;默认执行3个;

    webmvcjar包下找到DispatcherServlet.properties配置文件;

    默认的处理器映射器/处理器适配器配置为:


    04.HandlerController)执行完成后给HandlerAdapter返回ModelAndView

    返回到doDispatch方法继续往下执行;

    mv = ha.handler(processedRequest,response,mappedHandler.getHandler());

    跟进handler方法所属接口是HandlerAdapter

    handler() 5个实现类;根据DispatcherServlet.properties中配置的顺序来执行;

    首先进入HttpRequestHandlerAdapter,此类中的handler方法最终将handler向下转型为HttpRequestHandler类型,和我们自定义的Controller无关;

    所以继续执行下一个Adapter

    然后进入SimpleControllerHandlerAdapter类中的handler方法,此方法中将handler向下转型为Controller类型,正是我们需要的!(因为我们自定义的Controller继承了AbstractController又实现了Controller接口)

    观察handler方法中的代码:


    分析以上方法:

    01.    只有Controller类型才有handlerRequest方法


    02.    AbstractController实现了Controller;


    返回的handleRequestInternal方法也是AbstractController中的方法;


    此方法为抽象方法;观察它的实现类有:


    03.    我们自定义的Controller中的方法名称是handlerRequestInternal


    04.所以执行ControllerhandlerRequestInternal方法就是执行HelloController中的handlerRequestInternal方法。

     

    05.HandlerAdapter(处理器映射器)向前端核心控制器DispatcherServlet返回ModelAndView;

    06.核心控制器DispatcherServlet请求ResolverView(视图解析器)进行解析,

    将逻辑视图名解析成真正的视图对象View(视图可以为jsp,xml,pdf,json…);

    07.视图解析器(ResolverView)向DispatcherServlet返回View,并使用ModelAndView对象模型数据对View进行视图渲染;

    08.最终客户端获得响应消息。

  • 相关阅读:
    ACR2010_TNF拮抗剂促进SpA患者椎体侵蚀的修复
    2010年10月第1期(ACR2010专刊AS篇)_中信国健临床通讯目录
    ACR2010_中轴型SpA患者使用TNF拮抗剂治疗后放射学进展与全身炎症消退相关
    ACR2010_小剂量依那西普对达到缓解的AS患者有效
    ACR2010_在高风险人群中应用新版RA分类标准可能发现更多临床前RA
    ACR2010_常规医疗环境下TNF拮抗剂对RA骨侵蚀的修复作用
    ACR2010_HLA B27阳性的极早期AS患者停用TNF拮抗剂后疗效持续: 3个月随机安慰剂对照试验后随访40周
    .net委托与事件 中庸
    筛选法因子之和
    POJ2488 A Knight's Journey 解题报告
  • 原文地址:https://www.cnblogs.com/9513-/p/8417183.html
Copyright © 2020-2023  润新知