前言
mvc其实是我们开发web项目的一个通用架构方式,我们把业务数据的处理和业务数据的呈现相分离,这样就把复杂的东西简化了,方便了编程的实现,代码结构也非常的清晰,更有利于后期的维护。
什么是MVC?
MVC其实是Model-View-Controller的缩写。View是视图层,负责业务数据的呈现。Model是模型层,是业务数据的信息表示,通常是多个业务实体的组合。Controller是控制层,负责调用业务逻辑生成对应的业务数据,传递业务数据给视图层用于展现,是视图层和模型层的桥梁。
下面spring提供的mvc设计模式图,设计图中的核心是前端控制器。前端控制器负责接收、分发用户的请求给后台的控制器Controller,控制器处理业务逻辑之后返回对应的业务数据,打包返回给前端控制器。前端控制器又把接收的业务数据,发送给合适的视图层模板展示给用户面前。
以上就是spring mvc的大致工作流程。
那么,怎么更好的理解前端控制器的角色呢?举个生活中的栗子,我们去银行办理业务,一进银行大门通常就会有个小姐姐过来,问你需要办理什么业务,然后假如你说你要存一大笔钱,ATM机不好操作,听完小姐姐马上就明白了,她会给你取个号子。说让你等一下叫号的时候到哪个哪个窗口去办理业务。银行每天来办理业务的人很多,所以有很多业务窗口,比如综合业务、信用卡业务、VIP窗口等等,办理不同的业务到不同的业务窗口。
讲到这里,大概知道进门的那个小姐姐就相当于前端控制器,她把办理不同业务的用户安排到不同的窗口,而窗口就相当于控制器。
几个重要的概念
DispatcherServlet
spring mvc的前端控制器,是所有请求处理的入口,它将请求分发给对应的controller。应用程序启动的时候,spring容器初始化DispatcherServlet时会收集各种配置信息初始化创建HandlerMapping实例。而DispatcherServlet就是根据HandlerMapping来找到对应的controller的。
HandlerMapping
负责请求(request)/URL和请求处理者handler
之间的映射关系(其实一般的spring web项目中Handler就是controller)。每个HandlerMapping
实例的核心内容是一组URL pattern
跟对应的handler
的映射表(<URL pattern,Handler>)。再一个springweb应用中会有不止一个 HandlerMapping 实例,并且这些HandlerMapping可以排序。当一个请求到达时,Spring MVC会根据排好的顺序查找第一个匹配请求URL的HandlerMapping并结合所设置的pre/post Inteceptors构造一个 HandlerExecutionChain 对象用于处理该请求。
HandlerAdapter
Handler适配器,DispatcherServlet不直接跟Handler进行交互,而是通过HandlerAdapter,Handler所有的处理业务的细节,DispatcherServlet一无所知,换句话说它只知道HandlerAdapter不知道Handler。
Controller
控制器,处理请求生成相关业务数据的地方。
HandlerInterceptor
用于handler
调用的前/后或者请求处理完成时提供特定的逻辑,相当于过滤器。
对符合某些特征的请求应用一些特定的功能,就可以使用HandlerInterceptor。比如你想要求某些URL被访问时用于必须已经登录,你就可以实现一个检查用户是否已经登录的HandlerInterceptor。
HandlerInterceptor是一个接口,该接口定义了三个方法:
preHandle() – 真正的 handler 执行之前被调用
postHandle() – 真正的 handler 执行之后被调用
afterCompletion() – 整个request被处理完成时调用
这三个方法提供了足够的灵活性用于进行各种预处理和后置处理
HandlerExecutionChain
一个Handler加上一组HandlerInterceptor。
ModelAndView
用来存储处理完后的结果数据。
ViewResolver
视图解析器,把一个逻辑上的视图名称解析为一个真正的视图。