记录spring_boot 的web开发学习

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类型数据

IDEA中简单编写json字符串-CSDN博客

Swagger2

提供了一系列REST接口的描述和UI展示的规范,其实就是接口文档生成工具

Spring_fox 整合springmvc和swagger2

生成的文档访问页面,通过这里知道我们有哪些接口,入参是什么,还可以提供测试功能,查看返回值

方法上注解的使用,

接口访问日志的生成

接口日志是记录用户访问了哪些接口,访问情况,所以是需要在接口进行切入,需要用到spring_aop,而spring_boot_web的场景启动器是没有自动引入aop的,所以需要手动添加aop的场景启动器

定义AOP切面,结合swagger2注解,来记录用户访问日志,也可以把访问日志的日志级别单独设置成一个,比如trace追踪,然后把追踪级别的日志单独输出到一个文件

  1. spring_mvc的自动配置原理

Spring_mvc的自动配置类,WebMvcAutoConfiguration

Spring官网关于spring_boot对spring_mvc自动配置的说明

定制spring_mvc自动配置

Spring_mvc的配置类 WebMvcAutoConfiguration中,有许多的@bean配置对象,这些注入容器的对象都添加了@ConditionalMissingBean(xx.class),意思就是只有容器中没有这个类型的对象的时候,才会从配置类中去加载,所以自定义的类会优先加载到容器中,这时自定义的各个bean就生效了

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_国际化

国际化是指当浏览器,或者用户从前台选择不同的语言的时候,从后台拿到的数据相应的转换成对应的语言

国际化实现的大致步骤:

  1. 定义国际化配置文件,配置文件的路径是固定了的,也可以更改spring_boot配置来自定义国际化配置文件的位置

  1. 定义资源解析器,加载国际化配置文件,并提供根据code和语言类型等来获取value的方法,spring_boot为我们提供了资源解析器

资源解析器@Conditional中引入了一个ResourceBundleCondition,它的父类中定义了资源文件的匹配规则match()

规则中定义了,只有在我们定义了spring.message.basename的路径下,或者我们没有定义的话,在类路径下的message文件夹中资源文件才会生效

  1. 添加拦截器,拦截前台页面的请求,将页面的语言存入缓存中,一般放入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中

添加国际化拦截器

  1. 在返回给前台数据时,通过存入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处理器
@RequestMapping("${server.error.path:${error.path:/error}}")
public class BasicErrorController extends AbstractErrorController {

   private final ErrorProperties errorProperties;

   /**
    * Create a new {@link BasicErrorController} instance.
    * @param errorAttributes the error attributes
    * @param errorProperties configuration properties
    */
   public BasicErrorController(ErrorAttributes errorAttributes, ErrorProperties errorProperties) {
      this(errorAttributes, errorProperties, Collections.emptyList());
   }

统一异常处理的流程

当前台请求过来时,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介绍地址:

Servlet新手入门篇-CSDN博客

浏览器与WEB服务器之间的通信是基于HTTP协议,可以通俗的理解浏览器是http的客户端,web服务器是http的服务端,而web服务器在收到http请求时,他要对http请求做出解析,操作并响应,这个具体的操作就是serverlet来做的,所以可以理解serverlet其实就是web服务器中处理http请求的cernel一种实现,或者说是核心,当然,web服务器应该也还是有其它处理的实现

  • 35
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值