springmvc原理简单总结,配少量源码

1、请求到达DispatcherServlet,调用方法根据request到HandlerMapping(处理器映射器)中找到合适的处理器和拦截器并封装成执行链,返回给DispatcherServlet
细节:在HandlerMapping中找合适的处理器时,其实是遍历HandlerMapping,HandlerMapping是List<HandlerMapping>集合,返回的执行链是HandlerExecutionChain,然后判断这个链和链中的处理器是不是null,如果是null,则转向404处理页面
调用 getHandler方法获取执行链代码
mappedHandler = getHandler(processedRequest, false);//获取handler
getHandler方法核心代码
for (HandlerMapping hm : this.handlerMappings) {
   if (logger.isTraceEnabled()) {
      logger.trace(
            "Testing handler map [" + hm + "] in DispatcherServlet with name '" + getServletName() + "'");
   }
   HandlerExecutionChain handler = hm.getHandler(request);
   if (handler != null) {
      return handler;
   }
}
2、DispatcherServlet拿到链中的处理器,然后到HandlerAdapter(处理器适配器)中去找,找到支持的适配器,然后返回给DispatcherServlet
细节:springmvc如果没有配置HandlerAdapter,那么获取到的就是默认的HandlerAdapter(HttpRequestHandlerAdapter、SimpleControllerHanlerAdapter、AnnotationHandlerAdapter),在获取HandlerAdapter的时候,也是通过遍历List<HandlerAdapter>集合方式
DispatcherServlet中调用getHandlerAdapter方法获取适配器代码
HandlerAdapter ha = getHandlerAdapter(mappedHandler.getHandler());
getHandlerAdapter方法核心代码
for (HandlerAdapter ha : this.handlerAdapters) {
   if (logger.isTraceEnabled()) {
      logger.trace("Testing handler adapter [" + ha + "]");
   }
   if (ha.supports(handler)) {
      return ha;
   }
}
3、处理器适配器执行我们的处理器,并返回ModelAndView对象给DispatcherServlet
细节:在执行我们的处理器之前,先执行了pre拦截器,拦截器返回true,则继续往下执行
if (!mappedHandler.applyPreHandle(processedRequest, response)) {
   return;
}
在执行处理器之后,执行post拦截器,处理一些ModelAndView对象里的内容
mappedHandler.applyPostHandle(processedRequest, response, mv);
4、DispatcherServlet调用ViewResolver(视图解析器),找到对应的视图,把数据填充进去,通过response响应给浏览器
细节
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值