赞
踩
MVC 的原理图如下:
SpringMVC 框架是以请求为驱动,围绕 Servlet 设计,将请求发给控制器,然后通过模型对象,分派器来展示请求结果视图。其中核心类是 DispatcherServlet,它是一个 Servlet,顶层是实现的Servlet接口。
流程说明(重要):
(1)客户端(浏览器)发送请求,直接请求到 DispatcherServlet。
(2)DispatcherServlet 根据请求信息调用 HandlerMapping,解析请求对应的 Handler。
(3)解析到对应的 Handler后,开始由 HandlerAdapter 适配器处理。
(4)HandlerAdapter 会根据 Handler 来调用真正的处理器开处理请求,并处理相应的业务逻辑。
(5)处理器处理完业务后,会返回一个 ModelAndView 对象,Model 是返回的数据对象,View 是个逻辑上的 View。
(6)ViewResolver 会根据逻辑 View 查找实际的 View。
(7)DispaterServlet 把返回的 Model 传给 View(视图渲染)。
(8)把 View 返回给请求者(浏览器)
1.DispatcherServlet它也是servlet,tomcat启动时它也会初始化,初始化参数是contextConfigLocation上下文配置文件位置。在SpringMVC 中可以通过自动扫描包名、注解映射支持、静态资源访问这些配置的信息在就会实例化HandlerMapping对象。这些对象是在tomcat进行参数初始化的时候也会实例化完成。在DispatcherServlet中维护着一个表,存放的是HandlerMapping对象list.下面截图是DispatcherServlet中的部分代码,在DispatcherServlet中维护着handerMappings、handerAdapters等对象列表。在initStrategies
方法中对上面的一些属性进行初始化。
DispatcherServlet.class
请求到达DispatcherServlet中之后,就是get、post这些请求,这些请求是DispatcherServlet的父类FrameworkServlet中定义着的,而在这些方法中又调用了processRequest,processRequest中调用了doService。
FrameworkServlet.class
DispatcherServlet重写了doService方法,doService中主要设置了一些属性和调用doDispatch方法,doDispatch用来做分发请求
DispatcherServlet.class
可以根据xml配置、注解进行查找,生成处理器对象及处理器拦截器(如果有则生成)一并返回给DispatcherServlet。
DispatcherServlet.class
DispatcherServlet.class
HandlerExecutionChain.class
getHander返回的是一个HandlerExecutionChain,这个HandlerExecutionChain中包含一个handler和多个HandlerInterceptor(拦截器)。同时要留意HandlerExecutionChain是通过HandlerMapping对象的getHandler获取的。
DispatcherServlet.class
获取适配器是通过遍历handlerAdapters列表找的,HandlerAdapter包含了3个方法。
HandlerAdapter.class
先判断如果是get请求更新下lastModified请求头,然后执行HandlerExecutionChain中的applyPreHandle这个方法.
DispatcherServlet.class
在applyPreHandle中它会遍历该HandlerExecutionChain中所有的拦截器,然后使用拦截器通过preHandle对handler进行预处理,如果所有的拦截器都能处理那就会继续往下执行,如果一旦有一个拦截器不能处理,就没必要往下走了,那就会触发triggerAfterCompletion方法,在triggerAfterCompletion中它是倒序遍历的拦截器的,执行完triggerAfterCompletion返回false之后doDispatch这个方法就执行结束了,下面的八、九、十、十一就不再执行。
mv = ha.handle(processedRequest, response, mappedHandler.getHandler());
找到ModelAndView对应的viewname,设置成它的属性值。
this.applyDefaultViewName(processedRequest, mv);
applyPostHandle与applyPreHandle是对应着的,遍历handler的拦截器,执行postHandle方法。
mappedHandler.applyPostHandle(processedRequest, response, mv);
processDispatchResult(processedRequest, response, mappedHandler, mv, dispatchException);
在processDispatchResult方法中有一句render(mv, request, response)
,在render中先是获取View对象然后调用view.render(mv.getModelInternal(), request, response)
;将view和model绑定来进行渲染试图。
DispatcherServlet.class
响应用户其实是在父类FrameworkServlet的processRequest方法中
FrameworkServlet
本文引用:
SpringMVC之处理流程 作者:社会主义接班人
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。