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)非注解的映射器:
- BeanNameUrlHandlerMapping(对处理器单独配置bean标签,将地址栏的url作为handlerbean的name)
- 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对象。
还没有评论,来说两句吧...