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);


阅读更多
个人分类: 框架
想对作者说点什么? 我来说一句

实现简单springMVC源码

2017年09月27日 38KB 下载

springmvc简单工程搭建(源码)

2017年07月14日 4.39MB 下载

没有更多推荐了,返回首页

不良信息举报

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

最多只允许输入30个字

加入CSDN,享受更精准的内容推荐,与500万程序员共同成长!
关闭
关闭