- JavaWeb
- junit
- 黑盒测试
- 白盒测试
- 注解
- 所需jar包
- 反射
- 作用
- 获取Class对象的方式
- class对象功能
- 应用
- 注解
- 作用
- 预定义的注解
- 自定义注解
- 解析注解
- 动态代理
- Proxy
- Maven
- 作用
- 概述
- 仓库
- maven依赖仓库:
- IDEA集成
- Maven高级功能
- JDBC
- 概念
- 本质
- 快速入门
- 各个对象
- 抽取JDBC工具类(JDBCUtils)
- JDBC控制事务
- 数据库连接池
- 概念
- 实现
- Spring JDBC
- spring框架对JDBC的简单封装
- spring_jar包下载官网
- 步骤
- HTTP协议
- 特点
- 请求协议 (请求数据格式)
- 响应协议(响应数据格式)
- 协议解析
- Tomcat
- 简介
- 基本使用
- 入门程序解析
- 请求响应
- DispatcherServlet(前端控制器)
- BS架构(浏览器/服务器架构)
- postman调试插件
- 请求参数
- 响应
- 分层解耦
- Mybatis
- 概念
- 注意点
- 入门
- 基础操作(增删改查)
- XML映射文件
- 动态SQL
- 开发案例
- 开发规范
- 输出结果(用日志的方法)
- 开发流程
- 接口调试
- 开发常用操作
- 事务管理
- @Transactional
- 配置文件中开启事务管理日志
- rollbackFor
- propagation
- AOP
- 概念
- 本质
- 入门
- 核心概念
- 通知
- 切入点表达式
- 连接点
- SpringBoot原理
- 配置优先级
- Bean管理
- SpringBoot原理
- 后端技术总结
- SpringBoot开发框架
- 概念区别
- 概念一览图
- 思维导图版本
- XMind文件链接:
- 声明
- junit
JavaWeb
junit
黑盒测试
白盒测试
注解
- @Test
- 断言Assert.assertEquals
- @Before
- 用于资源申请,所有测试方法在执行之前都会先执行该方法
- @After
- 在所有测试方法执行完后,都会自动执行该方法
所需jar包
- hamcrest-core-1.1.jar
- junit-4.12.jar
反射
作用
- 程序运行过程中,可以操作这些对象
- 可以解耦,提高程序的可扩展性
获取Class对象的方式
- Class.forName("全类名")
- 将字节码文件加载进内存,返回Class对象
- 对用于配置文件,将类名定义在配置文件中。读取文件,加载类
- 类名.class
- 通过类名的属性Class获取
- 多用于参数传递
- 对象.getClass()
- getClass()方法在Object类中定义
- 多用于对象的获取字节码的方式
class对象功能
- 获取成员变量
- 设置值
- 获取值
- 忽略访问权限修饰符的安全检查
- 获取构造方法
- 获取成员方法
- 获取类名
应用
- 在不改变任何代码的前提下,可以创建任意类的对象,并执行其中的任意方法
- 实现
- 配置文件+反射
- 步骤
- 1.将需要创建的对象的全类名和需要执行的方法定义在配置文件中
- 2.在程序中加载读取配置文件
- 3.使用反射技术来加载类文件进内存
- 4.创建对象
- 5.执行方法
- 实现
注解
作用
- 编译检查(override)
- 编写文档
- doc文档
- 代码分析
- 使用反射
预定义的注解
- @Override
- 检测该注解标注的方法是否是继承父类(接口)的
- @Deprecated
- 表示已过时的方法
- @SuppressWarnings
- 压制警告
- 一般传递参数“all”
自定义注解
-
格式
- 元注解
- public @interface 名称
-
本质
-
属性
- 接口中可以定义的成员方法
- 返回值
- 基本数据类型
- String
- 枚举
- 注解
- 以上类型的数组
- 定义属性后,使用时需要给属性赋值
- 1.如果定义属性时,用default关键字给属性默认初始化值,则在使用注解时,可以不对属性赋值
- 2.如果只有一个属性需要赋值,并且属性名是value时,则value可以省略,直接定义值
- 3.数组赋值时,值使用{}包裹。如果数组中只有一个值,则{}省略
-
元注解
- 描述注解的注解
- Target
- 描述注解能够作用的位置
- TYPE
- 作用于类
- METHOD
- 作用于方法上
- FIELD
- 作用于成员变量上
- TYPE
- 描述注解能够作用的位置
- Retention
- SOURCE
- CLASS
- RUNTIME
- @Retention(RetentionPolicy.RUNTIME)
- 当前被描述的注解,会保留到class字节码文件中,并被JVM读取到
- Documented
- 描述注解是否被抽到api文档中
- Inherited
- 描述注解是否被子类继承
解析注解
- 获取注解中定义的属性值
- 1.获取注解定义的位置的对象
- CLass,Method,Field
- 2.获取指定的注解
- getAnnotation(Class)
- 本质:在内存中生成了一个该注解接口的子类实现对象
- getAnnotation(Class)
- 3.调用注解中抽象方法获取配置的属性值
- 1.获取注解定义的位置的对象
动态代理
Proxy
- newProxyInstance
- 参数
- ClassLoader
- 类加载器
- new Class[]
- 接口数组
- new InvocationHandler
- 匿名内部类对象
- 指定代理干什么事情
- 重写invoke方法
- 匿名内部类对象
- ClassLoader
- 参数
Maven
作用
-
依赖管理
- 方便自动导入jar包
-
统一项目结构
-
标准化项目构建流程
概述
- 构建和管理
仓库
- 存储资源,管理jar包
- 分类
- 本地仓库
- 中央仓库
- 远程仓库(私服)
maven依赖仓库:
https://mvnrepository.com/
IDEA集成
-
依赖配置
-
依赖传递<dependencies>
- 直接依赖
- 间接依赖
- 排除依赖
- 主动断开依赖资源
- <exclusions>
-
依赖范围
-
生命周期
-
clean
- 清理工作
- clean
- 清理工作
-
default
- 核心工作
- compile
- test
- package
- install
- 核心工作
-
site
-
各阶段作用
-
Maven高级功能
-
分模块设计与开发
- eg
- 实体类、工具类使用maven模块拆分出来,使用时引入这些类的依赖即可
- eg
-
继承与聚合
- 继承
- 概念
- 子工程继承父工程的配置信息,常见于依赖关系的继承
- 简化依赖配置,统一依赖管理
- <parent>……</parent>
- 实现
- 打包方式
- jar包
- springboot
- war包
- SpringMVC
- pom包
- 父工程或聚合工程
- jar包
- 父工程
- 设置打包方式pom
- <packaging>
- 配置共有的依赖
- 设置打包方式pom
- 子工程
- 配置继承关系
- <parent>
- <relativePath>
- 父工程的相对路径
- 配置继承关系
- 打包方式
- 版本锁定
- 统一管理依赖版本
- <dependencyManagement>
- 子工程不会引入依赖,只是对用到此依赖的模块进行依赖版本的统一管理
- 引入指定依赖的子工程的<version>可以省略
- 自定义属性/引用属性
- <properties>
- 集中的将各个依赖的版本号维护在标签<properties>中
- <dependencyManagement>下的版本改为$
- 统一管理依赖版本
- 概念
- 聚合
- 原始打包方式(繁琐)
- Maven生命周期
- 对应依赖模块的instal
- package
- 对应依赖模块的instal
- Maven生命周期
- 聚合方式打包(推荐)
- 聚合工程
- 一个不具有业务功能的“空”工程(有且仅有一个pom文件)
- <modules>
- <module>要打包的模块路径</module>
- 聚合模块下一键操作
- package
- 聚合工程
- 原始打包方式(繁琐)
- 继承
-
私服
-
概念
- 远程仓库,用来代理位于外部的中央仓库,解决资源共享同步问题
-
资源上传与下载
-
图解
-
项目版本
- RELEASE(发行版本)
- SNAPSHOT(快照版本)
-
配置
- xml文件中设置私服访问用户名和密码
- pom文件中上传地址
- xml文件中设置下载的仓库组地址
-
-
本地私服配置
- 启动本地私服
- 解压:apache-maven-nexus.zip
- 进入目录:apache-maven-nexus\nexus-3.39.0-01\bin
- 启动服务:双击start.bat
- 访问服务: localhost:8081
- 私服配置说明:将上述配置私服信息的192.168.150.101 改为localhost
- 启动本地私服
-
JDBC
概念
- Java datebase connectivity
- Java数据库连接
- Java语言操作数据库
- Java数据库连接
本质
- 官方定义的一套操作所有关系型数据库的规则,即接口。各个数据库厂商去实现这套接口,提供数据库驱动jar包。我们可以使用这套接口编程,真正执行的代码是驱动jar包中的实现类
快速入门
- 步骤
-
1.导入驱动jar包
-
2.注册驱动
Class.forName("com.mysql.cj.jdbc.Driver");
-
3.获取数据库连接对象 Connection
conn = DriverManager.getConnection("jdbc:mysql:///db1","user","password");
-
4.定义sql
String sql="";
-
5.获取执行sql语句的对象 Statement
stmt=conn.createStatement();
-
6.执行sql 接收返回结果
int count = stmt.executeUpdate(sql);
-
7.处理结果
-
8.释放资源
- 用finally
- 先判断stmt和conn是否为空,再进行释放
- 用finally
-
各个对象
-
DriverManager(驱动管理对象)
- 功能
-
注册驱动
static void registerDriver(Driver driver);
-
获取数据库连接
static Connection getConnection(String url,String user,String password);
- 参数
- URL
- 指定连接的路径
- jdbc:mysql://ip地址(域名):端口号/数据库名称
- 本地mysql服务器连接+默认端口号3306
- 简写:jdbc:mysql:///数据库名称
- 指定连接的路径
- user
- 用户
- password
- 密码
- URL
- 参数
-
- 功能
-
Connection(数据库连接对象)
-
获取执行sql的对象
Statement createStatemnt(); PreparedStatement prepareStatement(String url);
-
管理事务
-
开启事务
setAutoCommit(boolean autoCommit);
- 调用该方法设置参数为false,即为开启事务
-
提交事务
commit();
-
回滚事务
rollback();
-
-
-
Statement(执行sql对象)
- 执行sql
- int executeUpdate(String sql)
- 执行DML、DDL语句
- 返回值:影响的行数
- 判断DML语句是否执行成功(返回值>0)
- DDL语句没有返回结果
- ResultSet executeQuery(String sql)
- 执行DQL语句
- int executeUpdate(String sql)
- 执行sql
-
ResultSet(结果集对象,封装查询结果)
- next()
- 游标向下移动一行
- getXxx()
- 获取数据(某一行的某一列)
- eg: getInt(),getString()
- 参数
- int
- 代表列的编号,从1开始
- getString(1)
- String
- 代表列名
- getDouble("列名")
- int
- 操作
- 1.游标向下移动一行
- next()
- 2.判断是否有数据
- boolen next()
- 3.获取数据
- 1.游标向下移动一行
- next()
-
PreparedStatement(执行sql对象)
-
sql注入问题
- 在拼接sql时,有一些sql的特殊关键字参与字符串的拼接,造成安全性问题
-
解决sql注入问题
- 使用PreparedStatement对象
-
预编译的sql
- 参数使用?作为占位符
-
步骤
-
1.导入驱动jar包
-
2.注册驱动
-
3.获取数据库连接对象Connection
-
4.定义sql
-
sql的参数使用?作为占位符
select * from user where username = ? and password = ?;
-
-
5.获取执行sql的对象preparedStatement
Connection.preparedStatement(String sql);
-
6.给?赋值
- setXxx(参数1,参数2)
- 参数1:?的位置编号,从1开始
- 参数2:?的值
- setXxx(参数1,参数2)
-
7.执行sql语句
- 无需传递sql语句作为参数
-
8.处理结果
-
9.释放资源
-
-
抽取JDBC工具类(JDBCUtils)
- 抽取注册驱动
- 抽取一个方法获取连接对象
- 要求
- 不传递参数,还得保证工具类的通用性
- 解决
- 配置文件
- 要求
- 抽取一个方法释放资源
JDBC控制事务
- 使用Connection对象来管理事务
-
开启事务
setAutoCommit(boolean autoCommit);
-
调用该方法设置参数为false,即为开启事务
-
在执行sql之前开启事务
-
-
提交事务
commit();
- 当所有sql都执行完提交事务
-
回滚事务
rollback();
- 在抓取异常catch中回滚事务
-
数据库连接池
概念
- 存放数据库连接的容器
实现
- 标准接口
- DataSource
- javax.sql包下的
- 方法
- 获取连接:getConnection()
- 归还连接:调用Connection.close()
- DataSource
- 数据库厂商实现数据库连接池
- C3P0
- 步骤
- 1.导入jar包(两个),同时还要导入驱动jar包
- 2.定义配置文件
- 名称
- c3p0.properties 或 c3p0-config.xml
- 路径
- 放在src目录下
- 名称
- 3.创建核心对象 数据库连接池对象
- CombopooledDataSource
- 4.获取连接对象
- getConnection
- 步骤
- Druid
- 步骤
- 1.导入jar包
- 2.定义配置文件
- properites
- 可以放任意目录下
- 3.加载配置文件
- Properties
- pro.load()
- 4.获取数据库连接池对象
- 通过工厂来获取
- DruidDataSourceFactory
- 通过工厂来获取
- 5.获取连接
- getConnection
- 定义工具类
- 1.定义一个类
- JDBCUtils
- 2.提供静态代码块加载配置文件,初始化连接池对象
- 3.提供方法
- 1.获取连接方法
- 通过数据库连接池获取连接
- 2.释放资源
- 3.获取连接池的方法
- 1.获取连接方法
- 1.定义一个类
- 步骤
- C3P0
Spring JDBC
spring框架对JDBC的简单封装
- 提供了一个JDBCTemplate对象简化了JDBC的开发
spring_jar包下载官网
https://repo.maven.apache.org/maven2/org/springframework/
http://commons.apache.org/proper/commons-logging/download_logging.cgi
步骤
-
1.导入jar包
-
2.创建JdbcTemplate对象。依赖于数据源DataSource
JdbcTemplate template = new JdbcTemplate(ds);
-
3.调用JdbcTemplate的方法来完成CRUD操作
-
update()
- 执行DML语句;增删改语句
-
queryForMap()
- 查询结果将结果集封装成map集合
- 将列名作为key,将值作为value,将这条记录封装为map集合
- 注意:这个方法查询的结果集长度只能是1
- 查询结果将结果集封装成map集合
-
qureyForList()
- 查询结果将结果集封装为list集合
- 注意:将每一条记录封装为map集合,再将所有的map集合封装为List
-
query()
-
查询结果将结果封装为JavaBean对象
List<Emp> list = template.query(sql,new BeanPropertyRowMapper<Emp>(Emp.class));
- Emp为封装的类型
-
-
queryForObject()
-
查询结果,将结果封装为对象
-
一般用于聚合函数的查询
-
eg:
Long total = template.queryForObject(sql,Long.class);
-
-
-
HTTP协议
特点
- 基于TCP协议
- 面向连接,安全
- 基于请求-响应模型的
- 一次请求对应一次响应
- HTTP协议是无状态的协议
- 对于事务处理没有记忆能力。每次请求-响应都是独立的。
- 缺点: 多次请求间不能共享数据。
- 优点: 速度快
- 对于事务处理没有记忆能力。每次请求-响应都是独立的。
请求协议 (请求数据格式)
-
请求行(第一行)
- 请求方式 、资源路径、协议
-
请求头(第二行)
-
格式 key:value
-
常见key
-
-
请求体
- POST请求,存放请求参数
-
请求方式GET和POST的区别
响应协议(响应数据格式)
-
响应行(第一行)
- 协议、状态码、描述
-
响应头(第二行)
- 格式 key:value
-
响应体(响应正文)
- 存放响应数据
-
常见状态码
协议解析
- 详见“请求响应”部分
Tomcat
简介
-
Web服务器,是一个软件程序,对HTTP协议的操作进行封装
-
也称Web容器,Servlet容器
-
官网
https://tomcat.apache.org/
基本使用
-
启动与关闭
-
端口修改
-
部署项目
- 将项目放置webapps目录下即可完成部署
入门程序解析
-
起步依赖
-
spring-boot-starter-web
- 包含了web应用开发所需要的常见依赖。
-
spring-boot-starter-test
- 包含了单元测试所需要的常见依赖。
-
-
内嵌Tomcat服务器
- 基于SpringBoot开发的web应用程序
请求响应
DispatcherServlet(前端控制器)
- HttpServletRequest
- HttpServletResponse
BS架构(浏览器/服务器架构)
-
图解
postman调试插件
- 接口测试
- 网页调试,发送网页HTTP请求的插件
请求参数
- 简单参数
- 参数名与形参变量名相同,定义形参即可接收参数
- 若方法形参名称与请求参数名称不匹配,可以使用@RequestParam完成映射
- 实体参数
- 简单实体参数
- 请求参数名与实体对象的属性名一致,自动接收封装
- 复杂实体参数
- 简单实体参数
- 数组集合参数
- 数组
- 请求参数名与形参中数组变量名相同,直接用数组封装
- 集合
- 请求参数名与形参中集合变量名相同,通过@RequestParam绑定参数关系
- 数组
- 日期参数
- 使用@DateTimeFormat注解完成日期参数格式转换
- Json参数
- POST请求
- raw - JSON
- Json数据键名与形参对象属性名相同,定义pojo类型形参即可接收参数,需使用@RequestBody标识
- POST请求
- 路径参数
- 通过请求URL直接传递参数,使用{……}来标识该路径参数,需要使用@PathVariable获取路径参数
响应
-
@RespondBody
-
介绍
-
@RestController包含此注解
-
-
封装Result(code,msg,data)
分层解耦
-
三层架构
-
原则
- 单一职责原则
-
图解
-
三层架构
- Controller(控制层)
- 调用Service层,响应请求
- Service(业务逻辑层/业务层)
- 获取Dao数据后对数据进行逻辑处理
- Dao(数据访问层/持久层)
- Controller(控制层)
-
实现步骤
- 先实现Dao层,Service层调用Dao层,Controller层调用Service层
- 面向接口编程
-
-
分层解耦
-
内聚
- 软件中各个功能模块内部的功能联系
-
耦合
- 衡量软件中各个层/模块之间的依赖、关联的程度
-
软件设计原则
- 高内聚低耦合
-
实现分层解耦
-
控制反转(IOC)+ 依赖注入(DI)
-
Bean对象
- IOC容器中创建、管理的对象,成为bean
-
图解
-
-
-
IOC(控制反转)
-
概念
- 对象的创建控制权由程序自身转移到外部(容器)
-
操作
- 加注解@Component
- 将当前类放入IOC容器中管理
- 加注解@Component
-
注意
- 切换bean对象时,只需要去除原来对象的@Component,在新的bean对象增加@Component
- 声明bean的时候,可以通过value属性指定bean的名字,如果没有指定,默认为类名首字母小写。
- 使用以上四个注解都可以声明bean,但是在springboot集成web开发中,声明控制器bean只能用@Controller.
-
衍生注解
-
优化版操作
- Controller层
- 不加注解,@RestController包含了@Controller
- Service层
- 加注解@Service
- Dao层
- 加注解@repository
- Controller层
-
Bean组件扫描
- 以上四大注解要生效需要加@ComponentScan来扫描,但是启动类中@SpringBootApplication中包含@ComponentScan
- 因此,需要将三层架构的类放到 启动类当前包及其子包 中才可以扫描到
-
-
DI(依赖注入)
- 概念
- 容器为应用程序运行时,所依赖的资源
- 操作
- 加注解@Autowired
- 从IOC容器中获取bean对象
- 加注解@Autowired
- 按照类型进行注入
- 解决存在多个相同类型的bean注入
- @Primary
- 在bean对象的类(控制反转的注解)上加注解@Primary
- @Qualifier
- 在@Autowired下面加注解@Qualifier("bean名称")
- @Resource
- Resource(name = "bean名称"),此时不用加@Autowired
- @Primary
- 概念
Mybatis
概念
- 持久层(Dao)框架,简化JDBC的开发
注意点
- 文件结构中java包下只能放源码,而resources包下放配置文件
- 创建文件时,目录分隔不用 . 而用 /
- Ctrl+Alt+L sql语句的格式调整
入门
-
步骤
-
1.创建Springboot工程,数据库表user,实体类User
-
2.引入mybatis的相关依赖并配置mybatis(在properties文件中配置数据库连接信息)
-
3.编写SQL语句(注解/XML)
@Mapper public interface UserMapper {@Select("select * from user")public List<User> list(); }
- 注意Mapper接口中要加注解@Mapper
-
4.单元测试
-
-
在IDEA中配置mysql提示
- 语言注入设置
- 配置数据库源
-
lombok
- 作用
- 减少实体类的代码量
- 需要添加lombok依赖
- 注解@Data
- 提供了@Getter+@Setter+@ToString+@EqualsAndHashCode
- 注解@NoArgsConstruct
- 提供无参构造
- 注解@AllArgsConstruct
- 提供全参构造
- 作用
基础操作(增删改查)
-
注意点
- sql语句占位符 #{}
- 占位符如果出现在' '引号(字符串)内,则要用${ }来占位
- 日志输出
- 在properties文件中配置
-
删除
- @Delete
-
新增
-
@Insert
- 如果有多个参数,则封装成对象传入参数,占位符中是对象的属性值
-
主键返回
-
在@Insert上面增加注解
@Options(useGeneratedKeys=true,keyProperty="id")
-
"keyProperty"
- 主键值封装到对象的哪个属性
-
-
-
更新
- @Update
-
查询
-
@Select
-
有返回值
- 单条
- 实体类对象
- 多条
- 集合
- 单条
-
数据封装
-
实体类属性名 和 数据库查询返回的字段名 一致,mybatis会自动封装,不一致的字段则不会。
-
图解
-
解决方案
-
方案一(不推荐)
-
给字段起别名,使其与实体类属性名一致
-
-
方案二(不推荐)
-
通过注解@Results,手动映射封装
-
-
方案三(强烈推荐)
- 开启mybatis的驼峰命名的自动映射开关
- 用cam关键字来提示
- mybatis.configuration.map-underscore-to-camel-case=true
- 开启mybatis的驼峰命名的自动映射开关
-
-
-
条件查询
-
需求
- 模糊查询、精确查询、范围查询、排序,分页
-
模糊查询
-
法一
like '%${ name }%'
-
法二(推荐)
like concat('%' , #{ name } , '%')
-
-
-
XML映射文件
-
规范
- 同包同名
- XML映射文件和Mapper接口同名,且在相同包下
- namespace属性一致
- XML映射文件中namespace的值为Mapper接口包的全限定名(复制类名的引用)
- sql语句id一致,返回类型一致
- XML映射文件中sql语句的id的值与Mapper接口中的方法一致,返回类型也一致
- 返回类型resultType为单条记录的返回值类型(用全限定名)
- 同包同名
-
步骤
-
创建XML文件(目录分隔)
-
约束
-
上网查
<?xml version="1.0" encoding="UTF-8" ?><!DOCTYPE mapperPUBLIC "-//mybatis.org//DTD Mapper 3.0//EN""http://mybatis.org/dtd/mybatis-3-mapper.dtd">```
-
sql语句按照规范写
-
-
用法
- 简单操作用注解,复杂操作用XML
动态SQL
-
<if>
-
<where>+<if>
- 根据一个或多个字段动态查询
- <where>
- 可以自动去除子句开头的AND和OR
-
<set>+<if>
- 动态更新数据
-
<set>
- 可以自动去除额外的逗号
-
格式
<where><if test="name != null">name like concat('%',#{name},'%')</if><if test="gender != null">and gender = #{gender}order by update_time desc</where>
-
-
<foreach>
-
参数
- collection
- 遍历的集合
- item
- 遍历出来的元素
- separator
- 分隔符
- open
- 遍历开始前拼接的sql片段
- close
- 遍历结束后拼接的sql片段
- collection
-
格式
delete from emp where id in <foreach collection="ids" item="id" separator="," open="(" close=")">#{id}</foreach>
-
sql片段相当于:in (id1 , id2 , id3)
-
注意
-
批量处理数据的数组封装
List<Integer> ids = Arrays.asList(id1,id2,……);
-
-
-
-
<include> + <sql>
- <sql>
- 定义可重复用的sql片段
- <sql id=""></sql>
- 用于Select片段的抽取
- 定义可重复用的sql片段
- <include>
- 通过属性refid,指定包含的sql片段
- < include refid="sql的id" />
- 通过属性refid,指定包含的sql片段
- <sql>
开发案例
开发规范
- REST风格
- http请求操作
- GET查询、POST新增、PUT更新、DELETE删除
- 注解@GetMapper、@PostMapper……
- 代码简化:
- 路径的公共部分抽取到类上
- @RequestMapping("/")
- 路径的公共部分抽取到类上
- 统一响应结果
- Result
- http请求操作
输出结果(用日志的方法)
- 加注解@Slf4j
- log.info("输出内容")
开发流程
- 明确需求
- 接口文档
- 思路分析
- 接口开发
- 思路分析
- 接口文档
接口调试
- postman调试
- 前后端联调
开发常用操作
-
分页查询
- PageHelper插件
-
批量删除
遍历
-
文件上传
-
前端页面三要素
-
type="file"
-
method="post"
-
enctype="multipart/form-data"
-
后端的书写
public Result upload(String username , Integer age, MultipartFile image)
-
-
存储方案
-
本地存储(不推荐用)
-
image.transferTo(File)
-
构造唯一文件名
- UUID.randomUUID().toString()
-
配置上传文件大小限制
-
关键词multipart
#配置单个文件上传大小限制 spring.servlet.multipart.max-file-size=10MB#配置单个请求最大大小的限制(上传多个文件的总大小) spring.servlet.multipart.max-request-size=100MB
-
-
缺点:
- 无法在浏览器中直接访问文件
- 磁盘容量有限
- 磁盘损坏导致的文件丢失
-
-
-
云存储(阿里云oss)(推荐)
- 创建bucket
- 获取AccessKey
- 参照官方SDK编写程序
- 获取AccessKey
- 集成
- 创建阿里云工具类并放入IOC容器管理
- 依赖注入并调用工具类实现文件上传
- 参数配置法
- 配置文件中配置工具类信息来优化代码
- 利用注解@Value("${参数}")
- 配置文件中配置工具类信息来优化代码
- yml配置法(常用)
- 对象/Map集合
- 数组/List/Set集合
- 利用注解@ConfigurationProperties(prefix = "aliyun.oss")
- 注意另建一个properties类
- 创建阿里云工具类并放入IOC容器管理
- 创建bucket
-
-
-
登录功能(登录校验)
-
登录标记
- 会话技术
- 概念
- 会话
- 打开浏览器访问Web服务器资源,会话建立,直到有一方断开,会话结束
- 一次会话可以有多次请求响应
- 会话跟踪
- 服务器识别多次请求是否来自于同一个服务器
- 同一次会话的多个请求中共享数据
- 会话
- 会话跟踪技术
- Cookie
- HTTP请求头:Cookie
- HTTP响应头:Set-Cookie
- 缺点
- Cookie不能跨域
- 跨域: 协议、ip/域名、端口号有一点不同则跨域
- 移动端不能使用Cookie
- 用户可以自己禁用Cookie
- Cookie不能跨域
- Session
- 响应头
- Set-Cookie:JSESSIONID=?
- 请求头
- Cookie:JSESSIONID=?
- 通过JSESSIONID在众多的session对象中找到符合ID的一个
- 缺点
- 服务器集群环境下无法直接使用session
- Cookie的缺点
- 响应头
- 令牌技术(推荐)
- JWT令牌(JSON Web Token)
- Cookie
- 概念
- JWT令牌
- 概念
- 简洁、自包含的格式,将JSON数据格式封装为安全信息
- 采用Base64编码方式
- 组成
- Header(头)
- 签名算法
- 令牌类型
- Payload(有效载荷)
- 自定义信息
- 默认信息
- Signature(签名)
- 防止Token被篡改
- Header+Payload+指定秘钥----> 通过签名算法----->计算而来
- Header(头)
- 登录认证
- 登录成功后生成令牌
- 返回给前端服务器
- 请求响应时: 统一拦截+校验令牌
- 返回给前端服务器
- 登录成功后生成令牌
- JWT-生成
- 引入依赖
- jjwt
- 调用JWT的API
- 利用链式编程
- 引入依赖
- JWT-校验
- 统一拦截时进行
- 概念
- 会话技术
-
统一拦截
-
过滤器(Filter)
-
概念
- 把对资源的请求拦截下来
-
入门
- 定义Filter
- 实现Filter接口,重写方法
- 配置Filter
- 加注解@WebFilter(urlPatterns="/"),配置拦截资源的路径
- 启动类加注解@ServletComponentScan,支持Servlet组件
- 定义Filter
-
拦截
- 具体路径的拦截
- /Path
- 目录拦截
- /dir/*
- 拦截所有
- /*
- 具体路径的拦截
-
执行流程
- 放行之前的逻辑
- 放行
- chain.doFilter()
- 放行之后的逻辑
-
过滤器链
- 配置多个过滤器
- 过滤器执行顺序按类名(字符串)的自然排序
-
登录校验流程
-
-
拦截器
-
概念
- 动态拦截方法调用
- 指定方法的调用前后,根据预设的代码拦截请求
-
入门
- 定义拦截器
- 1.实现HandlerInterceptor接口,重写方法
- 2.@Component放入IOC容器
- 注册拦截器
- 1.实现WebMvcConfigurer接口,重写addInterceptors方法
- 2.注解@Configuration声明配置类
- 3.容器注入@Autowired
- 4.拦截资源(/**代表所有)
- 定义拦截器
-
拦截路径配置
- addPathPattern (拦截路径)
- excludePathPattern(排除拦截路径)
- /*
- 一级路径
- /emps /depts /login
- 一级路径
- /**
- 任意级路径
- /emps /emps/1 /depts/2
- 任意级路径
- /dir/*
- dir下的一级路径
- /dir/**
- dir下的任意级路径
-
执行流程
-
与过滤器的区别
- 过滤器会拦截所有资源,拦截器则拦截进入spring环境中的资源
- 实现接口不一样
-
-
-
-
异常处理
- 全局异常处理器
- @RestControllerAdvice
- @ExceptionHandler(Exception.class)
- 捕获全局异常
- 全局异常处理器
事务管理
@Transactional
- spring事务管理注解
- 在执行多次业务访问的操作的业务方法上添加注解
- 默认运行时异常会回滚
配置文件中开启事务管理日志
rollbackFor
- 所有异常都会出现事务回滚
- @Transactional(rollbackFor = Exception.class)
propagation
- 事务传播行为
- 事务属性
- REQUIRED
- REQUIRES_NEW
- 不希望事务之间相互影响时可使用
AOP
概念
- Aspect Oriented Programming(面向切面编程)
- 面向方法编程
本质
- 动态代理
入门
-
导入依赖
-
定义AOP类:加注解@Aspect
-
代理哪些方法:加注解@Around
-
切入点表达式
-
示例
@Around("execution(* com.ezan.service.*.*(..))")
-
核心概念
- 连接点(joinPoint)
- 可以被AOP控制的方法
- 通知(Advice)
- 这些方法要实现的共性功能
- 切入点(PointCut)
- 匹配连接点的条件,指明AOP要控制哪些方法
- 切面(Aspect)
- 通知+切入点
- 目标对象(Target)
- 通知所应用的对象
通知
- 通知类型
- @Around
- 其他类型通知
- @Before
- @After
- ……
- 通知顺序
- 法一
- 与类名的命名自然排序有关
- 法二
- 加注解@Order(数字)
- 数字越小越先执行
- 加注解@Order(数字)
- 法一
切入点表达式
- 抽取切入点表达式
- @PointCut("execution")
- public void pt(){}
- @PointCut("execution")
- 通配符号
- *
- 单个独立的任意符号
- eg :一个层级的任意包
- 单个独立的任意符号
- ..
- 多个连续的任意符号
- eg:任意个层级的任意包
- 多个连续的任意符号
- *
- execution(访问修饰符 返回值 包名.类名.方法名(方法参数) throws 异常)
- 访问修饰符、包名类名、异常可以省略
- @annotation(某个注解的全类名) 【推荐】
- 通过注解的方式来匹配切入点方法
- 作用于 标识了某个注解的方法上(某个注解需要自定义)
连接点
- 获取连接点信息
SpringBoot原理
配置优先级
- 配置属性
- 命令行参数(--)
- java系统属性(-D)
- 配置文件 (优先级从高到低 )
- properties
- yml
- yaml
Bean管理
-
获取bean
-
获取名称
applicationContext.getBean("name")
-
获取类型
applicationContext.getBean(value)
-
获取类型和mingc
applicationContext.getBean("name",value)
-
-
bean作用域
- singleton
- 单例
- prototype
- 非单例
- 注解@Lazy
- 延迟初始化bean实例对象,当第一次使用bean时才初始化
- 注解Scope("作用域")
- 配置类的作用域
- singleton
-
第三方bean
- 注解@Bean
- 声明第三方bean
- 注意:第三方bean对象(非自定义)无法用@Component只能用其衍生注解@Bean
- 如果第三方bean还需要依赖其他的bean对象,则直接在bean定义方法中设置形参(其他的bean对象作为方法形参)
- 第三方bean集中管理
- 管理第三方bean对象,需集中分类配置,创建配置类,用@Configuration声明配置类
- 注解@Bean
SpringBoot原理
-
起步依赖
- 原理
- maven的依赖传递
- 原理
-
自动配置
- 原理
- @Import 导入
- 普通类
- 配置类
- ImportSelector 接口实现类
- String[] selectImports()
- 封装一些类的全类名
- String[] selectImports()
- @EnableXxxx注解(推荐)
-
源码跟踪
- @SpringBootApplication
- @EnableAutoConfiguration
- @Import
-
String[] selectImports()
-
下面这个文件中自动配置了一些类的全类名
- @Bean
- 由bean注解声明一个个bean对象
- @Conditional
- 满足一定条件后才会注入IOC容器中(条件装配)
- 衍生的大量子注解- @ConditionalOnClass(name="全类名")
- 判断环境中是否存在该全类名的类(是否存在字节码文件)
- @ConditionalOnMissingBean
- 不存在该类型的bean,才会将bean加入IOC容器
- @ConditionalOnProperty(name="" , havingValue="")
- 配置文件中是否存在对应的属性与值,存在才会加入IOC容器
- @ConditionalOnClass(name="全类名")
- @Bean
-
-
- @Import
- @EnableAutoConfiguration
- @SpringBootApplication
-
自定义starter
- starter模块
- 依赖管理功能
- 引入autoconfigure依赖
- autoconfigure模块
- 自动配置功能
- 自定义自动配置类,并且放入自动配置文件中(META-INF/spring/xxxx.imports)
- starter模块
后端技术总结
SpringBoot开发框架
概念区别
-
Javaweb
- 过滤器、会话技术(Cookie、Session)
-
解决方案
- JWT,阿里云OSS
-
SSM框架
- SpringMVC
- 拦截器、全局异常处理、接受请求、响应数据
- Spring framework
- IOC、DI、AOP、事务管理
- Mybatis
- 在DAO层操作数据库
- SpringMVC
-
SpringBoot
概念一览图
- SpringMVC是Spring framework的一种
思维导图版本
XMind文件链接:
https://github.com/Ezan-p/JavaWeb/blob/main/JavaWeb.xmind
声明
- 基于“黑马程序员JavaWeb视频课程”的个人学习总结。