SpringMVC简介
SpringMVC是目前最好的实现MVC设计模式的框架,是Spring框架的一个分支产品,已经融合在Spring Web Flow里面。
它以SpringIOC容器为基础,并利用容器的特性来简化它的配置。
SpringMVC对MVC流程进行了封装,屏蔽掉很多底层代码,开放出接口,让开发者可以更加轻松快捷的完成基于MVC模式的Web开发。
SpringMVC的静态概念
dispatcherServlet
前端控制器,是整个流程控制的核心,控制其他组件的执行,统一调度,降低组件之间的耦合性,相当于总指挥。
浏览器发出的请求正是通过dispatcherServlet进行了分发,到达了一个合适的controller,来生产我们所需要的业务数据model,model再通过dispatcherServlet进行传递,传递给view来完成最终的页面呈现。因此MVC将数据的业务逻辑和页面实现分离其实核心就是通过dispatcherServlet来实现的。
Controller
控制器(处理器),就是我们调用业务逻辑生成Model的地方
HandleAdapter
处理器适配器,首先Handler它其实就是Controller的一个表现形式,在dispatcherServlet当中,其实最终调用的controller是以Handler形式出现的,而不同的handleAdapter可以处理不同类型的handler,dispatcherServlet根据Handler来找到支持它的handleAdapter,通过handleAdapter去调用Handler的方法得到ModelAndView对象。
HandlerInterceptor
拦截器,它是一个接口,可以在被拦截对象的两侧加入一些内容,如果需要做一些拦截处理,可以来实现这个接口。
它提供了在调用controller前,调用之后,以及在最终model发送到页面完成呈现之后的处理方法。
HandlerMapping
它是前端请求与controller之间映射关系的一种类,它的作用就是告诉DispatcherServlet这个请求到来之后由哪一个controller来响应,前端控制器通过HandlerMapping将不同的请求分发到不同的Handler
handleMapping根据请求URL找到对应的的Handler(Controller),以及这个Handler需要被包裹的handlerIntercepter,然后将它们构成一个执行的链条。
HandlerExecutionChain
处理器执行链,将拦截器与Handler(controller)一起形成执行链条对象
ModelAndView
装载了模型数据和视图信息,作为Handler的处理结果,返回给DispatcherServlet
有3种表现形式,Model、Map、ModelAndView,不管是哪种,dispatcherServlet都会将其转化为ModelAndView
ViewResolver
视图解析器,根据配置找出需要的视图对象,DispatcherServlet通过它将逻辑视图解析成物理视图,最终将渲染结果响应给客户端
View
负责呈现页面(Responsible for page rendering)
SpringMVC的动态概念
图解一
访问过程:首先请求达到了dispatcherServlet,然后dispatcherServlet将请求代理给了HandlerMapping,通过HandlerMapping去查找对应的controller以及对应的HandlerInterceptor,找到之后将controller和HandlerInterceptor形成执行链条返回给dispatcherServlet,dispatcherServlet通过HandlerAdapter调用Handler的方法,调用后生成模型数据ModelAndView,接着调用视图解析器返回View对象,然后ModelAndView作为模型数据被传递给view完成页面呈现,最终响应给用户。
图解二
虽然SpringMVC涉及概念很多,但是真正需要我们做的却很少。
- DispatcherServlet由springmvc内部实现,只需要配置即可
- HandlerMapping同理,只需要配置RequestMapping,后续操作都已经提供了实现
- Controller需要我们自行编写,HandlerInterceptor如果需要就实现接口即可
- HandlerAdapter由DispatcherServlet内部调用,无需关心
- ModelAndView是一个类,只需要向map一样添加数据即可
- ViewResolver只需要关心使用哪种类型的解析器即可,都有默认的实现
- View对应的真正视图需要我们自行编写,在Handler返回时只需要返回视图名称即可,渲染视图的过程自动就完成了