REST风格
- GET:查询用户
- POST:新增用户
- POT:修改用户
- DELETE:删除用户
前后端交互统一的响应结果
记录日志
- @SLf4j
注解:
- @PathVariable:获取路径的参数
- @ResponseBody :方法的返回值直接作为 HTTP 响应的正文返回,将响应的实体类转为json发送给前端
- @RequestBody :将request的json转化为实体类给后端
- @RequestParam :请求参数,可设置默认值
- DateTimeFormat(patten = " ")指定传入进来的时间格式
页面的分页查询
- 1.接受分页参数 page pageSize
- 1.获取查询的数据
- 2.数据的总数
- 返回总记录数以及当前页数据列表
- mapper:
- service:
xml:
- 同包同名
- namespace与mapper全类名保存一致
分页条件查询
-
配置xml
-
标签 :根据里面条件判断是否自动生产where子句 自动去除第一个条件多余的and /or
-
分页插件:PageHelper
- 引入依赖
- Mapper
- service
接受文件
- MultipartFile image//此变量名需与前端一致
- 需存储文件
- 使用uuid区分文件的不同
- uuid:通用唯一识别
- MultipartFile常见方法
批量删除
- collection :要遍历的集合
- item :遍历出来的每一个元素
- separator :分隔符
- open:遍历之前拼接什么
- close:遍历之后拼接什么
存文件到云服务
- 映入SDK依赖
- 安装OSS Java SDK_对象存储(OSS)-阿里云帮助中心
配置文件
- @Value注解通常用于外部配置的属性注入,@Value("${配置文件中的key}")
- yml配置文件
- 层级结构更清晰,简介,数据为中心
- 基本语法:
- 大小写敏感
- 数值前边必须有空格,作为分隔符
- 使用缩进表示层级关系,不允许使用tab,只能用空格(idea中自动将tab转化为空格
- 缩进空格数目不重要,只要相同层级的元素左侧对齐即可
- '#' 表示注解
- 常见格式:
- @ConfigurationProperties
- 创建类来注入属性
- 引入依赖 让配置文件的时候有提示
@Value与@ConfigurationProperties的区别:
- 相同点:都是用来注入外部配置的属性的
- 不同点:
- @Value只能一个一个的进行外部属性注入
- @ConfigurationProperties可以批量的将外部属性配置到bean对象的属性中
登录功能的开发
- 登录
- 验证username与password在数据库中的数据即可
- 登录校验
- 登录标记:登录成功后,每一次请求,都可以获取到该标记
- 同一拦截:过滤器Filter 拦截器Interceptor
登录校验
- 会话技术
- 会话:用户打开了浏览器,访问web服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应
- 会话跟踪:一种维护浏览器的方法,服务器需要识别多次请求是否来自于同一个浏览器,以便在同一次会话的多次请求间共享数据。
- 会话跟踪方案:
- 客户端会话跟踪技术:Cookie
- 服务端会话跟踪技术:Session
- 令牌技术
Cookie
- 优点:HTTP协议中支持的技术
- 缺点:移动端APP无法使用Cookie
- 不安全,用户可以自己禁用Cookie
- Cookie不能跨域
- 跨域区分三个维度:协议,IP/域名,端口
Session
- 往cookie中存sessionId,拿到id后去往服务器解析出来用户信息
- 优点:存储在服务端,安全
- 缺点:服务器集群环境下无法直接使用Session
- Cookie的缺点
令牌
- 优点:支持pc端,移动端
- 解决集群环境下的认证问题
- 减轻服务器存储压力
- 缺点:需要自己实现
JWT
过滤器(Filter)
- 可以把对资源的请求拦截下来,从而实现一些特殊的功能
- 过滤器一般完成一些通用的操作,:比如登录校验、同一编码处理、铭感字符处理等
- 入门:
- 1.定义Filter:定义一个类,实现Filter接口,并重写所有方法
- 2.配置filter:Filter加上@WebFilter注解,配置拦截资源的路径。引导类上加@ServletComponentScan开启Servlet组件支持
- 执行流程
- 放行访问资源,访问完毕,还会回到Filter中
- 回到Filter中后,执行放行之后的逻辑
- 拦截路径:
- 拦截具体路径: urlPatterns = "/login"
- 目录拦截: urlPatterns = "/emps/*" 拦截访问/emps下的所有资源
- 拦截所有:urlPatterns = "/*"
- 过滤器链:一个web应用可以配置多个过滤器,多个过滤器形成一个过滤器链
- 多个过滤器会将本次放行到下一个过滤器 (根据类名字母的顺序)
- 实现:
拦截器(Interceptor)
- 类似过滤器,spring提供,用来动态拦截控制器方法的执行
- 作用:拦截请求,在指定方法调用后,根据业务需要执行预先设定的代码
- 入门:
- 定义拦截器,实现HandlerInterceptor接口
- 配置拦截器
- 拦截路径:
- 根据需求拦截不同的拦截路径
- 执行流程:
异常处理
- 全局异常处理器
事务管理&AOP
- 事务是操作的集合,是不可分割的单位,要么同时成功,那么同时失败
- 操作(MySQL中):
- 开启事务(一组操作开始前,开启事务):start transaction / begin
- 提交事务(这组操作全部完成后,提交事务) :commit
- 回滚事务(中间任何一个操作出现异常,回滚事务):rollback
- 删除部门,同时删除部门下的所有员工
- springboot中:
- @Transactional :开启事务
- 交给servive层的方法,类上,接口上
- 作用:将当前方法交给spring进行事务管理,方法执行之前开启事务,执行完毕提交事务;出现异常,回滚事务
- 还可在yml配置文件中开启事务管理日志
- @Transactional :开启事务
@Transactional属性
- rollbackFor
- 默认情况下,只有出现RuntimeException才回滚异常。
- rollback属性用于控制出现何种异常类型,回滚事务
- propagation 传播行为
- 事务传播行为:指的是当一个事务方法被另一个事务方法调用时,这个事务方法应该如何进行事务控制
AOP(springAOP)
-
Aspect Oriented Programming (面向切面编程,面向方面编程) :面向特定方法编程
-
实现:
- 动态代理是它的最主流的实现。
-
添加依赖
-
创建类,加上注解:@Component @Aspect//AOP类
-
场景:记录操作日志 权限管理 事务管理
-
优势:代码无侵入 减少重复代码 提高开发效率 维护方便
-
核心概念:
- 连接点:JoinPoint,可以被AOP控制的方法(暗含方法执行时的相关信息)
- 通知:Advice,指哪些重要的逻辑,也就是共性功能(最终体现为一个方法)
- 切入点:PointCut,匹配连接点的条件,通知仅会在切入点方法执行时被应用
- 切面:Aspect,描述通知与切入点的对应关系(通知+切入点)
- 目标对象:Target,通知所应用的对象
通知类型
- 1.@Around :环绕通知,此注解的通知方法在目标方法前,后都被执行
- 2.@Before :前置通知,此注解标注通知的方法在目标方法前被执行
- 3.@After :后置通知,此注解标志的通知方法在目标方法后被执行,无论是否有异常都会被执行
- 4.@AfterReturning:返回后通知,此注解标注的通知方法在目标方法后被执行,有异常不会执行
- 5.@AterThrowing :异常后通知,此注解标志的通知方法发生异常后执行
- 注:环绕通知需要自己调用 ProceedingJoinPoint.proceed()来让原始方法执行,其他通知不需要考虑目标方法执行
- 返回值必须指定为Object,来接受原始方法的返回值
- 抽取切入点表达式
通知顺序
- 当多个切面的切入点都匹配到了目标方法,目标方法运行时,多个通知方法都会被执行。
- 1.通知顺序和类名顺序一直
- 2.@Order(数字)加在切面类上控制顺序
- 目标方法前的通知:数字小的先执行
- 目标通知后的通知:数字小的后执行
切入点表达式
- 决定项目中哪些项目需要加入通知
- 常见形式:
- 1.execution():根据方法的签名来匹配
- 2.@annotation():根据注解匹配
- execution():
- 包名类名不省略
- @annotation(),用于匹配标识特定注解的方法
- 定义注解
- 在所需要的方法上加注解
- 指定log的全类名即可