SpringBoot概要
SpringBoot介绍
使用 “习惯 优于配置” 的理念项目快速运行起来。
SpringBoot是整合Spring技术栈的一站式框架
SpringBoot是简化Spring技术栈的快速开发脚手架
Spring Boot 并不是对 Spring 功能上的增强,而是提供了一种快速使用 Spring 的方式
SpringBoot优点
创建独立Spring应用
内嵌web服务器
自动starter依赖,简化构建配置
自动配置Spring以及第三方功能
提供生产级别的监控、健康检查及外部化配置
无代码生成、无需编写XML
SpringBoot缺点
人称版本帝,迭代快,需要时刻关注变化
封装太深,内部原理复杂,不容易精通
时代背景-微服务
微服务是一种架构风格
一个应用拆分为一组小型服务
每个服务运行在自己的进程内,也就是可独立部署和升级
服务之间使用轻量级HTTP交互
服务围绕业务功能拆分
可以由全自动部署机制独立部署
去中心化,服务自治。服务可以使用不同的语言、不同的存储技术
Spring Boot 核心配置
Spring Boot配置文件分类
SpringBoot是基于约定的,所以很多配置都有默认值,但如果想使用自己的配置替换默认配置的话,就 可以使用 application.properties或者application.yml(application.yaml)进行配置
#- SpringBoot提供了2种配置文件类型:properteis和yml/yaml #- 默认配置文件名称:application #- 在同一级目录入如果三类文件共存,优先级为:properties > yml > yaml
application.properties
语法结构 :key=value
server.port=8081
application.yml
语法结构 :key:空格 value (冒号后面必须要有空格)
#key: value server: port: 8081 servlet: context-path: /demo01
YAML概述
YAML是一种直观的能够被电脑识别的的数据数据序列化格式
YML文件是以数据为核心的,比传统的xml方式更加简 洁。 YAML文件的扩展名可以使用.yml或者.yaml。
YAML基础语法
大小写敏感
数据值前边必须有空格,作为分隔符
使用缩进表示层级关系
缩进时不允许使用Tab键,只允许使用空格(各个系统 Tab对应的 空格数目可能不同,导致层次混乱)。
缩进的空格数目不重要,只要相同层级的元素左侧对齐即可
"#"表示注释,从这个字符一直到行尾,都会被解析器忽略。
数据格式
字面量:普通的值 [ 数字,布尔值,字符串 ]
boolean: TRUE #TRUE,true,True,FALSE,false,False均可 float: 3.14 #6.8523015e+5 #支持科学计数法 int: 123 #0b1010_0111_0100_1010_1110 #支持二进制、八进制、十六进制 string: HelloWorld #字符串可以直接书写
数组:一组按次序排列的值( List、set )
address: - 西安 - 上海 - 杭州 # 行内写法 commpany: [阿里巴巴,华为,腾讯,字节跳动]
对象、Map(键值对)
person1: name: 刘老师 age: 39 sex: 男 # 行内写法 person2: {name: 王老师,age: 34,sex: 男} #对象数组格式一 users1: - name: Tom age: 4 - name: Jerry age: 5 #对象数组格式二 users2: - name: Tom age: 4 - name: Jerry age: 5 #对象数组缩略格式 users3: [ { name:Tom,age:4 },{ name:Jerry,age:5 } ]
YAML:参数引用
name: 猫咪 person: name: 小明 pet: ${name} # 引用上边定义的name值 age: ${random.uuid} # 配置文件占位符,随机uuid
YAML:小结 1
配置文件类型
properties:和以前一样 (设置文件的语言编码UTF-8)
yml/yaml:注意空格
2) yaml:简洁,以数据为核心
基本语法
大小写敏感
数据值前边必须有空格,作为分隔符
使用空格缩进表示层级关系,相同缩进表示同一级
数据格式
对象
数组: 使用 " - "表示数组每个元素
纯量
参数引用 ${key}
读取配置内容
支持方式:
逐个注入:@Value
加载指定的配置文件@PropertySource :加载指定的配置文件;
批量注入:
方式一:@ConfigurationProperties
@ConfigurationProperties作用:将配置文件中配置的每一个属性的值,映射到这个组件中; 告诉SpringBoot将本类中的所有属性和配置文件中相关的配置进行绑定 参数 prefix = “person” : 将配置文件中的person下面的所有属性一一对应
Environment类
直接在测试类中装配开发模式类辅助获取key对应value数据
System.out.println(env.getProperty("person1.name"));
@Value和@ConfigurationProperties区别
JSR303校验注解
添加依赖,导入spring-boot-starter-validation启动器
<dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency>
在实体类需要校验的成员字段(Field)上,添加校验注解。
在Controller控制器的校验参数前,使用@Valid注解开启校验,使用BindingResult 绑定校验结果
当校验有异常时,页面显示数据不合法,并且在控制台会显示输出信息
JSR303校验注解的分类
值校验:
// 被注解的元素必须为null
@Null(message = "必须为null")
// 被注解的元素必须不为null
范围校验
长度校验:
格式校验:
@NotNull(message = "必须不为null")
// 校验注解的元素值不为空(不为null、去除首位空格后长度为0),类型为String
@NotBlank(message = "必须不为空")
// 校验注解的元素值不为null且不为空(字符串长度不为0、集合大小不为0),类型为CharSequence、
Collection、Map、Array
@NotEmpty(message = "必须不为null且不为空")
// 被注解的元素必须为true,并且类型为boolean
@AssertTrue(message = "必须为true")
// 被注解的元素必须为false,并且类型为boolean
@AssertFalse(message = "必须为false")
范围校验
// 被注解的元素其值必须大于等于最小值,并且类型为int,long,float,double
@Min(value = 18, message = "必须大于等于18")
// 被注解的元素其值必须小于等于最小值,并且类型为int,long,float,double
@Max(value = 18, message = "必须小于等于18")
// 校验注解的元素值大于等于@DecimalMin指定的value值,并且类型为BigDecimal
@DecimalMin(value = "150", message = "必须大于等于150")
// 校验注解的元素值小于等于@DecimalMax指定的value值 ,并且类型为BigDecimal
@DecimalMax(value = "300", message = "必须大于等于300")
// 校验注解的元素值在最小值和最大值之间,并且类型为BigDecimal,BigInteger,CharSequence,
byte,short,int,long。
@Range(max = 80, min = 18, message = "必须大于等于18或小于等于80")
// 被注解的元素必须为过去的一个时间,并且类型为java.util.Date
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @Past(message = "必须为过去的时
间")
// 被注解的元素必须为未来的一个时间,并且类型为java.util.Date
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") @Future(message = "必须为未来的时
间")
长度校验:
// 被注解的元素的长度必须在指定范围内,并且类型为String,Array,List,Map
@Size(max = 11, min = 7, message = "长度必须大于等于7或小于等于11")
// 校验注解的元素值长度在min和max区间内 ,并且类型为String
@Length(max = 11, min = 7, message = "长度必须大于等于7或小于等于11")
格式校验:
// 校验注解的元素值的整数位数和小数位数上限 ,并且类型为float,double,BigDecimal。
@Digits(integer=3,fraction = 2,message = "整数位上限为3位,小数位上限为2位")
// 被注解的元素必须符合指定的正则表达式,并且类型为String
@Pattern(regexp = "\\d{11}",message = "必须为数字,并且长度为11")
// 校验注解的元素值是Email,也可以通过regexp和flag指定自定义的email格式,类型为String
@Email(message = "必须是邮箱")
Controller统一异常处理
@ControllerAdvice:统一为Controller进行"增强"
@ExceptionHandler : 异常处理
多环境切换profile
命名语法:
例如:application-环境简称.properties/yml
application-dev.properties/yml 开发环境
application-test.properties/yml 测试环境
application-pro.properties/yml 生产环境
profile激活方式
spring: profiles: active: 环境简称 test/dev/pro 从默认的8080端口转换到指定的配置文件中的接口
Spring MVC
1.请求处理
📖@RequestMapping(/user)
意义:处理用户的请求,相似于doget与dopost
位置: 类上:一级目录 方法:二级目录 例如:user/save user/delete student/save student/delete
http://localhost:8080/user/demo2?name=123&age=99
属性: value = "",path = "" 表示请求路径
method=常量,此请求的类型(get,post),若不设置则此请求适配所有的请求方式
@RequestMapping(value="/show1",method ={RequestMethod.POST})
params = "" 限制请求参数,例如:params={"msg1","msg2"}表示请求路径中必须携带参数名 为msg1与msg2的参数 @RequestMapping(value="/show2",params = {"msg1=aa","msg2=bb"})
注意:1.超链接默认发送的是get请求 2.所有请求所携带的参数格式均为:key = value
📖@DeleteMapping删除
📖@PutMapping 修改
📖@GetMapping 查询
2.参数绑定
springMVC请求参数的绑定 绑定的机制:SpringMVC 绑定请求参数的过程是通过把表单提交请求参数,作为控制器中方法参数进行绑定的
📖基本类型参数
包括基本类型和 String 类型
📖POJO类型参数
包括实体类,以及关联的实体类
输出结果:
📖数组和集合类型参数
包括 List 结构和 Map 结构的集合(包括数组)
输出结果:
📖使用 ServletAPI 对象作为方法参数
HttpServletRequest HttpServletResponse HttpSession java.security.Principal Locale InputStream OutputStream Reader Writer
📖参数绑定使用要求
1.发送请求中携带数据的key与方法参数的name必须一致 2.数据类型合法
3.常用注解
📖@RequestParam
作用: 把请求中指定名称的参数给控制器中的形参赋值。 如果页面标签名称和方法参数名称不一致,可以使用此注解实现 属性: name属性:设置参数名称 defaultValue属性:设置默认值 required属性:设置是否为必传
📖@RequestBody
作用: 用于获取"请求体"内容。直接使用得到是 key=value&key=value... 结构的数据,并可以转换为对象 属性: required:是否必须有请求体。默认值是:true。
前后端分离 @RequestBody可以将json ===》 javaBean @ResponseBody可以将javaBean ===》 json返回给该方法的请求者 注意: 1.前端不能使用GET方式提交数据,GET方式无请求体
📖@PathVaribale
作用: 用于绑定 url 中的占位符。例如:请求 url 中 /delete/{id}, 这个{id}就是 url 占位符。url 支持占位符是 spring3.0 之 后加入的。是 springmvc 支持 rest 风格 URL 的一个重要标志 属性: value:用于指定 url 中占位符名称。 required:是否必须提供占位符。
Restful是一种软件架构风格、设计风格,而不是标准,只是提供了一组设计原则和约束条件。 主要用于客户端和服务器交互类的软件,基于这个风格设计的软件可以更简洁,更有层次, 更易于实现缓存机制等。
Restful风格的请求是使用“url+请求方式”表示一次请求目的的,HTTP 协议里面四个表示操作方式的动词如下:
GET:用于获取资源
POST:用于新建资源
PUT:用于更新资源
DELETE:用于删除资源
例如: 新增 POST http://localhost:8080/user/用户名/用户密码/用户性别 查询 GET http://localhost:8080/user/用户ID 删除 delete http://localhost:8080/user/用户ID 修改 put http://localhost:8080/user/用户ID/用户名/用户密码/用户性别 localhost:8080/login?uname=王老师&upwd=123 localhost:8080/login/王老师/123
📖@RequestHeader
作用: 用于获取请求消息头信息。 属性: value:提供消息头名称 required:是否必须有此消息头
4.数据传递
📖返回值为:字符串
一、直接跳转到页面 二、重定向 三、转发 四、通过session获取实体类中的值
路径:localhost:8080/string/...
📖返回值为:Json
@ResponseBody 对象====>json 位置:1.类 2.方法 @RequestBody json====>对象 位置:方法参数 @RestController = @Controller + @ResponseBody
路径:localhost:8080/json/...
5.文件上传
1.导入坐标
2.画页面
注册Servlet三大组件 Servlet/Filter/Listener
ServletRegistrationBean 注册自定义
Servlet FilterRegistrationBean 注册自定义
Filter ServletListenerRegistrationBean 注册自定义Listener
**如果使用传统 @WebFilter...实现注册也可以** **条件:** 1. **一定是自定义组件** 2. **启动类添加@ServletComponentScan**
监听器Listener
监听器可用于监听应用程序生命周期事件,而拦截器和过滤器则主要用于拦截请求和响应;
监听器是一种组件,它可以监听应用程序中发生的各种事件,并在某个事件触发时执行代码。
@WebListener public class MyListener implements ServletContextListener { @Override public void contextInitialized(ServletContextEvent sce) { ServletContextListener.super.contextInitialized(sce); System.out.println("-------------MyListener inited !"); } @Override public void contextDestroyed(ServletContextEvent sce) { ServletContextListener.super.contextDestroyed(sce); System.out.println("----------------MyListener Destroy !"); } }
过滤器Filter
过滤器是一种用于对请求和响应实施过滤的组件。它可以拦截 Web 应用程序中的请求,并允许我们在该请求被路由到控制器前或响应被发送到客户端前修改它们。在 Spring Boot 中,我们可以通过实现 Filter
接口来编写过滤器。
过滤器是 Java Servlet 的标准规范组件,而监听器和拦截器则是 Spring Boot 的扩展组件。
@WebFilter(urlPatterns = {"/*"}) public class MyFilter implements Filter{ public void doFilter(ServletRequest request, ServletResponse response, FilterChain chain) throws IOException, ServletException { System.out.println("============请求过滤"); request.setCharacterEncoding("utf-8"); //分水岭 chain.doFilter(request, response); response.setCharacterEncoding("utf-8"); System.out.println("============响应过滤"); }
拦截器
拦截器和过滤器能够读取请求头、请求体、响应头和响应体,而监听器则不能;
拦截器是一种组件,它可以截获 HTTP 请求和响应,并在请求前后执行一些操作。拦截器通常用于身份验证、日志记录、性能分析等