SpringMVC执行流程图如下:(图来自网络)
各个步骤解释+图解:
1.用户发送出请求到前端控制器DispatcherServlet。这里不画图了 就是用户发了请求到DispatcherServlet。
2.DispatcherServlet收到请求调用HandlerMapping(处理器映射器)。
3.HandlerMapping找到具体的处理器(可查找xml配置或注解配置),生成处理器对象及处理器拦截器(如果有),再一起返回给DispatcherServlet。(图解代码待完善)
4.DispatcherServlet调用HandlerAdapter(处理器适配器)。 见下图
5.HandlerAdapter经过适配调用具体的处理器(Handler/Controller)。见下图
6.Controller执行完成返回ModelAndView对象。 见下图
7.HandlerAdapter将Controller执行结果ModelAndView返回给DispatcherServlet。见下图
注意在返回MAV对象之前我们也指定了一会要渲染的目标页面的名称,这也存在MAV对象里了!
8.DispatcherServlet将ModelAndView传给ViewReslover(视图解析器)。
9.ViewReslover解析后返回具体View(视图)。
10.DispatcherServlet根据View进行渲染视图(即将模型数据填充至视图中)。
11.最后一步 DispatcherServlet响应用户, 即把渲染好的页面显示给用户 。
最后在放个不一样的图做参考复习咯(请忽略不一致的步骤标号2333):
后面介绍下使用注解实现Controller的功能的原因:
我们本来可以通过实现继承Controller的某个自定义Controller来实现ModelAndView的转发, 但是每个自定义Controller至多只有一个handlerRequest方法 这意味着当不同的请求非常多的时候 进行处理时你需要给每个请求写一个不同的Controller类,造成巨大工作量。
下面是注解实现Controller的代码图解:
注解实现的Controller可以针对不同请求 在同一个Srping托管的自定义Controller类里写不同的方法实现针对不同请求的业务逻辑,不用再每个都写一个类来处理了。
此外针对视图层 我们完全可以通过注解Controller类里最后指定返回的路径 来实现不同请求时 对目标渲染页面的复用,因此不必再写那么多页面了。
大大降低了代码量
最后注意一点:
当类数目过多,如果需要针对不同功能进行分类(有父路径时)要注意修改下面的地方 一个时RequestMapping的位置及return返回的目标页面的地址。