创建一个新类添加@RestControllerAdvice注解,该注解用于定义全局异常处理类
@RestControllerAdvice //@RestControllerAdvice = @ControllerAdvice + @ResponseBody
使用@ExceptionHandler注解定义异常处理方法123456789101112131415@RestControllerAdvice //@RestControllerAdvice = @ControllerAdvice + @ResponseBodypublic class GlobalExceptionHandler { /** * 这个注解是指定处理那些异常 * @param ex * @return */ @ExceptionHandler(Exception.class) public Result ex(Exception ex){ ex.printStackTrace(); // ...
简介用于验证接口传入参数的框架,就是判断某个参数是否为空,是否为空字符串,是否为空集合等。
常用于判断手机号 ,身份证号码,用户名,密码等。就是一个类似掩码的东西。
Maven添加依赖1234<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId></dependency>
使用
在Controller类上添加@Validated注解在参数前面添加@Pattern注解,然后参数regexp属性指定正则表达式即可
123public Result register(@Pattern(regexp = "^\\S{5,16}$") String username,@Pattern(regexp = "^\\S{5,16}$") String password) ...
引用站外地址
cn.vuejs.org
开始练气使用CDN载入
还是建议把js文件下载到本地使用
全局构建版本我的理解是:在全局中有一个Vue对象,使用赋值语句,会自动把Vue对象里相同的属性值赋给用户,这样就可以不用在每个Vue语法前加Vue关键字
1234567891011121314151617<script src="https://unpkg.com/vue@3/dist/vue.global.js"></script><div id="app">{{ message }}</div><script> const { createApp, ref } = Vue// 可以使用 Vue.createApp( ...
创建launch.json文件在.vscode文件下创建launch.json文件
在configurations里面进行配置,每一个{}对象对应一个调试任务
右下角可以快捷添加配置模板
把鼠标悬停在key上,会出现提示
完整配置Hexo的调试文件1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253{ "version": "0.2.0", "configurations": [ { "type": "node", "request": "launch", "name": "Launch Hexo Server", "runtimeExecutable": ...
AOP概述AOP:Aspect Oriented Programming,即面向切面编程,其实就是面向特性方法编程。
AOP应用场景
动态代理的主要作用是在运行时创建一个符合特定接口的对象,这个对象可以拦截接口方法的调用,并在调用实际方法前后添加额外的处理逻辑。
Spring AOP导入依赖:在pom.xml文件中导入依赖1234<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-aop</artifactId></dependency>
编写AOP程序:针对于特定方法根据业务需要进行编程使用@Component让springboot管理,使用@Aspect注解成为切面类
12345678910111213141516@Component@Aspectpublic class TimeAspect { /** * ProceedingJoinPoin ...
什么是事务事务是一组操作的集合,它是一个不可分割的工作单位,这些操作要么同时成功,要么同时失败。
操作顺序
开启事务(一组操作开始前,开启事务):start transaction / begin
提交事务(这组操作全部成功后,提交事务):commit
回滚事务(中间任何一个操作出现异常,回滚事务):rollback
Spring事务管理
注解:@Transactional
位置:业务(service)层的方法上、类上、接口上
作用:将当前方法交给spring进行事务管理,方法执行前,开启事务,方法执行后,提交事务,出现异常,回滚事务
1234logging: # 开启事务管理日志 level: org.springframework.jdbc.support.jdbcTransactionManager: debug
rollbackFor默认情况下,只有出现RuntimeException才回滚异常。rollbackFor属性用于控制出现何种异常类型,回滚事务。
例子:
1234567@Transactional(rollbackFor = Excepti ...
定义一个全局异常处理器123456789@RestControllerAdvice //@RestControllerAdvice = @ControllerAdvice + @ResponseBodypublic class GlobalExceptionHandler { @ExceptionHandler(Exception.class) // 指定处理那些异常 public Result ex(Exception ex){ ex.printStackTrace(); return Result.error("对不起,操作失败,请联系管理员"); }}
会话技术会话技术:在服务器端创建一个与客户端浏览器相关的数据,用来记录客户端浏览器的访问信息。
会话:用户打开浏览器,访问Wb服务器的资源,会话建立,直到有一方断开连接,会话结束。在一次会话中可以包含多次请求和响应。会话跟踪:一种维护浏览器状态的方法,服务器需要识别多次请求是否来自于同一浏览器,以便在同一次会话的多次请求间共享数据。
会话跟踪方案:
客户端会话跟踪技术:Cookie
服务器端会话跟踪技术:Session
令牌技术
Cookie和Session都是传统的会话技术
Cookie优点:
HTTP协议中支持的技术
缺点:
存储空间有限,通常情况下不能存储二进制数据
不能跨域访问
不安全,用户可以自己禁用Cookie
Session优点:
部署在服务器,安全
缺点:
服务器集群环境下无法直接使用Session
Cookie的缺点
JWT令牌技术JWT令牌技术:JSON Web Token,是一种用于在网络应用环境间传递声明的开放标准(RFC 7519)。
全称称:JSON Web Token(https://jwt.io/)
定义了一整简洁的、自包含的格 ...
简介
是一款优秀的持久层框架,用于简化JDBC,原名iBatis
源码托管在Github,Mybatis
一般都是在Spring Boot中直接使用
SpringBoot数据库连接配置
1234spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/mybatisspring.datasource.username=rootspring.datasource.password=1234
• 使用@Mapper注解自动配置接口,接口方法再使用@Select('select * from user')注解,让IOC自动创建实现类的时候自动实现方法• 数据库连接池
是一个容器,负责分配、管理数据库连接(Connection)
允许应用程序重复使用一个现有的数据库连接,而不是再重新建立一个
释放空闲时间超过最大空闲时间的连接,来避免因为没有释放连接而引起的数据库连接遗留
在pom文件中直接引入连接池的依赖, ...
SpringBoot配置文件优先级:yaml = yml > properties
常用的配置1234567891011121314151617181920spring: # 数据库配置 datasource: driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://localhost:3306/nodaoli username: nodaoli password: nodaoli servlet: # 文件上传配置 multipart: # 单个文件最大上传大小 max-file-size: 10MB # 多个文件最大上传大小 max-request-size: 100MBmybatis: configuration: # 设置Mybatis的日志功能 log-impl: org.apache.ibatis.logging.stdout.StdOutImpl # 启用Mybatis的自动驼峰大写功 ...
Cloudflare R2是一个基于Amazon S3 API的云存储服务,它允许您存储和检索对象,如图像、视频、音频和文档。
Cloudflare R2使用Amazon S3 API,因此您可以使用任何Amazon S3 SDK或工具来与R2进行交互。
引入Maven依赖
1234<dependency> <groupId>software.amazon.awssdk</groupId> <artifactId>s3</artifactId><version>2.27.13</version>
123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051import lombok.extern.slf4j.Slf4j;import org.springframework.stereotype.Component;import org.springframework ...
application.properties配置1234567891011121314151617# 添加数据库spring.datasource.driver-class-name=com.mysql.cj.jdbc.Driverspring.datasource.url=jdbc:mysql://localhost:3306/nodaolispring.datasource.username=nodaolispring.datasource.password=nodaoli# 添加MyBatis的日志,可以使用@Slf4j注解,log.info()静态方法输出日志mybatis.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl# 添加MyBatis的驼峰命名自动转换mybatis.configuration.map-underscore-to-camel-case=true# 配置单个文件的最大上传大小spring.servlet.multipart.max-file-size=10MB# 配置多 ...
当软件可执行文件当前目录中新建一个名为data的文件夹,便携模式会将此文件夹将作为基础启动文件夹,作为Home Directory
在不同系统上,可执行文件位置有所不同:
Windows:安装目录中Clash for Windows.exemacOS:软件包目录中/Contents/MacOS/Clash for Windows
当文件夹存在时,重启软件即可进入便携模式,此时软件将会读取/写入数据至该目录
Spring
未读个人理解:注入是在一个配置文件中设置类,对象的属性值。
通俗理解:
原生注入就是在源码封装的类中使用set和get方法
Spring bean注入就是在Spring配置文件.xml中的<bean>标签,使用<property>设置属性值
原生set注入方法我们封装了一个类,创建对象的时候,通过原生的set和get方法设置访问对象
或者通过构造器注入(也就是自动构造器)
1234567891011121314151617181920212223242526272829303132333435363738394041class book { private String bname; private String bauthor; public book() { } public book(String bname, String bauthor) { this.bname = bname; this.bauthor = bauthor; } ...
概念Spring 通过 IoC 容器来管理所有 Java 对象的实例化和初始化,控制对象与对象之间的依赖关系。
我们将由 IoC 容器管理的 Java 对象称为 Spring Bean,它与使用关键字 new 创建的 Java 对象没有任何区别。
bean定义信息:我在配置文件中(xml)中配置好我需要的类的信息(我需要什么对象),把这个信息交给IoC容器(告诉IOC我要的对象),让IOC给我返回
DI(Dependency Injection):依赖注入,依赖注入实现了控制反转的思想
指Spring创建对象的过程中,将对象依赖属性通过配置进行注入
获取Bean的三种方式
1234567891011// id获取User user1 = (User) context.getBean("user");System.out.println("id获取"+user1);// 类型(class)获取User user2 = context.getBean(User.class);System.out.println("类型获取" ...
在maven中导入依赖12345678910<dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <version>2.19.0</version></dependency><dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-slf4j2-impl</artifactId> <version>2.19.0</version></dependency>
配置文件一般maven项目放在resources目录下
12345678910111213141516171819202122232425262728293031323334353637 ...
类似JavaScript的DOM操作
可以理解为通过反射把一个类的属性,方法,拆分出来,作为一个对象来使用
例如拆分成
Class对象:代表类的类型信息,可以用来获取类的静态属性,创建对象实例等。
Field对象:代表类中的字段(成员变量),可以用来获取或设置字段的值。
Method对象:代表类中的方法,可以用来调用方法。
Constructor对象:代表类的构造器,可以用来创建对象实例。
假设您有一个名为Person的类,其中有一个名为name的字段和一个名为sayHello的方法。使用反射,您可以这样做:
1234567891011121314151617181920212223242526272829303132333435363738394041import java.lang.reflect.Field;import java.lang.reflect.Method;public class ReflectionExample { public static void main(String[] args) { try ...
问题
为什么反射加载不知道的类,在使用Class.forName()方法时,需要指定一个类的名称,那这不就是知道了类吗?
当我们使用new关键字创建对象时,我们的代码必须知道具体的类,编译器会在编译时检查这个类是否存在,这种方式是静态的,在编译时就需要确定所有的类和对象。但是,当我们使用反射时,我们可以在程序运行时才决定使用哪个类,这样程序就可以更加灵活地响应在编译时无法预知的变化。
使用Class.forName()的典型场景包括:
插件系统:应用程序可以加载不同的插件,而这些插件的具体类在编译时是不确定的。
配置驱动的应用程序:类的名称可以从配置文件中读取,程序根据配置来加载对应的类。
动态代理:在运行时创建接口的代理实例,这些接口的实现类是在运行时确定的。
数据库驱动加载:JDBC中经常使用Class.forName()来动态加载数据库驱动。
在这些情况下,尽管我们使用Class.forName()时知道要加载的类名,但这个类名很可能是用户输入、配置文件、或者网络传输等在程序运行时才能确定的信息,而不是在编写代码时就能固定的。因此,反射提供了一种运行时动态处理类的机制,增 ...