Spring Mvc——处理请求

原创内容,转载请注明出处

1、概述

下面这张图是Spring mvc处理请求的整体流程,其中Front controller指的是DispatcherServlet类。

1.客户端所有的请求都会发送到DispatcherServlet,由DispacherServlet处理。

2.DispacherServlet将请求分发到不同的Controller类,由Controller类去处理对应的请求。

3.Controller类将对应的请求处理完后,将处理后对应的model或者视图信息给将DispatcherServlet类。

4.DispatcherServlet将这些信息交由视图模版解析。

5.视图模版解析到的对应视图信息等传给DispacherServlet。

6.最后由DispacherServlet将视图信息推送响应给客户端。

 

因此可以看出DispatcherServlet类在Spring mvc框架中占据了一个非常重要的地位,它接收所有请求,然后将对应的请求分发到对应的功能类实例去处理,然后将处理后结果响应给客户端。 

扫描二维码关注公众号,回复: 791937 查看本文章

2、Dispatcher分发处理请求

在DispatcherServlet的子类FrameworkServlet中,可以看到它已经重写了父类HttpServlet的所有请求方式的对应方法。这些方法最后都调用processRequest方法去处理请求,该方法对请求做了简单处理后又调用了doService方法,该方法由父类DispatcherServlet实现。

在DispatcherServlet类的doService方法中,首先为Request请求设置了一些对应的属性实例,然后调用doDispatch方法去分发处理请求。以下是实际处理过程

1.在doDispatch方法中,调用checkMultipart方法去判断该请求是否是Multipart请求(比如文件上传),如果是,则使用MultipartResolver实例将请求转换为Multipart请求。

2.调用getHandler方法去获取HandlerExecutionChain实例对象。在该方法中首先查找符合当前的HandlerMapping实例,然后调用HandlerMapping实例的getHandler方法去获取HandlerExecutionChain实例,该实例包装了HandlerMapping实例对象,并在该实例中设置了相匹配的拦截器。

3.调用getHandlerAdapter方法,为当前HandlerMapping实例查找对应的HandlerAdapter适配器实例。

4.调用HandlerExecutionChain实例的applyPreHandler方法,去调用其拦截器的preHandler方法(前置拦截方法)执行。如果返回true,则继续往后处理,否则停止方法调用处理。(前置拦截方法执行调用)

5.调用HandlerAdapter适配器实例的handler方法去处理当前请求,并返回对应的ModelAndView对象。(调用目标对象的对应方法执行

6.调用HandlerExecutionChain实例的applyPostHandler方法,去调用其拦截器的postHandler方法(后置拦截方法)执行。(后置拦截方法执行调用

7.调用processDispatchResult方法去处理最后结果(ModelAndView或者异常),该方法调用render方法去渲染解析最后视图。在render方法中首先通过ViewResolver解析器去获取对应的视图名称的视图View对象,最后在调用对应View对象的render方法渲染处理视图,并响应对应结果给客户端。(调用对应View渲染视图

 

4、总结

如上,DispatcherServlet类实际分发处理请求主要有如下几个重要步骤。将HandlerMapping和对应的拦截器包装在一个HandlerExecution实例对象;然后获取该HandlerMapping想匹配的HandlerAdapter适配器;之后调用前置拦截器方法,如果返回true,则调用适配器去处理当前请求,并返回对应的ModelAndView对象;然后在调用后置拦截器方法;最后调用ViewResolver视图解析器解析出对应的视图View对象,并调用View对象去渲染视图,并响应对应结果给客户端。

如下列出Spring Mvc处理请求所设计到的重要接口和类。

HandlerMapping接口、HandlerInterceptor拦截器接口和其包装类MappedInterceptor、HandlerExecutionChain类、HandlerAdapter适配器接口、ViewResolver视图解析器接口、View接口、HttpMessageConvert消息转换接口

猜你喜欢

转载自ylxy3058.iteye.com/blog/2230195