springboot中的springMVC

1.springboot和springMVC的区别

springboot是为了解决spring项目繁琐的配置,简化工程开发而整合成的一个配置工具,它提供了大量的自动装配功能,通过这些自动装配功能,就可以达到spring需要大量配置文件而达到的效果,使得开发更为敏捷迅速。
springmvc是一个基于spring的web mvc框架,提供了一种轻耦合度的方式来开发web应用,能够使spring工程提供对外的web访问接口。
总结:springMVC是基于spring的一个MVC框架,sprintboot是基于spring4的条件注册的一套快速开发整合包

2.springMVC的介绍

springMVC是一个基于Java的实现MVC设计模式的请求驱动类型的轻量级Web框架,通过把模型-视图-控制器分离,将Web层进行职责解耦,把复杂的Web应用分成逻辑清晰的几个部分,简化开发,减少出错,方便开发人员之间的配合

MVC介绍:
Model:负责实现业务功能(如登录,下单,创建用户等)和数据的封装(封装DTO对象,状态码等)
View:负责展示界面,和用户进行交互等等。使用到的技术有html/jsp/js等
Controller:负责将模型与视图连接起来,负责接收请求,请求处理完毕后将结果返回给视图

2.1springMVC九大组件

1.handlerMapping
用来查找handler用的。在springMVC中会有很多请求,每个请求都有会对应一个handler处理,具体接收到一个请求以后使用哪个handler处理就是由handlerMapping来负责寻找的

2.handlerAdapter
是一个handler的适配器,因为handler的形式可以是多种的(@RequestMapping,实现org.sprignframework.web.servlet.mvc.Controller接口,实现org.springframework.web.HttpReqeustHandler接口,自定义HttpServlet),整合这些handler的处理方式就是通过handlerAdapter实现的。

3.handlerExceptionResolver
异常处理器,用来处理业务中出现的错误,负责封装错误的modelAndView,之后再交给render方法进行渲染

4.ViewResolver
ViewResolver用来将String类型的视图名和Locale解析为View类型的视图。View是用来渲染页面的,也就是将程序返回的参数填入模板里,生成html(也可能是其他类型)的文件。这里就有两个关键问题:使用哪个模板?用什么技术填入参数?这就是ViewResolver的主要工作,ViewResolver需要找到渲染所使用的技术(也就是视图类型),具体渲染过程由View自己实现

5.RequestToViewNameTransTranslator
顾名思义就是将Request转换成一个ViewName的转换器,在Spring MVC中是根据ViewName来获取ViewName的,当handler处理完之后并没有设置View并且也没有设置ViewName的时候,这时候就需要RequestToViewNameTransTranslator来将request转换成一个ViewName了,RequestToViewNameTransTranslator在SpringMVC容器中只能配置一个,所以所有request到ViewName的转换规则都要在一个Translator里面全部实现。

6.LocalResolver
解析视图需要两个参数,一个是视图名,另一个是Locale。视图名是由handler或者RequestToViewNameTransTranslator获得的,另一个Locale就需要LocalResolver来处理了,LocalResolver用来从Request中获得Locale,Locale就是zh-cn之类的,表示一个区域,有了这个就可以对不同区域的用户显示不同的结果。

7.ThemeResolver
用于主题解析。一个主题对应一个properties文件,里面存放着所有跟当前主题相关的资源,如图片,css样式等。spring MVC主题也支持国际化,同一主题不同区域也可以显示不同风格。SpringMVC中跟主题相关的类有ThemeResolver,ThemeSource和Theme。主题是通过一系列资源来体现的,得到一个主题的资源。要得到一个主题名,这个工作靠ThemeResolver,通过主题名找到对应的主题资源,这是ThemeSource的工作。最后从主题中获取资源就可以了。

8.MultipartResolver
用于处理上传请求,处理方法是把request封装成MultipartHttpServeletRequest,后者可以直接调用getFile方法获取File,如果上传多个文件,还可以调用getFileMap得到fileName->file的map。此组件中一共有三个方法,作用分别是判断是不是上传请求,将request包装成MultipartHttpServeletRequest,以及处理完成后处理临时资源

9.FlashMapManager
用来管理FlashMap,FlashMap主要是用在redirect中传递参数。

3.九大组件的初始化流程

在springboot中springMVC的初始化是依赖了spring的自动装配机制的,其中自动装配的类在spring-boot-autoconfigure-2.1.14.RELEASE.jar中的spring.factory中可以找到,如下
org.springframework.boot.autoconfigure.web.servlet.DispatcherServletAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.ServletWebServerFactoryAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.error.ErrorMvcAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.HttpEncodingAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.MultipartAutoConfiguration
org.springframework.boot.autoconfigure.web.servlet.WebMvcAutoConfiguration

其中DispatcherServelet是由DispatcherServletAutoConfiguration自动注入完成的,其他的handlerMapping,viewResolver等都是由上面的自动装配类提供的。

但是在springboot启动时九大组件都是相互独立的,并没有装载到dispatchServlet中,而是在第一次接收到请求后由tomcat代码调用initServelet进行dispatchServlet的初始化(初始化方法initStrategies),将其余八大组件添加到dispatchServlet的属性中。

springboot中的springMVC_第1张图片

其中每个init方法都是大同小异,都是从spring容器中根据type获取bean,然后将获取到的bean填充到属性中

4.九大组件的工作流程(请求的执行流程)

1.用户的请求经过tomcat和spring的过滤链(filter-chain)过滤后到达dispatcherServlet中
2.DispatcherServlet收到请求后,调用handlerMapping处理器获取对应的handler(其实获取的是一个handlerChain,带拦截器)
3.DispatcherServlet根据handlerMapping拿到的HandlerAdapter
4.HandlerAdapter经过适配调用,具体处理器进行业务逻辑
5.Handler执行完成后返回ModelAndView
6.HandlerMapping继续执行后续处理,例如根据返回值设置视图名
7.DispatcherServlet获得到ModelAndView,如果发现没有viewName则会设置默认的viewName,将ModelAndView传给ViewResolver视图解析器进行解析
8.ViewResolver找到对应的View
9.View进行视图渲染,调用render方法渲染,然后把数据放入到响应流
10.然后调用拦截器的后置处理器和清理临时文件,之后返回

具体执行详情在DispatcherServlet中doDispatch方法,这里只是大概介绍,并且这是正常的执行流程,如果出现异常后会在步骤6之后报错,然后DispatcherServlet会catch住异常,进行错误信息和错误页面即ModelAndView的设置,然后重定向到错误页面(错误页面的请求重新走一遍过滤器等之前步骤)。

forward和redirect都是由viewResolver处理的,将返回地址当作视图进行处理。

你可能感兴趣的:(spring,boot,后端,java)