• 记录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服务器应该也还是有其它处理的实现

  • 相关阅读:
    算法题:整数除法
    算法总篇章
    spoken english
    AIR32F103(十) 在无系统环境和FreeRTOS环境集成LVGL
    .net第七章------类成员
    项目中使用 husky 格式化代码和校验 commit 信息
    docker-cli源码窥探
    mybatis 09: 动态sql --- part1
    基于RuoYi-Flowable-Plus的若依ruoyi-nbcio支持自定义业务表单流程(三)
    分布式存储在数据治理场景中的价值
  • 原文地址:https://blog.csdn.net/m0_64639742/article/details/136183494