Spring的学习(四):Web中的Spring

Spring通常用来开发Web应用。

SpringMVC的执行过程:

我们可以从以下的图来分析SpringMVC的的执行过程。
在这里插入图片描述
1、客户端在发送请求的时候,会调用DispatcherServlet,Dispatch是SpringMVC的入口,DispatcherServlet本身也是一个Servlet,会调用Service方法,接着会调用doDispatch方法。(下面的都是在Dispatch方法中执行的)

2、调用getHandler方法,getHandler方法会调用HandlerMapping,通过请求路径匹配查找Handler,最终会返回一个HandlerExecutionChain对象,不止包含了Handler对象还包含了HandlerInterceptor(拦截器)的链表。

3、Handler需要借助HandlerAdapter来执行,doDispatch调用getHandlerAdapter方法查找具体的HandlerAdapter。Spring容器中可能配置了多个HandlerAdapter,具体哪个HandlerAdapter能够处理当前的Handler,是根据HandlerAdapter的supports方法来查找可以处理该Handler的HandlerAdapter。之后会调用拦截器的preHandler方法之后,HandlerAdapter会处理具体的Handler。

4、提取Request中的模型数据,填充Handler入参,开始执行Handler(Controller)。 在填充Handler的入参过程中,根据你的配置,Spring将帮你做一些额外的工作:

  • HttpMessageConveter: 将请求消息(如Json、xml等数据)转换成一个对象,将对象转换为指定的响应信息
  • 数据转换:对请求消息进行数据转换。如String转换成Integer、Double等
  • 数据根式化:对请求消息进行数据格式化。 如将字符串转换成格式化数字或格式化日期等
  • 数据验证: 验证数据的有效性(长度、格式等),验证结果存储到BindingResult或Error中

5、Handler执行完成后,调用拦截器的postHandler方法。向DispatcherServlet 返回一个ModelAndView对象;

6、根据返回的ModelAndView,选择一个适合的ViewResolver(必须是已经注册到Spring容器中的ViewResolver)返回给DispatcherServlet ;

7、 ViewResolver 结合Model和View,来渲染视图

8、将渲染结果返回给客户端。

各个组件的详细介绍

1.前端控制器

DispatcherServlet 是前端控制器设计模式的实现,提供 Spring Web MVC 的集中访问点,而且负责职责的分派,而且与 Spring IoC 容器无缝集成,从而可以获得 Spring 的所有好处。前端控制器模式将所有请求集中到一个类处理,由该类依据不同的请求来执行相应的动作。

2、处理映射器:将URL和Handler对应起来。

作用:通过处理器映射器,得到请求路径对应的处理器。

具体又分为非注解的映射器和注解的映射器。

(1)非注解的映射器

  1. BeanNameUrlHandlerMapping(对处理器单独配置bean标签,将地址栏的url作为handlerbean的name)
  2. SimpleUrlHandlerMapping(对处理器配置bean标签,将处理器id和url的对应信息放入映射器的标签内,进行集中配置)

(2)注解的映射器

RequestMappingHandlerMapping(对类中标记@RequestMapping的方法进行映射,根据RequestMapping标记的方法,匹配成功返回HandlerMethod对象给前端控制器)

3、拦截器

在从处理器映射器获取对应的处理器的时候(通过DispatcherServlet的getHandler方法),返回的不是处理器对象,而是一个HandlerExecutionChain,这个HandlerExecutionChain中包含Handler对象;同时还包含一个HandlerInterceptor链表,而HandlerInterceptor就是拦截器。

更加具体的了解可查看这篇博客:https://blog.csdn.net/zxd1435513775/article/details/80558716

4、处理器适配器:定义各种Handler。

SpringMVC帮助我们把URL对应到一个Handler,这个Handler肯定符合某种规则,最常见的办法就是所有的handler都继承某一个接口,然后SpringMVC自然就在这个接口中定义特方法。在早期的Struts1中就采用这种方式,虽然现在的Struts2不用继承特定的接口,但是仍然要采用固定的方法,然后通过反射调用固定的方法。在SpringMVC中提供了三种HandlerAdapter的实现类。由是否使用注解可分为下面两类:

(1)非注解的处理器映射器(实现默认的方法,每个处理器只能写一个方法,不支持多方法):

HttpRequestHandlerAdapter:可以继承HTTPRequestHandler接口,所有的Handler可以实现其void handleRequest(HttpServletRequest request,HttpServletResponse response)方法,这个方法没有返回值,得将数据和视图放入request域中。

SimpleControllerHandlerAdapter:可以继承Controller接口,所有的Handler可以实现其void ModelAndView handle(HttpServletRequest request,HttpServletResponse response,Object handler)方法,该方法会返回ModelAndView对象。

(2)注解的处理器映射器(可以写多个方法)
SimpleServletHandlerAdapter:可以直接继承Servlet接口,可以将一个Servlet作为一个Handler来处理这一个请求。(只需要在类上标注为@Controller即可)。

5.视图解析器
DispatcherServlet在processDispatchResult中解析并返回View,在render方法中会根据ModelAndView渲染产生View对象。

猜你喜欢

转载自blog.csdn.net/jdfk423/article/details/82954016
今日推荐