我们在使用springmvc进行开发的时候,只用在web.xml中配置一下DispatcherServlet,然后在springmvc.xml中配置一下处理器映射器,处理器适配器,视图解析器。使用注解开发的话更加简单方便,都不会去配置适配器和映射器。下面就来说一下springmvc处理一个请求的整个过程。
再次之前,先将一些事情交代清楚:
1、前端控制器DispatcherServlet用来接收用户请求,它并不会执行相关的业务逻辑;
2、处理器(即程序员编写的Controller)用于处理最终的请求;
3、用户发送过来的请求是一个url,而前端控制器并不知道要去请求具体的哪一个处理器Controller,此时需要借助Handlermapping来完成这方面的操作;
4、处理器适配器用于执行(或者说是调用)处理器。为什么要有适配器呢?因为我们不可能在前端控制器中将需要调用的处理器给写死,这么做是为了方便程序的扩展,所以就需要适配器来完成执行处理器。
5、处理器适配器会按照特定的规则(适配器所要求的规则)去执行处理器,比如说,适配器要求处理器去实现某一个接口,那么在编写处理器的时候就需要去实现这个接口。
6、视图View是一个接口,实现类支持不同类型的View类型,比如jsp、freemarker、pdf等。
下面开始讲述一个请求被处理的过程:
-
请求到达前端控制器DispatcherServlet(接收用户请求并响应)
-
前端控制器通过处理器映射器请求查找Handler处理器(可以根据xml配置或者注解来进行查找)
-
处理器映射器返回一个执行链HandlerExecutionChain(这个链中有需要最终调用的Handler,还有多个Interceptor拦截器)
-
前端控制器访问适配器,请求执行Handler
-
适配器调用Handler,执行业务逻辑
-
Handler向适配器返回 ModelAndView ,并由适配器返回给前端控制器
-
进行视图解析,此处需要登场的是视图解析器,前端控制器访问视图解析器,进行视图解析,根据逻辑视图名返回真正的视图view
-
前端控制器根据返回的view进行视图渲染(将模型数据——在ModelAndView对象中,填充到request域中)
-
响应到客户端
绘图如下: