1. 用户通过url发起请求,请求送到前置控制器(DispatcherServlet)。
2. 前置控制器是整个SpringMVC的控制中心,当接收到用户的请求之后, 根据请求传来的 url 去 处理器映射(HandlerMapping)中查找 url 对应的处理器handler。
3. 处理器映射 调用 HandlerExecution,表示开始查找 url 对应的 handler。
4. HandlerExecution 将找到的 handler 返回给前置控制器。
5. 前置控制器根据 handler 去 HandlerAdapter 中 执行handler。
6. handler开始执行,并去Controller层调用具体的controller执行对应的服务。
7. controller执行结束,向 HandlerAdapter中返回执行得到的结果,如ModelAndView。
8. HandlerAdapter将收到的执行结果返回给前置控制器。
9. 前置控制器将收到的执行结果交给视图解析器(ViewResolver)去解析。
10. 视图解析器将解析得到的结果返回给前置控制器。
11. 前置控制器将收到的解析结果传递给视图进行渲染。
12. 视图将渲染得到的结果返回给用户。
代入生活案例:
1. 某著名二代小明同学今天中午想吃烤鸭,他去找自己的私人管家,表示了自己想吃烤鸡的需求。(用户、DispatcherServlet)
2. 管家收到小明的请求之后, 去小明家的物资管理平台 查找烤鸡分区。(DispatcherServlet、HandlerMapping)
3. 物资管理平台的经理接到请求之后,指示自己手下金牌领班去搜索全国有名的烤鸭店。(HandlerMapping、HandlerExecution)
4. 领班将搜索得到的店铺向小明同学的私人管家汇报。(HandlerExecution、DispatcherServlet)
5. 管家根据店铺名去找这家店的店长,要求做烤鸭。(DispatcherServlet、HandlerAdapter)
6. 店长去找自己的厨师长,表达了小明同学要吃烤鸭的需求,让他赶快做出来。(HandlerAdapter、Controller)
7. 厨师长将做好的烤鸭交给店长。(Controller、HandlerAdapter)
8. 店长将做好的烤鸭交给管家验货。(HandlerAdapter、DispatcherServlet)
9. 管家将烤鸭交给打包员打包,并告诉打包员小明同学的地址。(DispatcherServlet、ViewResolver)
10. 打包员将打包好并贴好外卖地址的烤鸭交给管家。(ViewResolver、DispatcherServlet)
11. 管家将打包好的烤鸭交给骑手。(DispatcherServlet、View)
12. 骑手将烤鸭送到小明同学的学校门口。(View、用户)
上述流程全部由spring框架实现,我们需要做的只有红色箭头部分的:
1. 具体业务实现(代入案例中即为 厨子去做烤鸭),在业务实现的时候不可避免会用到数据库(厨子做烤鸭也不可避免需要买原材料)
2. 实现结果返回(烤鸭做好)
如果spring不使用注解的话,那么我们可以自定义一个Model层,(蓝色箭头部分)
3. controller执行的结果封装进Model层。
4. Model直接将结果交给视图解析器进行解析。
5. 视图解析器将解析的结果返回给View。
最后View再返回给用户。
强行代入上述案例的话,可以解释为,厨子的学徒之前在做外卖员的时候给小明送过饭,知道小明的地址,因此他等师傅做好烤鸭之后直接将烤鸭交给了打包员进行打包,并告诉了打包员的地址,打包员打包好之后直接将外卖交给了外卖员。