springboot2——4 yaml以及web开发

倪棋
2023-12-01

1 yaml

1.1 yaml介绍

springboot除了兼容properties格式的配置文件还兼容yaml格式的,yaml非常适合做以数据为中心的配置文件
如果springboot的项目中同时有properties和yaml的配置文件,两者都生效,如果其中的内容重复了,以properties优先

1.2 语法

  • 使用K: V进行键值映射,V前要有空格作为分隔符
  • 区分大小写
  • 使用缩进表示层级关系
  • 缩进默认不能用Tab键,要用空格。但是实际操作的时候可以使用tab键,不会出现问题
  • 缩进的空格数不重要,只要相同层级的元素左对齐即可
  • 注解使用#字符
  • ‘’ “”表示字符串,需要注意的是字符串类型的数据可以不用引号引起来,但是要是使用引号的话,单引号会将转义字符作为字符串进行输出,双引号会将转义字符转义之后输出,比如\n单引号就是\n双引号就是换号符

1.3 数据类型

  • 字面量:单个的、不可再分的值。date、boolean、string、number、null
k: v
  • 对象:键值对的集合。map、hash、set、object
行内写法:  k: {k1:v1,k2:v2,k3:v3}
#或
k: 
  k1: v1
  k2: v2
  k3: v3
  • 数组:一组按次序排列的值。array、list、queue
行内写法:  k: [v1,v2,v3]
#或者
k:
 - v1
 - v2
 - v3

示例如下

person:
  name: zhangsan
  age: 18
  interests: [篮球,游泳]
  birth: 2021/12/12
@Data
@ToString
@Component
@ConfigurationProperties("person")
public class Person {
    private String name;
    private int age;
    private String[] interests;
    private Date birth;
}

1.3 yaml配置文件提示

在进行yaml配置文件书写时,发现没有自动提示功能,通过在pom.xml中导入配置处理器依赖解决

<dependency>
   <groupId>org.springframework.boot</groupId>
  <artifactId>spring-boot-configuration-processor</artifactId>
   <optional>true</optional>
</dependency>

但是该依赖是我们开发中需要,项目开发完打成的jar包中不需要该依赖打入jar包,会降低项目的效率,通过在pom.xml中完成以下配置解决

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
				<configuration>
					<excludes>
						<exclude>
							<groupId>org.springframework.boot</groupId>
							<artifactId>spring-boot-configuration-processor</artifactId>
						</exclude>
					</excludes>
				</configuration>
			</plugin>
		</plugins>
	</build>

2 Web开发

2.1 静态资源规则与定制化

静态资源是固定页面,包含HTML、CSS、JS、图片等,不需要查数据库也不需要程序处理,直接就能够显示的页面。
只要静态资源放在当前项目的类路径下的static、public 、resources 、META-INF/resources
访问这些静态资源的方式:/(即当前项目根路径) + 静态资源名
原理
当静态资源和controller请求重名的时候,资源解析器会首先去找该名称的Controller看能不能处理。不能处理的请求又交给静态资源处理器默认在类路径下的static、public 、resources 、META-INF/resources查找静态资源,如果静态资源也找不到则响应404页面。
静态资源访问前缀
静态资源访问默认没有前缀,为便于后续拦截器使用方便,可以人为给静态资源添加访问前缀,在yaml中添加下面代码,则之后访问只有使用 /res + 静态资源名,才能访问到相应的静态资源。

spring:
  mvc:
    static-path-pattern: /res/**

静态资源路径
可以通过在yaml中更改spring. web.resources.static-locations配置项,改变静态资源默认存储路径,进行如下的更改后,访问静态资源的路径为 /res + 静态资源名,请求进来如果在Controller中匹配不到,就去根路径下的hh文件夹下找。

spring:
  mvc:
    static-path-pattern: /res/**
  web:
    resources:
      static-locations: [classpath:/hh/] #是一个数组,可以写多个地址

2.2 webjars

webjars是将前端所需要的技术的jar包(比如jquery)使用依赖进行导入,webjars的官方文档就是展示jar对应的依赖,使用的时候直接复制到pom.xml文件即可。webjars官网
使用:<script type="text/javascript" th:src="@{/webjars/bootstrap/4.1.0/js/bootstrap.min.js}"></script>

2.3 欢迎页与网页图标

欢迎页
两种方式:

  • 在默认或自定义的静态资源路径下写index.html,这里有一个bug,要想让index.html默认被访问,只能配置静态资源路径,但不能配置静态资源的访问前缀。配置静态资源访问前缀会使欢迎页功能失效
  • 编写一个controller能处理/index请求

网页图标
在默认或自定义的静态资源路径,只要在下面添加一个命名favicon.ico的图片,即可将该图片设置成网页的小图标。

配置静态资源访问前缀会使网页图标功能失效

2.4 静态资源配置原理

springboot启动的时候默认加载xxxAutoConfiguration类(自动配置类)
SpringMVC功能的自动配置类是 WebMvcAutoConfiguration
在WebMvcAutoConfiguration自动配置类里的WebMvcAutoConfigurationAdapter静态类上有@EnableConfigurationProperties({WebMvcProperties.class, WebProperties.class})注解,该注解中的配置类与配置文件中的属性绑定关系如下:WebMvcProperties.class–>spring.mvc 、WebProperties.class -->spring.web

@Configuration(
        proxyBeanMethods = false
    )
    @Import({WebMvcAutoConfiguration.EnableWebMvcConfiguration.class})
    @EnableConfigurationProperties({WebMvcProperties.class, WebProperties.class})
    @Order(0)
    public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer, ServletContextAware {
        private static final Log logger = LogFactory.getLog(WebMvcConfigurer.class);
        private final Resources resourceProperties;
        private final WebMvcProperties mvcProperties;
        private final ListableBeanFactory beanFactory;
        private final ObjectProvider<HttpMessageConverters> messageConvertersProvider;
        private final ObjectProvider<DispatcherServletPath> dispatcherServletPath;
        private final ObjectProvider<ServletRegistrationBean<?>> servletRegistrations;
        private final WebMvcAutoConfiguration.ResourceHandlerRegistrationCustomizer resourceHandlerRegistrationCustomizer;
        private ServletContext servletContext;
        //配置类中的有参构造中的参数默认从容器中拿
		//ResourceProperties resourceProperties --> 获取和spring.resources绑定的所有的值的对象
		//WebMvcProperties mvcProperties --> 获取和spring.mvc绑定的所有的值的对象
		//ListableBeanFactory beanFactory --> Spring的beanFactory
		//HttpMessageConverters --> 找到所有的HttpMessageConverters
		//ResourceHandlerRegistrationCustomizer --> 找到资源处理器的自定义(重点解析)
		//DispatcherServletPath -->  找到资源的路径
		//ServletRegistrationBean --> 给应用注册Servlet、Filter....
        public WebMvcAutoConfigurationAdapter(WebProperties webProperties, WebMvcProperties mvcProperties, ListableBeanFactory beanFactory, ObjectProvider<HttpMessageConverters> messageConvertersProvider, ObjectProvider<WebMvcAutoConfiguration.ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizerProvider, ObjectProvider<DispatcherServletPath> dispatcherServletPath, ObjectProvider<ServletRegistrationBean<?>> servletRegistrations) {
            this.resourceProperties = webProperties.getResources();
            this.mvcProperties = mvcProperties;
            this.beanFactory = beanFactory;
            this.messageConvertersProvider = messageConvertersProvider;
            this.resourceHandlerRegistrationCustomizer = (WebMvcAutoConfiguration.ResourceHandlerRegistrationCustomizer)resourceHandlerRegistrationCustomizerProvider.getIfAvailable();
            this.dispatcherServletPath = dispatcherServletPath;
            this.servletRegistrations = servletRegistrations;
            this.mvcProperties.checkConfiguration();
        }

SpringBoot的规则:配置类的有参构造器所有参数的值都会从容器中拿

 类似资料: