同以前的properties用法
YAML是 “YAML Ain`t Markup Language”(YAML不是一种标记语言)的递归缩写。在开发的这种语言时,YAML的意思其实是: “Yet Another Markup Language”(仍是一种标记语言)。
非常适合用来做以数据为中心的配置文件
k: v
行内写法: k: {k1:v1,k2:v2,k3:v3}
#或
k :
k1: v1
k2: v2
k3: v3
行内写法: k: [v1,v2,v3]
#或者
k:
- v1
- v2
- v3
码笔的,如果有报错下面情况的,可以这样解决:
Error:(3, 51) java: 无法访问
org.springframework.boot.context.properties.Configura
tionProperties 错误的类文件: /D:/maven-
repo/org/springframework/boot/spring-
boot/3.0.4/spring-boot-3.0.4.jar!/org/spr
上面意思可能就是SpringBoot或Java的版本太高了,我们可以修改Maven设置和POM文件来解决↓
<modelVersion>4.0.0modelVersion>
<parent>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-starter-parentartifactId>
<version>2.3.4.RELEASEversion>
<relativePath/>
parent>
<groupId>com.atguigu.bootgroupId>
<artifactId>boot-01-helloworld-2artifactId>
<version>0.0.1-SNAPSHOTversion>
<name>boot-01-helloworld-2name>
<description>Demo project for Spring Bootdescription>
<properties>
<java.version>1.8java.version>
properties>
回到正题,下面是Yaml的语法和使用展示
yaml文件内容↓
创建的方式则是直接新建一个File就行,输入application.yaml。
而SpringBoot的application.properties也是
person:
userName: zhangsan
boss: true
birth: 2019/12/9
age: 18
# interests: [唱,跳,篮球,music]
interests:
- 唱
- 跳
- 篮球
- music
animal: [奔驰,宝马,奥迪]
# score:
# english: 80
# math: 90
#下面是json的表达方式,可以不k: v 直接k:v
score: {english: 80,math: 90}
salaries:
- 6000.22
- 9999.99
pet:
name: 奔驰
weight: 15000.00
allPets:
sick:
- {name: 宝马,weight: 12000.00}
- name: 奥迪
weight: 10000.00
- name: 凯迪拉克
weight: 8000.00
health:
- {name: 雪铁龙,weight: 100.00}
- {name: C6,weight: 120000.00}
控制器的代码↓
@RestController
public class HelloController {
@Autowired//自动注入
Person person;
@RequestMapping("/person")
public Person person(){
return this.person;
}
}
我们的POJO类用到了Lombok插件,该插件就是自动写set、get、toString等方法,构造器需要自己手动写注解才有,在IDEA中可以点击文件结构来查看Lombok编译时产生的这些自动方法的实体↓
记得给POJO类加上配置属性,前缀:person
POJO类:Person代码↓
//有人说 @Data注解包含了@ToString
//@ToString
@ConfigurationProperties(prefix = "person")//和配置文件中前缀为person的属性绑定值
//注册为容器中的组件
@Component
//lombok标记(get+set+hashCode+toString+equals...)
@Data
public class Person {
private String userName;
private Boolean boss;
private Date birth;
private Integer age;
private Pet pet;
private String[] interests;
private List<String> animal;
private Map<String,Object>score;
private Set<Double>salaries;//哼哼 salary 复数 -> 先把y变i 然后加es
private Map<String,List<Pet>>allPets;
}
POJO类:Pet类代码↓
@Data
public class Pet {
private String name;
private Double weight;
}
IDEA确实帮助我们自动空格了,注意 k: v,这里的v和冒号是有一个空格的,在Yaml语法中不能使用Tab缩进,所以在其他编辑软件中要小心点,IDEA真的我哭死。
注意上面的红字是错误的,必须k: v有空格!
map没有加空格的错误形式!
注意空格产生的层级关系!
配置优先级
字符串的语法
不管是直接 张三;还是’张三’;还是"张三"。
它们表示的都是字符串,效果一致。
而带引号的意义是,它是否要转义特殊字符
比如:
userName: zhangsan \n 李四
双引号效果:
单引号效果:
双引号在控制台中是转义,在网页上是不转义的
单引号在控制台中不转义,在网页上是专一的
只是展示效果而已。
我们发现,在Yaml文件的编写中,自己定义的内容没有提示,而SpringBoot的内容就有提示,我们要怎么做才能让自定义的类绑定的配置也有提示呢?
导入依赖
<dependency>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-configuration-processorartifactId>
<optional>trueoptional>
dependency>
刷新POM文件后,重启一下项目,然后下次书写自定义Yaml文件时,就有提示信息了。
如果重启项目仍然没有提示,那么就去clean一下Maven,然后重启项目,然后再尝试,应该就可以了(本人就是这么解决的)
我们可以看到,提示的不是userName,而是user-name,为什么不是驼峰了?
其实这里的-就代表是驼峰,相当于 -name 等于 Name
<configuration>
<excludes>
<exclude>
<groupId>org.springframework.bootgroupId>
<artifactId>spring-boot-configuration-processorartifactId>
exclude>
excludes>
configuration>
我们使用Spring Initializr来快速创建SpringBoot应用
①项目信息配置
②依睐框选
<version>2.3.4.RELEASEversion>
缺少src/main/java|resources目录
缺少主程序类
com.atugiu.boot.Boot05Web01Application
@SpringBootApplication
public class Boot05Web01Application {
public static void main(String[] args) {
SpringApplication.run(Boot05Web01Application.class,args);
}
}
resources里缺少核心配置文件properteis
application.properties
缺少src/main/test/java目录
网页根目录:
http://localhost:8080/
类路径下:called/static or /public or /resources or /META-INF/resources
设问:如果我们的控制器处理的请求和静态资源的名称一样,那应该怎么响应处理呢?
原理是:静态映射 /** 。
请求先去找Controller看能不能处理。不能处理的所有请求又都交给静态资源处理器。静态资源去
目录,按照名字取找。如果静态资源没找到,则会是404↓
默认无前缀。
通过yaml配置文件增加前缀↓
设置静态资源的访问前缀
spring:
mvc:
static-path-pattern: /res/**
测试增加前缀后的静态资源访问↓
原来的路径访问情况:
增加前缀访问的情况:
通过配置修该静态资源默认的访问位置↓
spring:
mvc:
static-path-pattern: /res/**
resources:
static-locations: [classpath:/haha/]
静态资源路径下 index.html
controller能处理/index
在默认的情况下,访问根目录会取访问静态目录下的index.html欢迎页↓
注意这里吧先前设置的静态路径和前缀都注释掉了
设置网站图标
注销掉先前的配置,并且在浏览器中清理浏览器的缓存。
配置类只有一个有参构造器
有参构造器所有参数的值都会从容器中确定
//ResourceProperties resourceProperties:获取和spring.resources绑定的所有的值的对象
//WebMvcProperties spring.mvc获取和spring.resource绑定的所有的值的对象
//ListableBeanFactory beanFactory Spring的beanFactory
//HttpMessageConverters:找到所有的HttpMessageConverters
//ResourceHandLerRegistrationCustomizer 找到资源处理器的自定义器
//DispatcherServletPath
//ServletRegistrationBean 给应用注册Servlet、Filter...
资源处理的默认规则
webjars的规则
静态资源路径的默认值
欢迎页的处理规则
HandlerMapping:处理器映射。保存了每一个Handler能处理哪些请求。
表单提交会带上_method=PUT
判断请求是否正常,并且是POST方式