SparingBoot高级-数据交换格式-请求响应

  • SpringBoot解析
  • API协同研发工具
  • 数据交换格式
  • SpringBoot请求&响应

SpringBoot解析

一、SpringBoot起步依赖

1.1 起步依赖

概念:引入了web依赖和test依赖,这两个依赖都是SpringBoot中的starter依赖,starter依赖也被称为起步依赖,起步依赖可以引入某个功能的相关依赖和一些初始化的配置

  • Spring官方提供的starter名称为:spring-boot-starter-xxx,例如Spring官方提供的spring-boot-starter-web/test

  • 第三方提供的starter名称为:xxx-spring-boot-starter,例如由mybatis提供的mybatis-spring-boot-starter

1.2 SpringBoot项目版本管理

概念:在入门案例中,我们通过maven引入了web和test依赖,但是并没有指定具体的依赖版本号的?这是因为SpringBoot使用了Maven的继承,每一个SpringBoot工程都有一个父工程,依赖的版本号,在父工程中统一管理

1.3. Maven管理标签

  • parent:继承标签,Mavan父子项目中用于继承父项目

  • dependencyManagement:依赖管理标签,用于在父项目声明依赖,但并不是引入依赖到项目中。在子工程中用到声明的依赖时,可以不加依赖的版本号,这样可以做到统一管理工程中用到的依赖版本

  • pluginManagement:插件管理标签,作用与dependencyManagement一样,也是声明插件但不引入。在子工程中用到声明的插件时,可以不加插件的版本号,这样可以做到统一管理工程中用到的插件版本

  • properties:属性标签,在标签内可以把版本号作为变量进行声明,后面dependency中用到版本号时可以用${变量名}的形式代替,这样做的好处在于当版本号发生改变时,只要更新properties标签中的变量就行了,不用更新所有依赖的版本号

  • dependencies:依赖标签,项目中要引入的依赖需要通过此标签进行引入

  • build:描述了如何编译及打包项目,具体的编译和打包工作是通过其中的plugin配置来实现的,Maven的所有操作其根本都是通过插件进行实现的

1.4 SpringBoot启动类

概念:当一个类使用**@SpringBootApplication**这个注解他就是SpringBoot启动类,SpringBoot就是运行这个类的main方法来启动Spring程序的

启动类位置:启动类需要放在业务类同包或父包中,也就是保证启动类是所有Java代码的平级或父级,需要注解需要被启动类扫描到才会起作用

启动类命名规则:

  • 项目名称+Application
  • 项目名称+App

1.5 SpringBoot配置文件

概念:SpringBoot的配置文件有三种,优先级最高的是properties,如果内容发生冲突以properties为主,如果内容不冲突这三个配置文件的所有配置都会生效

  • application.properties
  • application.yaml
  • application.yml
1. key和value之间除了有冒号在冒号后面还必须有空格:key: value
2. 配置前缀层级关系只能以一个Tab的空格,不能多也不能少
3. value如果是字符串不需要加双引号
   注意:yml中编写错误右上角会有提示-显示黄色警告(正确时显示绿色√),但有的时候是误报要注意区分

1.6 多环境配置

概念:编写多套环境配置在不同环境中我们可以进行快速切换,而不需要再去修改原有配置

  • dev:开发环境,端口号为8081
  • pro:生产环境,端口号为8082
  • test:测试环境,端口号为8083

方式一:配置写在一个文件中

# 最上面的就是默认配置,默认配置不需要指定profile
server:
  # 设置端口号
  port: 8081
spring:
  profiles:
    # 要启动的环境标识,如果环境标识在下面找不到那么就启动默认配置
    active: dev

# 每套环境中间需要有此分隔符,分隔每套环境
---
server:
  # 设置端口号
  port: 8082
spring:
  config:
    activate:
      on-profile: pro

---
server:
  # 设置端口号
  port: 8083
spring:
  config:
    activate:
      on-profile: test

方式二:多文件配置

  • 不同的环境写在不同的Yml文件中,在主yml中进行引用
  • 环境配置文件命名规则:application-{profile}.yml(文件里面就不写别名了)

1.7 SpringBoot单元测试

1.8 前后端不分离

概念:在JavaWeb项目中,有一种项目架构是将页面资源交由后端进行解析,然后响应页面资源给前端,这种项目架构称为前后端不分离项目

前后端分离

概念:目前主流的开发模式就是前后端分离模式,前端项目和后端项目分开构建,分开开发和部署。前端使用Mockjs或fastMock模拟假数据和接口进行测试,后端使用PostMan、ApiFox等工具进行测试

1.9 Controller控制器

概念:Controller是一个代码方案,可以通过具体的技术实现:Servlet,SpringMvc。Servlet是处理请求的底层代码,而SpringMvc是Spring提供的一个处理请求的框架,底层还是通过Servlet实现的,可以看成是对Servlet的封装,让代码写起来更加简单,更加灵活

1.10 SpringMvc

概念:SpringMvc是基于Spring框架的一个用于处理web请求的框架,底层就是Servlet

  • SpringBoot中已经封装好了SpringMvc框架,我们只需要导入起步依赖spring-boot-starter-web即可使用
  • SpringMvc中有一个非常重要的Servlet类,叫做DispatcherServlet,这也是SpringMvc的核心功能
  • Spring(ioc,aop - 管理对象,抽取公共业务)、SpringMvc(处理请求的)、SpringBoot(简化配置,简化启动部署)关系如下

1.11 DispatcherServlet

概念:SpringMVC提供了一个DispatcherServlet类,称之为核心控制器,DispatcherServlet负责接收请求,然后根匹配规则将请求再转发给后面的请求处理器Controller,请求处理器处理完请求之后,最终再由DispatcherServlet给浏览器响应数据

1.12 请求和响应对象

概念:浏览器发送请求,会将请求包装成请求数据包发送给tomcat服务器,Tomcat会解析这些请求数据,然后将解析后的请求数据传递给HttpServletRequest对象,那也就意味着 HttpServletRequest对象就可以获取到请求数据,例如:请求参数、请求IP、请求头信息等等

Tomcat还给Servlet程序传递了一个参数 HttpServletResponse,通过这个对象,我们就可以给浏览器设置响应数据

1.13 后端接口

概念:Controller方法就是一个接口,那个Controller类就是接口。

二、API协同研发工具

  1. 主流工具

安装步骤见文档Spring高级

三、数据交换格式

3.1 数据交换格式

概念:数据交换/数据交互指的是不同语言或不同项目之间数据的共享,数据要以统一的格式(所有语言,所有项目都能识别)进行保存。而目前基本所有项目或所有语言都能识别的数据格式:xml和json

  • xml目前一般只用于做配置文件
  • json以轻量和解析方便的优势作为数据交换格式
  • 数据库用来存储文件

3.2 Json数据格式(JavaScript Object Notation - JS对象表示法)

概念:一种轻量级的数据交换格式。易于人阅读和编写,可以在多种语言之间进行数据交换,同时也易于机器解析和生成

Json数据格式

  • 一个对象:{“key1”:“value1”,“key2”:“value2”…}
  • 多个对象:[{“key1”:“value1”,“key2”:“value2”…},{“key1”:“value1”,“key2”:“value2”…},{“key1”:“value1”,“key2”:“value2”…}]

注意::JSON数据格式就是以key-value形式的数据格式,KEY必须 以 “” 包裹起来,并且如果value是字符串也必须以 “” 包裹起来,如果不是字符串那么正常写就可以

四、SpringBoot中Controller应用

4.1 公共资源路径

概念:在企业开发中,不会把所有模块的接口写在一个控制器类中,通常会按照模块划分控制器类

  • 用户模块控制器类:UserController
  • 员工模块控制器类:EmployeeController
  • 部门模块控制器类:DepartmentController

那么将模块划分到了不同的控制器类中之后,通常会为每个模块的控制器类定义一个唯一公共资源标识

  • 请求用户模块:/user
  • 请求员工模块:/employee
  • 请求部门模块:/department

抽取公共资源路径:将公共资源路径抽取到控制器类上使用@RequestMapping(“公共资源路径”)注解标识

4.2 参数接收

1.请求对象接受

2.参数接收-通过参数名(参数类型不要用基本类型)

  • 参数名不一致时在形参前面加上@RequestParam(value=“传递参数名称”)指定前端传递的那个参数映射到形参中

@RequestParam属性

  • value:指定前端传递的参数名称
  • required:此参数是否必填,默认为true,如果使用默认为true的属性值前端没有传递此参数时会响应400
  1. 参数接收-实体对象

  2. 参数接收-数组集合

  3. 参数接收-日期参数

概念:日期类型与其他类型不同,日期类型在接收时需要指定@DateTimeFormat(pattren=“日期格式”)注解,然后通过Date或LocalDateTime对象进行接收。

  1. 参数接收-JSON数据

  2. 参数接收-路径参数

RestFulAPI

  1. 概念:REST:Resource Representational State Transfer的缩写。意思是:“表现层状态转移”

RESTfulAPI:RESTFul风格的接口。用URL定位资源,用HTTP动词(GET、POST、PUT、DELETE)描述操作

要求:

  • 请求方式区别资源
  • 资源路径只能有名词不能有动词
操作 请求方式 说明
C:新增 POST 新增操作使用POST请求方式
R:读取 GET 获取等操作使用GET请求方式
U:修改 PUT 修改等操作使用PUT请求方式
D:删除 DELETE 删除等操作使用DELETE请求方式

注意:同一个Controller类/接口类中不能有相同请求(请求方式 + 请求地址 ),否则启动就报错

使用:@RequestMapping注解可以指定所有请求方式,企业开发中不再使用@RequestMapping指定接口请求方式,只使用@RequestMapping注解指定唯一公共资源路径

  1. 参数响应

@RestController注解,这是一个复合注解,其底层包含了如下两个注解

  • **@Controller:标识当前类是一个控制器类 **
  • @ResponseBody:加在类上代表整个控制器类的接口方法都响应JSON格式数据返回给前端
  1. 响应json数据演示
  • 接口响应单个JSON对象

  • 接口响应集合JSON对象

  • 统一响应结果

为什么要统一:

  • 前端每次都要根据不同的结果做不同的处理,非常麻烦
  • 不知道后端接口请求是否成功,无法做进一步的处理

定义统一响应结果类工具类:

package cn.itsource.utils;

/**
 * @Date: 2023-08-04
 * @Description: 响应信息结果类
 * @Version:1.0
 */
public class R<T> {

    // 响应状态码
    private Integer code;

    // 操作结果
    private Boolean success;

    // 响应数据 - 描述信息
    private String message;

    // 响应数据 - 其他数据
    private T data;

    public static <T> R<T> ok() {
        return new R<T>(200, true, "操作成功", null);
    }

    public static <T> R<T> ok(T data) {
        return new R<T>(200, true, "操作成功", data);
    }

    public static <T> R<T> ok(String message) {
        return new R<T>(200, true, message, null);
    }

    public static <T> R<T> ok(String message, T data) {
        return new R<T>(200, true, message, data);
    }


    public static <T> R<T> fail() {
        return new R<T>(500, false, "操作失败", null);
    }

    public static <T> R<T> fail(T data) {
        return new R<T>(500, false, "操作失败", data);
    }

    public static <T> R<T> fail(String message) {
        return new R<T>(500, false, message, null);
    }

    public static <T> R<T> fail(Integer code) {
        return new R<T>(code, false, "操作失败", null);
    }

    public static <T> R<T> fail(String message, T data) {
        return new R<T>(500, false, message, data);
    }

    public static <T> R<T> fail(Integer code, T data) {
        return new R<T>(code, false, "操作失败", data);
    }

    public static <T> R<T> fail(Integer code, String message) {
        return new R<T>(code, false, message, null);
    }

    public static <T> R<T> fail(Integer code, String message, T data) {
        return new R<T>(code, false, message, data);
    }


    public R(Integer code, Boolean success, String message, T data) {
        this.code = code;
        this.message = message;
        this.success = success;
        this.data = data;
    }

    public Integer getCode() {
        return code;
    }

    public void setCode(Integer code) {
        this.code = code;
    }

    public String getMessage() {
        return message;
    }

    public void setMessage(String message) {
        this.message = message;
    }

    public Boolean getSuccess() {
        return success;
    }

    public void setSuccess(Boolean success) {
        this.success = success;
    }

    public T getData() {
        return data;
    }

    public void setData(T data) {
        this.data = data;
    }
}

课程总结

  1. 什么是起步依赖有,有什么好处 减少配置
  2. 为什么SpringBoot项目导入依赖不需要导入版本 被父项目管理了
  3. SpringBoot中配置文件有哪几种,优先级最高的是哪种 3种 properties最高 yaml yml
  4. 项目开发模式分哪两种,什么是前后端分离项目?
  5. 注解@RestController和注解@RequestMapping有什么作用

1.@RestController它结合了 @Controller@ResponseBody(方法的返回值序列化为特定格式(如 JSON、XML 等)) ,其中每个方法的返回值会直接序列化为 JSON 或 XML 数据并发送给客户端,也就是处理请求

2.@RequestMapping用于将任意HTTP 请求映射到控制器方法上,也就是请求映射。

  1. Apifox是什么有什么用 模拟前端发送数据
  2. xml和json的区别 xml一般做配置文件 json交换数据格式
  3. 什么是Restful 用URL定位资源,用HTTP动词(GET、POST、PUT、DELETE)描述操作
  4. 接口中参数接收有哪些方式 对象,数组集合,json,日期,路径
  5. 接口中如何响应数据 通过requestMapping接收请求,然后通过return响应数据给调用方,前提是必须声明注解requestcontroller(处理请求的)

er@ResponseBody(方法的返回值序列化为特定格式(如 JSON、XML 等))`** ,其中每个方法的返回值会直接序列化为 JSON 或 XML 数据并发送给客户端,也就是处理请求

2.@RequestMapping用于将任意HTTP 请求映射到控制器方法上,也就是请求映射。

  1. Apifox是什么有什么用 模拟前端发送数据
  2. xml和json的区别 xml一般做配置文件 json交换数据格式
  3. 什么是Restful 用URL定位资源,用HTTP动词(GET、POST、PUT、DELETE)描述操作
  4. 接口中参数接收有哪些方式 对象,数组集合,json,日期,路径
  5. 接口中如何响应数据 通过requestMapping接收请求,然后通过return响应数据给调用方,前提是必须声明注解requestcontroller(处理请求的)

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