MVC中,M(model)模型,V(view)视图,C(Controller)控制器三个模块,在web的请求处理中都承担一个什么样的角色,作用是什么,这个问题是我面试spring时基本都会问的一个基础问题(可以在我的另外一系列博客中看到我对面试题的整理),因为我觉得正确的理解mvc的概念是深入理解源码的基础。
下图是我从《Spring实战》这本书中择(zhai二声)下来的。
上图展示了一个请求在SpringMVC中的处理路径,总按7步来:
- 一个请求立刻浏览器后,带着请求内容的信息,至少会包含请求的URL,但是还可能带有其他的信息,如用户提交的表单等。请求第一站是DispatcherServlet(调度控制器),DispatcherServlet的任务是将请求交给Controller。
- DispatcherServlet会查询一个或多个Handler Mapping(处理器映射),处理器映射根据URL信息来确定请求应该交给哪一个Controller。
- Controller拿到请求之后,就可以做参数获取、相应的业务处理、到数据库中查询数据等,取决于实际需求,它的任务就是处理请求信息,也是平时开发人员唯一编码的部分。
- 处理完之后,Controller会返回一些信息,即模型(model),这些信息需要返回给用户并在浏览器中显示。不过光有信息还不够,我们还需要以用户友好的方式进行格式化,即通过视图(view)展示,不过Contrller不会直接返回视图,而是返回model + 逻辑视图名,再次给到DispatcherServlet。
- DispatcherServlet使用View Resolver(视图解析器)根据逻辑视图名找到一个特定的视图实现,可能是也可能不是jsp。
- 视图将把model数据渲染进视图中。
- 返回相应视图给客户端。
上面的7个步骤基本上是普通的一个web请求的处理路径,但也有情况并不完全需要上面7个步骤,比如请求需要的是返回model数据交给前端自己处理,比如交给js处理,那么就不需要返回视图名。我们使用@ResponsBody注解某个方法,则这个方法返回的对象,将不会经过5视图解析器与6视图渲染这两步,会直接返回数据给client。