Spring_boot的web开发
spring_mvc快速使用
Restemplate:当我们发起http请求的时候,spring提供了一些模板类Restemplate,发送请求的时候user对象转json,解析请求的时候json转user对象,有了Restemplate,这些操作就不需要我们手动做;发送http请求到mvc,也就是文本数据,是怎么变成mvc可以识别的jackson格式数据,他是底层就是通过httpMeassageConverters来进行转换的,Restemplate就是应用了这个httpMeassageConverters;
http后台服务的相互调用:
通过Restemplate来进行远程调用 返回我们传入的参数的泛型
调用新增 forentity返回的封装的消息体
通过requestTemplate发起的http请求,是通过Jackson来转换成json,所以接收http请求的时候要添加RequestBody注解,来解析请求
直接使用template的delete和update请求是没有返回值的,如果有需要,可以通过exchange或者any,来获取update和delete的返回值,
@pathvariable注解是用来获取http请求中的${}占位符中的参数
Spring_boot接口测试
注:除了通过restTemplate来进行远程的http请求的发起,还可以通过webclient来进行调用,
与restTemplate不同的是,webClient是无阻塞响应式的http调用,它发起调用后,不需要等待返回的结果,程序继续向下运行,具体没看,估计是调用完,通过监听器来获取调用结果。两种方式根据实际需求来使用
webClient依赖webflux,需要先开发一个响应式的应用才能使用
Spring_boot测试
Postman,apipost等,不过这些都需要启动web应用
Mokmvc则不需要启动web应用就能测试,它是spring_test提供的
mocmvc的get请求
Mocmvcd的Post请求
大致流程为:发送请求》获取响应结果》对响应结果进行判断》根据判断的结果来做出后续动作
Idea中自定义简单的json类型数据
Swagger2
提供了一系列REST接口的描述和UI展示的规范,其实就是接口文档生成工具
Spring_fox 整合springmvc和swagger2
生成的文档访问页面,通过这里知道我们有哪些接口,入参是什么,还可以提供测试功能,查看返回值
方法上注解的使用,
接口访问日志的生成
接口日志是记录用户访问了哪些接口,访问情况,所以是需要在接口进行切入,需要用到spring_aop,而spring_boot_web的场景启动器是没有自动引入aop的,所以需要手动添加aop的场景启动器
定义AOP切面,结合swagger2注解,来记录用户访问日志,也可以把访问日志的日志级别单独设置成一个,比如trace追踪,然后把追踪级别的日志单独输出到一个文件
-
spring_mvc的自动配置原理
Spring_mvc的自动配置类,WebMvcAutoConfiguration
Spring官网关于spring_boot对spring_mvc自动配置的说明
定制spring_mvc自动配置
Spring_MVC拦截器Interceptor
需要实现handlerinterceptor接口,重写preHandle方法,它是在controller执行之前调用。
PostHandle是在controller执行之后,afterCompletion是在视图解析完成之后,所以可以自定义请求执行时间的拦截器,来记录请求执行的时间;
记录开始时间
记录结束时间
定义好之后,然后在我们自定义的webmvcconfigurer配置类中,添加拦截器,添加拦截器的接口如下addInterceptor
同样在mvc的配置类中,可以设置全局的跨域(http请求从浏览器或者http客户端到http的服务端的时候,http协议中会携带这个请求来自于哪个域,url=域名+端口+路径+参数,当响应结果是跳转到其它的域,那么根据浏览器的同源协议,就会存在跨域,我理解后端mvc处理这个跨域,是mvc在后端对跨域也做了限制,所以mvc也可以处理后端层面的跨域设置)请求的管理
全局跨域请求设置
单独的接口允许跨域
允许某个域进行跨域访问
总结:webmvcConfigurer可以用来拓展视图解析器,拦截器,和控制全局CORS(跨域)
webmvcConfigurer原理
webmvcConfigurer既能保留spring_boot的自动配置,也能保留我们自定义的配置,
注:添加了@Autowired的方法,会自动去容器中注入对象到参数中,所以它是能把所有的webmvcConfigurer注入到delegates委派器中,
底层调用webmvcConfigurer对应的方法时,就是取注入到delegates委派器中的webmvcConfigurer依次进行调用
@EnableWebMvc会导致自动配置类失效
Spring_boot _json
Jackosn的常用注解
Spring_boot还提供自定义json的序列化,只需要继承JsonSerializeer,就可以定制序列化和反序列化,当然它也提供里两个基类,也就是将序列化前和序列化后的操作帮我们做了,我们只需要进行自定义序列化对象就可以了,甚至这里都可以直接去数据库中,或者临时生成一个属性的值
实际应用场景:
可以根据用户不同的角色,来进行不同的序列化,相当于根据权限,来给他返回一部分的数据;
或者当一次请求的结果,需要根据一次查询的结果进行二次查询时,也可以在这里处理
序列化
或者根据不同的数据类型,添加一些标识
反序列化
Spring_boot_国际化
国际化是指当浏览器,或者用户从前台选择不同的语言的时候,从后台拿到的数据相应的转换成对应的语言
国际化实现的大致步骤:
- 定义国际化配置文件,配置文件的路径是固定了的,也可以更改spring_boot配置来自定义国际化配置文件的位置
- 定义资源解析器,加载国际化配置文件,并提供根据code和语言类型等来获取value的方法,spring_boot为我们提供了资源解析器
资源解析器@Conditional中引入了一个ResourceBundleCondition,它的父类中定义了资源文件的匹配规则match()
规则中定义了,只有在我们定义了spring.message.basename的路径下,或者我们没有定义的话,在类路径下的message文件夹中资源文件才会生效
- 添加拦截器,拦截前台页面的请求,将页面的语言存入缓存中,一般放入session或者cookie中
将请求头中的local(本地化语言)放入session中,spring_boot提供了一个请求头的解析器,从http请求中获取语言,当spring_boot配置了spring.mvc.local就可以确定local是从我们的spring_boot的配置文件中生效,还是请求头中的local生效,fiexd是代表配置文件中生效,但是这样相当于是写死在配置文件中,所以一般不设置,默认就是请求头中的local生效,
这里是mvc自带的resolver,它是存放在session中的,当我们后台服务是微服务的时候,简单的session就不能实现local的共享,如果后台是单体可以用简单的mvc自带的localrresolver来存放local
如果是微服务的话,可以把local存放在cookie中
添加国际化拦截器
- 在返回给前台数据时,通过存入session的语言,来通过资源解析器来获取相应的国际化语言
Spring_boot为
Spring_mvc提供了一个messageSource,可以直接拿到国际化的返回值,而LocaleContexHolder中就存放了请求中的local,
注:如果是通过浏览器设置的local,则不需要定义拦截器,spring_mvc会自动放入在LocaleContexHolder中,我们可以直接使用,如果是前台页面自定义设置一个参数来选择,则需要定义一个拦截器来获取local,然后存放到localresolver中,然后通过 LocalContexHolder来获取,(个人理解)最后返回给前台的时候,,应该是会根据LocalContexHolder中获取到的值,如果是cookielocalresolver中存放的,则会将local添加到报文中,改变浏览器中的cookie中的local值
LocalContexHolder:用来获取localresolver中的local
Localresolver:用来存放local的值,mvc自带的localresolver是session级别,可以自定义一个cookie级别的resolver,当容器中有自定义的时候,mvc配置中的localresolver则不会注入到容器中,也就是不会生效;
Spring_boot统一异常处理
统一异常处理自动配置类
ErrorMvcAutoConfigration里面配置类异常处理对象,其中主要就是BasicErrorController,它其实就是一个controller
@Controller //这里意思是如果配置文件中没有配置server.error.path 则会取找默认路径/error 也就是mvc自动配置的error处理器 |
统一异常处理的流程
当前台请求过来时,dispacherserver把请求交给handler处理,如果出现异常,handler会转发一个error请求,重新让dispacherserver处理,这时因为是error请求,所以把请求交给了异常处理对应的handler,最终到异常处理的controller处理并返回结果
异常处理controller主要有两个方法处理,errorHtml和error方法,errorHtml指的是通过浏览器访问的时候,会在请求头中的Accept属性中传的值text/html,所以这时会通过这个方法处理,其它的情况都是通过error方法处理
所以我们可以自定义一个异常处理类,去定制我们的异常处理;
Spring_mvc提供的异常处理类接口
当然,spring_mvc也提供自定义异常处理的接口。@ControllerAdvice来声明我们的异常处理类,然后通过@ExceptionHandler来确定什么样的类型通过哪一个接口处理,这个更方便
Spring_boot嵌入式Servlet容器
serverlet介绍地址:
浏览器与WEB服务器之间的通信是基于HTTP协议,可以通俗的理解浏览器是http的客户端,web服务器是http的服务端,而web服务器在收到http请求时,他要对http请求做出解析,操作并响应,这个具体的操作就是serverlet来做的,所以可以理解serverlet其实就是web服务器中处理http请求的cernel一种实现,或者说是核心,当然,web服务器应该也还是有其它处理的实现