一、JSON 基础语法

image-20250605165313724

二、Ajax - Axios发起异步请求

Ajax

作用:

  • 数据交换:通过Ajax可以给服务器发送请求,并获取服务器响应的数据。
  • 异步交互:可以在不重新加载整个页面的情况下,与服务器交换数据并更新部分网页,如:搜索联想、用户名是否可用的校验等。

Axios

Axios对原生的Ajax进行了封装,简化书写,快速开发。

使用步骤:

image-20250605200523447

简化写法

image-20250605200944585

Maven

一款用于管理和构建java项目的工具。

  • 依赖管理:方便的管理项目依赖的资源,避免版本冲突问题
  • 统一项目结构:提供标准、统一的项目结构
  • 项目构建:标准跨平台的自动化项目构建方式

仓库:

image-20250606142002180

创建

  • groupId:定义当前Maven项目隶属的组织名称(通常是域名反写,如space.ericzht)

  • artifactId:定义当前Maven项目名称

  • version:定义当前项目版本号

生命周期

Maven的生命周期是为了对所有的Maven项目构建过程进行抽象和统一。

Maven中有3套相互独立的生命周期:

  • clean:清理工作
  • default:核心工作,如:编译、测试、打包、安装、部署等
  • site:生成报告、发布站点等

image-20250606155547521

需要了解的五个生命周期:

image-20250606155629383

test为什么日志无法显示结果?

test包里的Java文件必须以Test结尾,日志没显示出来是因为类名错误,找不到test的文件

image-20250606162245333

Spring

SpringBoot

快速便捷的Spring框架,基于SpringBoot可以快速构建Spring框架。

SpringBoot快速入门

新建模块

依赖中要勾选Spring Web

image-20250606165510502

创建请求处理类 HelloController

image-20250606165617238

运行启动类,在浏览器中进行测试

image-20250606165652006

Tips:包被识别成文件夹怎么办?

右键Java目录,选择标记目录为源根

HTTP协议

概述

Hyper Text Tranfer Protocol 超文本传输协议

特点:

  1. 基于TCP协议:面向连接,安全
  2. 基于请求-响应模型:一次请求对应一次响应
  3. HTTP协议是无状态的协议:对事务处理没有记忆能力。每次请求-响应都是独立的。
    1. 缺点:多次请求之间不能共享数据
    2. 优点:速度快

请求数据

image-20250606190226500

响应数据

image-20250606190506831

image-20250606190525698

状态码大类

状态码分类 说明
1xx 响应中——临时状态码,表示请求已经接受,告诉客户端应该继续请求或者如果它已经完成则忽略它
2xx 成功——表示请求已经被成功接收,处理已完成
3xx 重定向——重定向到其它地方:它让客户端再发起一个请求以完成整个处理。
4xx 客户端错误——处理发生错误,责任在客户端,如:客户端的请求一个不存在的资源,客户端未被授权,禁止访问等
5xx 服务器端错误——处理发生错误,责任在服务端,如:服务端抛出异常,路由出错,HTTP版本不支持等

常见的响应状态码

状态码 英文描述 解释
==200== OK 客户端请求成功,即处理成功,这是我们最想看到的状态码
302 Found 指示所请求的资源已移动到由Location响应头给定的 URL,浏览器会自动重新访问到这个页面
304 Not Modified 告诉客户端,你请求的资源至上次取得后,服务端并未更改,你直接用你本地缓存吧。隐式重定向
400 Bad Request 客户端请求有语法错误,不能被服务器所理解
403 Forbidden 服务器收到请求,但是拒绝提供服务,比如:没有权限访问相关资源
==404== Not Found 请求资源不存在,一般是URL输入有误,或者网站资源被删除了
405 Method Not Allowed 请求方式有误,比如应该用GET请求方式的资源,用了POST
428 Precondition Required 服务器要求有条件的请求,告诉客户端要想访问该资源,必须携带特定的请求头
429 Too Many Requests 指示用户在给定时间内发送了太多请求(“限速”),配合 Retry-After(多长时间后可以请求)响应头一起使用
431 Request Header Fields Too Large 请求头太大,服务器不愿意处理请求,因为它的头部字段太大。请求可以在减少请求头域的大小后重新提交。
==500== Internal Server Error 服务器发生不可预期的错误。服务器出异常了,赶紧看日志去吧
503 Service Unavailable 服务器尚未准备好处理请求,服务器刚刚启动,还未初始化好

状态码大全:https://cloud.tencent.com/developer/chapter/13553

Tomcat

概述

  • 一个开源免费的轻量级Web服务器,支持Servlet/JSP少量的JavaEE规范。
  • JavaEE:Java企业版,指企业级开发的技术规范总和。
  • Tomcat也被称为Web容器、Servlet容器。Servlet程序需要依赖于Tomcat才能运行
  • 对HTTP协议操作进行了封装,简化web程序开发。

请求

image-20250606195235597

Postman

在网页调试中,只能在地址栏添加内容,这是GET类型的请求,很难对POST类型的请求进行测试。于是出现了Postman插件。

网页调试与发送网页HTTP请求的Chrome插件

常用于进行接口测试

SpringBoot接受请求的方式(简单参数)

1
2
3
4
5
6
7
8
@RestController
public class HelloController {
@RequestMapping("/simpleRequest")
public String simpleRequest(String name, int age){ // 直接把请求需要传的参数写在函数的参数列表中,会自动进行类型转换,由String转换为你写的类型
System.out.println(name + ":" + age);
return "OK";
}
}
1
2
3
4
5
@RequestMapping("/simpleRequest")
public String simpleRequest(@RequestParam(name = "name") String username, int age){ // 这里相当于给username添加了一个别名,叫name。到时候客户端发送请求的时候使用name进行请求。(不可以使用username)
System.out.println(username + ":" + age);
return "OK";
}

@RequestParam中的required属性默认为true,代表该请求参数必须传递,如果不传递则报错。如果这个参数是可选的,可以将required属性设置为false。

原始方式接受请求*

image-20250606202508767

SpringBoot接受请求的方式(实体参数)

把所有参数封装到一个类中,获取时将参数全部放入类的对象中。

简单实体对象

image-20250606204025726

复杂实体对象

image-20250606204344296

注:这里要给类写toString方法,否则输出的是类的类似于地址的东西。

数组集合参数

  • 数组参数:请求参数名与形参数组名称相同且请求参数为多个,定义数组类型参数即可接受参数

image-20250606205405653

  • 集合参数:需要使用 @RequestParam 绑定参数关系

image-20250606205627455

日期参数

image-20250606205848573

Json参数

image-20250606210022823

路径参数

image-20250606210426747

响应

image-20250608103212451

image-20250608103235300

这样响应回去的数据是各式各样的,前后端开发成本高、不便管理、很难维护。

—— 于是设定一个统一响应的规范 Result

image-20250608103355909

Springboot静态资源存放目录

image-20250608111230352

分层解耦

内聚:软件中各个功能模块内部的功能联系

耦合:衡量软件中各个层/模块之间的依赖、关联程度

软件设计原则:高内聚低耦合

三层架构

image-20250608112139339

  • Controller:控制层,接收前端发送的请求,对请求进行处理,并响应数据。
  • Service:业务逻辑层,处理具体的业务逻辑。
  • Dao:数据访问层(Data Access Object)(持久层),负责数据访问操作,包括数据的增删改查。

分层解耦

image-20250608113732272

上图这种架构,如果ServiceA要改为ServiceB,那么不仅要修改Service层的代码,还要修改Controller层的代码,Service层和Controller层耦合度较高,不利于后续开发。

于是Spring提出了控制反转依赖注入

image-20250608114114382

控制反转

Inversion Of Control,IOC

对象的创建控制权由程序自身转移到外部(容器)

依赖注入

Dependency Injection,DI

容器为应用程序提供运行时所依赖的资源

Bean对象

IOC容器中创建、管理的对象

步骤

只有单个bean
  1. 将Service层及Dao层的实现类交给IOC容器管理。 添加注解 @Component
  2. 为Controller及Service注入运行时依赖的对象。添加注解 @Autowired

​ 程序在运行时会自动为他们提供所注解的对象

如果要切换Service层的内容,直接将原来的Service层的@Component注解注释掉给新的添加注释就好了。

image-20250608182415261

image-20250608200511626

同时有多个bean

@Autowired 默认是按照类型进行的,如果存在多个相同的bean,会报错。

解决方法:

  1. 在想要执行的的注解上加上**@Primary**注解设置其为高优先级。
  2. @Autowired + @Qualifier(“bean的名称”)
  3. @Resource(name=”bean的名称”)

区别:

  • @Autowired 是spring框架提供的注解,而@Resource是JDK提供的注解
  • @Autowired 默认是按照类型注入,而@Resource默认是按照名称注入

image-20250608203209548

Bean组件扫描

  • 前面声明bean的四大注解,要想生效,还需要被组件扫描注解**@ComponentScan**扫描

  • 启动类声明的注解**@SpringBootApplication**中,默认扫描的范围是启动类所在包及其子包

    如果在别的地方添加了组件,并且想要被扫描,就要使用 @ComponentScan(“包名”) 来显式配置,并且需要加上启动类所在的包名。

MyBatis

是一款优秀的持久层(dao层),用于简化JDBC的开发

快速入门

image-20250608210939248

程序会自动将获取到的数据封装到User对象中,并装入List类型的集合

image-20250707140344743

这里运用了IOC(控制反转)和依赖注入。

将对象的创建控制权由程序自身转移到外部(容器),并且由IOC容器来自动创建对象,需加上@Autowired注解

JDBC

sun公司提供的一套操作关系型数据库的API(规范),但是操作很繁琐,因此使用MyBatis来简化开发。

数据库连接池

是一个容器,负责分配、管理数据库连接。

它允许应用程序重复使用一个现有的数据库连接,而不是重新建立一个连接,减少资源浪费。

释放空间时间超过最大空闲时间的连接,避免因为没有释放连接而引起的数据库连接遗漏。

image-20250708112513181

优势:

  • 资源重用
  • 提升系统响应速度
  • 避免数据库连接遗漏

标准接口:DataSource

第三方组织实现了该接口,springboot默认使用Hikari(追光者)

Druid(德鲁伊):阿里巴巴开源的数据库连接池项目,功能强大、性能优秀,是java语言最好的数据库连接池之一。

Lombok

一个实用的Java类库,能通过注解自动生成构造器、getter/setter、equals、toString等方法,并可以自动生成日志变量,简化java开发、提高效率。

image-20250708114341671

需在pom文件中引入依赖:

image-20250708114525488

基础操作

删除

1
2
@Delete("delete from emp where id = #{id}") // 使用占位符来获取变量信息,如果只传一个参数,那占位符中的属性名可以随便写,可以写id、value等等
public void delete(Integer id);

使用占位符编写的sql语句就是预编译的sql语句,编译时会用来替换掉占位符

预编译

  • 性能更高
  • 更安全(防止sql注入)

image-20250709094052106

参数占位符

image-20250709094833659

新增

image-20250709095336074

主键返回

在数据添加成功后,需要获取插入数据库数据的主键。

如:添加套餐数据时,需要维护套餐菜品关系表数据

image-20250709095829634

image-20250709095837604

更新(修改)

image-20250709100049950

查询

image-20250709100158869

数据封装

image-20250709100304900

方案1:给字段起别名,让别名与实体类属性一致

image-20250709100449915

方案2:通过@Results,@Result注解手动映射封装

image-20250709100608738

方案3:开启mybatis的驼峰命名自动映射开关

即a_column –> aColumn

在application.properties中添加:

image-20250709100811137

条件查询

image-20250709101817684

由于${ }是进行拼接,没有进行预编译,性能低。并且存在sql注入问题,所以更推荐使用concat进行拼接,这样仍然可以在concat中使用#{ }

image-20250709102051517

springboot版本问题

image-20250709102210092

XML映射文件

  • XML映射文件的名称与Mapper接口名称一致,并且将XML映射文件和Mapper接口放置在相同包下(同包同名)
  • XML映射文件的namespace属性与Mapper接口全限定名一致。
  • XML映射文件中sql语句的id与Mapper接口中的方法名一致,并保持返回类型一致。

image-20250709103217811

注:如果函数是void类型的,那么就不需要写resultType了。

注解主要完成简单的增删改查功能,如果需要复杂的SQL功能,建议使用XML来配置映射语句。

动态SQL

随着用户的输入或外部条件的变化而变化的SQL语句

<if>

用于判断条件是否成立。使用test属性进行条件判断,如果条件为true,则拼接其中的SQL语句。

image-20250709105856335

<where>

where元素只会在子元素有内容的情况下才插入其中的内容,并且会自动判断是否需要删除子句开头的and或者or

image-20250709105918694

<set>

动态在行首插入set关键字,并会删掉额外的逗号。(用在update语句中)

<foreach>

image-20250709142018913

<sql><include>

相当于封装为一个函数,需要时使用include调用即可。实现代码的复用。

image-20250709142920021

案例

开发规范

Restful

REST(REpresentational State Transfer),表述性状态转换,它是一种软件架构风格。

是一种约定,而不是规定,可以打破。

image-20250709154819601

统一响应结果

image-20250709154935380

开发流程

image-20250709155133322

日志

定义日志对象

法一

1
private static Logger log = LoggerFactory.getLogger(DeptController.class);

法二

直接在controller接口上添加@Slf4j注解,自动生成日志记录对象(lombok提供的便携方式)

tips

封装json数据

当前端提供的是json格式的数据,可以使用@RequestBody注解来将json数据封装到一个实体类中

省略相同的路径

可以将方法的注解中相同部分的路径提取到类上的@RequestMapping注解中

image-20250709203052681

分页查询

image-20250709213114703

文件上传

使用MultipartFile类型的变量来接收上传的文件,变量名需要与前端中该表单项的名字相同。

image-20250710122133959

上传大小限制

在SpringBoot中,默认单个文件允许最大大小为1M,如果需要上传大文件,需要在application.properties中添加配置:

image-20250710123103687

本地存储

image-20250710123412688

云端存储

根据云服务商提供的官方文档

将服务器信息写在配置文件中,通过注解的形式引入,便于后面的管理和维护。

image-20250710150313756

image-20250710152230046

如果使用@ConfiurationProperties注解的话需要将所有属性写到单独的一个类中,并交给IOC管理,需要使用的时候自动创建Bean对象,并通过这个对象的get方法获取对象中的属性。

单独的类:

image-20250710152832662

依赖注入:

image-20250710153101828

yml配置文件

常见配置文件格式对比

image-20250710150850510

yml

  • 大小写敏感

  • 数值前必须有空格,作为分隔符

  • 使用缩进表示层级关系,缩进时不可以使用tab键,只能用空格。(但是idea会自动将tab转换为空格)

  • 缩进的空格数不重要,只要相同层级的元素左侧对齐即可

  • # 表示注释,从这个字符一直到行尾,都会被解析器忽略

image-20250710151221717

左properties 右yml:

登录校验

image-20250711110259932

会话技术

会话:用户打开浏览器,访问web服务器的资源,会话建立。直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。

会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一会话的多次请求间共享数据。

会话跟踪方案

  1. ​ 客户端会话跟踪技术:Cookie
  2. ​ 服务端会话跟踪技术:Session
  3. ​ 令牌技术

会话跟踪方案对比

image-20250711113026620

image-20250711115558945

主流方案:

image-20250711115840106

JWT令牌

JSON Web Token

定义了一种简洁的、自包含的格式,用于在通信双方以json数据格式安全的传输信息。由于数字签名的存在,这些信息是可靠的。

image-20250711151724483

使用场景:

  1. 登陆成功后,生成令牌。
  2. 后续每个请求,都要携带JWT令牌,系统在每次请求处理之前,先校验令牌,通过后,再处理。

生成令牌

image-20250711153530606

解析、校验令牌

image-20250711153613387

过滤器 Filter

可以把对资源的请求拦截下来,从而实现一些特殊的功能(登录校验、统一编码处理、敏感字符处理等)。

image-20250711155251418

入门

image-20250711160029877

执行流程

image-20250711161044049

拦截路径

image-20250711161228647

过滤器链

image-20250711161804631

登录校验流程

image-20250711162032807

拦截器

一种动态拦截方法调用的机制,类似于过滤器。Spring框架中提供,用来动态拦截控制器(Controller)方法的执行。

作用:拦截请求,在指定方法调用前后,根据业务执行预先设定的代码。

入门

image-20250711203102747

拦截路径

image-20250711203737261

执行流程

image-20250711204118228

image-20250711204238118

异常处理

image-20250711205717015

事务管理

事务是一组操作的集合,是一个不可分割的工作单位,这些操作要么同时成功,要么同时失败。

image-20250712103224594

Spring事务管理

@Transactional 注解

写在业务(service)层的方法、类、接口上

作用:将当前方法交给Spring进行事务管理,方法执行前,开启事务。成功执行结束,则提交事务;出现异常,则回滚事务。

默认情况下,只有出现 RuntimeException 才会回滚。

事务管理日志

在yml文件中配置

image-20250712105307401

rollbackFor属性——回滚

用于控制出现何种异常类型时,回滚事务。

1
@Transactional(rollbackFor = Exception.class) // 这样设置是所有异常都会回滚

propagation属性——传播行为

当一个事务被另一个事务方法调用时,这个事务方法应如何进行事务控制。

image-20250712113445815

image-20250712114335680

AOP

AOP基础

概述

Aspect Oriented Programming (面向方面编程),其实就是面向特定方法编程

场景:

部分功能运行较慢,如果要定位执行耗时较长的业务方法,需要统计每一个业务方法的执行耗时

实现:

动态代理是面向切面编程最主流的实现。而SpringAOP是Spring框架的高级技术,旨在管理bean对象的过程中,主要通过底层的动态代理机制,对特定的方法进行编程。

image-20250712192249126

更正,不是接口名,而是类名

核心概念

image-20250712192730311

通知类型

即什么时候执行方法。

image-20250712194341984

image-20250712195222441

切入点表达式

用来描述切入点方法的一种表达式。

作用:决定项目中的哪些方法需要加入通知

常见形式1:execution

image-20250712213409374

image-20250712211059698
  • () 匹配没有参数的方法
  • (..) 匹配有任意数量参数的方法
  • (*) 匹配有一个任意类型参数的方法
  • (*,String) 匹配有两个参数的方法,并且第一个为任意类型,第二个为 String 类型

通配符描述切入点

image-20250715111030668

根据业务需要,可以使用与&&,或||,非! 来组合比较复杂的切入点表达式

注:update* 表示以update开头的方法

image-20250721162623262

封装

如果几个切面的切入点表达式相同(重复——>封装)

image-20250712195848034

常见形式2:@annotation

用于匹配标识有特定注解的方法

image-20250721163740613

这样的话需要创建一个文件来定义注解:

1
2
3
4
5
@Retention(RetentionPolicy.RUNTIME) // 设置该注解用于代码运行时
@Target(ElementType.METHOD) // 设置该注解只能用于方法
public @interface MyLog{

}

上图annotation中的内容时这个注解定义文件的具体包名。

通知顺序

image-20250712210933883

SpringBoot 原理

配置文件优先级

image-20250721204338260

java系统属性和命令行参数配置

springboot除了支持使用配置文件来配置属性,还支持以下两种方式配置属性。

image-20250721204500778

bean的获取

image-20250723150612166

image-20250723150629293

bean的作用域

可以通过 @Scope 注解来配置作用域

image-20250723154841007

第三方bean对象

image-20250723161924129