网站推荐男生正能量2021/站长统计是什么意思
目录
一、配置文件
1.1 文件类型
1.1.1 properties
1.1.2 yaml
1.2 配置提示
二、web开发
2.1 SpringMVC自动配置概览
2.2 简单功能分析
2.2.1 静态资源访问
2.2.2 静态资源访问前缀
2.2.3 欢迎页支持
2.2.4 自定义 Favicon
2.2.5 静态资源配置原理
2.2.6 扩展知识——配置类只有一个有参构造器,则有参构造器所有参数的值都会从容器中确定
2.2.7 资源处理的默认规则
2.3 请求参数
2.3.1 注解
2.3.2 自定义对象参数——通过数据绑定原理
2.4 响应数据与内容协商
2.4.1 响应json——jackson.jar+@ResponseBody
2.4.2 内容协商——根据客户端接收能力的不同,返回不同类型的数据
2.5 拦截器
教案:https://www.yuque.com/atguigu/springboot/rg2p8g
一、配置文件
1.1 文件类型
1.1.1 properties
同以前的properties用法
1.1.2 yaml
YAML 是 "YAML Ain't Markup Language"(YAML 不是一种标记语言)的递归缩写。在开发的这种语言时,YAML 的意思其实是:"Yet Another Markup Language"(仍是一种标记语言)。
非常适合用来做以数据为中心的配置文件
基本语法
- key: value;kv之间有空格
- 大小写敏感
- 使用缩进表示层级关系
- 缩进不允许使用tab,只允许空格
- 缩进的空格数不重要,只要相同层级的元素左对齐即可
- '#' 表示注释
- 字符串无需加引号,如果要加,''与""表示字符串内容 会被 转义/不转义
数据类型
- 字面量:单个的、不可再分的值。date、boolean、string、number、null
k: v
- 对象:键值对的集合。map、hash、set、object
行内写法: k: {k1:v1,k2:v2,k3:v3}
#或
k: k1: v1k2: v2k3: v3
- 数组:一组按次序排列的值。array、list、queue
行内写法: k: [v1,v2,v3]
#或者
k:- v1- v2- v3
示例
@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> salarys;private Map<String, List<Pet>> allPets;
}@Data
public class Pet {private String name;private Double weight;
}
yaml表示以上对象
person:userName: zhangsanboss: falsebirth: 2019/12/12 20:12:33age: 18pet: name: tomcatweight: 23.4interests: [篮球,游泳]animal: - jerry- marioscore:english: first: 30second: 40third: 50math: [131,140,148]chinese: {first: 128,second: 136}salarys: [3999,4999.98,5999.99]allPets:sick:- {name: tom}- {name: jerry,weight: 47}health: [{name: mario,weight: 47}]
1.2 配置提示
自定义的类和配置文件绑定一般没有提示。加入下方的依赖,这样在编写yaml文件时,会和配置pring组件一样,产生提示信息。
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-configuration-processor</artifactId><optional>true</optional></dependency>
但是在打包时,如果不希望我们上述新增的配置处理器被打包到jar包中(我们不希望打出来的包太重了),可以使用下面的配置满足我们的需求
<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>
二、web开发
2.1 SpringMVC自动配置概览
Spring Boot provides auto-configuration for Spring MVC that works well with most applications.(大多场景我们都无需自定义配置)
2.2 简单功能分析
2.2.1 静态资源访问
1、静态资源目录
只要静态资源放在类路径下:called /static
(or /public
or /resources
or /META-INF/resources
访问 : 当前项目根路径/ + 静态资源名 就能访问到我们的静态资源。
2. 获取静态资源实现原理: 静态映射/**。
请求进来,先去找Controller看能不能处理。不能处理的所有请求,都交给静态资源去处理。
静态资源也找不到则响应404页面
改变默认的静态资源路径
spring:mvc:static-path-pattern: /res/**resources:static-locations: [classpath:/haha/]
2.2.2 静态资源访问前缀
默认无前缀。
如果需要配置前缀,可以在yaml文件中进行配置。下面的例子是给静态资源配置res前缀
spring:mvc:static-path-pattern: /res/**
配置静态资源得到指定存储路径(配置之后,将无法通过默认的路径获取静态资源)
2.2.3 欢迎页支持
- 静态资源路径下 index.html
- 可以配置静态资源路径,但是不可以配置静态资源的访问前缀。否则导致 index.html不能被默认访问
spring:
# mvc:
# static-path-pattern: /res/** 这个会导致welcome page功能失效resources:static-locations: [classpath:/haha/]
- controller能处理/index
2.2.4 自定义 Favicon
favicon.ico 放在静态资源目录下即可。
2.2.5 静态资源配置原理
SpringBoot启动默认加载 xxxAutoConfiguration 类(自动配置类)
SpringMVC功能的自动配置类 WebMvcAutoConfiguration,在找到配置类后,需要看一下配置类是否生效。下面的源码,通过注解可以看出其生效了
@Configuration(proxyBeanMethods = false)
@ConditionalOnWebApplication(type = Type.SERVLET)
@ConditionalOnClass({ Servlet.class, DispatcherServlet.class, WebMvcConfigurer.class })
@ConditionalOnMissingBean(WebMvcConfigurationSupport.class) //容器中没有这个WebMvcConfigurationSupport.class组件时,下面的配置才会生效
@AutoConfigureOrder(Ordered.HIGHEST_PRECEDENCE + 10)
@AutoConfigureAfter({ DispatcherServletAutoConfiguration.class, TaskExecutionAutoConfiguration.class,ValidationAutoConfiguration.class })
public class WebMvcAutoConfiguration {}
给容器中配了什么。
@Configuration(proxyBeanMethods = false)
@Import(EnableWebMvcConfiguration.class)
@EnableConfigurationProperties({ WebMvcProperties.class, ResourceProperties.class })
@Order(0)
public static class WebMvcAutoConfigurationAdapter implements WebMvcConfigurer {}
配置文件的相关属性和xxx进行了绑定。WebMvcProperties与spring.mvc进行了绑定、ResourceProperties与spring.resources进行了绑定
2.2.6 扩展知识——配置类只有一个有参构造器,则有参构造器所有参数的值都会从容器中确定
//有参构造器所有参数的值都会从容器中确定
//ResourceProperties resourceProperties;获取和spring.resources绑定的所有的值的对象
//WebMvcProperties mvcProperties 获取和spring.mvc绑定的所有的值的对象
//ListableBeanFactory beanFactory Spring的beanFactory
//HttpMessageConverters 找到所有的HttpMessageConverters
//ResourceHandlerRegistrationCustomizer 找到 资源处理器的自定义器。=========
//DispatcherServletPath
//ServletRegistrationBean 给应用注册Servlet、Filter....
public WebMvcAutoConfigurationAdapter(ResourceProperties resourceProperties, WebMvcProperties mvcProperties,ListableBeanFactory beanFactory, ObjectProvider<HttpMessageConverters> messageConvertersProvider,ObjectProvider<ResourceHandlerRegistrationCustomizer> resourceHandlerRegistrationCustomizerProvider,ObjectProvider<DispatcherServletPath> dispatcherServletPath,ObjectProvider<ServletRegistrationBean<?>> servletRegistrations) {this.resourceProperties = resourceProperties;this.mvcProperties = mvcProperties;this.beanFactory = beanFactory;this.messageConvertersProvider = messageConvertersProvider;this.resourceHandlerRegistrationCustomizer = resourceHandlerRegistrationCustomizerProvider.getIfAvailable();this.dispatcherServletPath = dispatcherServletPath;this.servletRegistrations = servletRegistrations;
}
2.2.7 资源处理的默认规则
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {if (!this.resourceProperties.isAddMappings()) {logger.debug("Default resource handling disabled");return;}Duration cachePeriod = this.resourceProperties.getCache().getPeriod();CacheControl cacheControl = this.resourceProperties.getCache().getCachecontrol().toHttpCacheControl();//webjars的规则if (!registry.hasMappingForPattern("/webjars/**")) {customizeResourceHandlerRegistration(registry.addResourceHandler("/webjars/**").addResourceLocations("classpath:/META-INF/resources/webjars/").setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));}String staticPathPattern = this.mvcProperties.getStaticPathPattern();if (!registry.hasMappingForPattern(staticPathPattern)) {customizeResourceHandlerRegistration(registry.addResourceHandler(staticPathPattern).addResourceLocations(getResourceLocations(this.resourceProperties.getStaticLocations())).setCachePeriod(getSeconds(cachePeriod)).setCacheControl(cacheControl));}
}
通过以下配置,可以导致上述倒吗中走入条件 this.resourceProperties.isAddMappings(),并打印出日志:静态资源访问已被禁用
spring:resources:add-mappings: false 禁用所有静态资源规则
2.3 请求参数
2.3.1 注解
@PathVariable——用于获取路径参数
PathVariable用于获取请求路径中传入的变量值;可以根据变量名获取,也可以通过map将参数一次性全部获取。测试代码如下:
@RestController
public class ParameterTestController {@GetMapping("/car/{id}/owner/{username}")public Map<String, Object> getCar(@PathVariable("id") Integer id,@PathVariable("username") String name,@PathVariable Map<String, String> pv) {Map<String, Object> map = new HashMap<>();map.put("id", id);map.put("name", name);map.put("pv", pv);return map;}
}
@RequestHeader——用于获取请求头信息
测试代码如下:
@RestController
public class ParameterTestController {@GetMapping("/car/{id}/owner/{username}")public Map<String, Object> getCar(@PathVariable("id") Integer id,@PathVariable("username") String name,@PathVariable Map<String, String> pv,@RequestHeader("User-Agent") String userAgent,@RequestHeader Map<String, String> header) {Map<String, Object> map = new HashMap<>();map.put("id", id);map.put("name", name);map.put("pv", pv);map.put(" userAgent", userAgent);map.put("headers", header);return map;}}
@RequestParam——获取请求参数
@RestController
public class ParameterTestController {@GetMapping("/car/{id}/owner/{username}")public Map<String, Object> getCar(@PathVariable("id") Integer id,@PathVariable("username") String name,@RequestParam Map<String, String> params) {Map<String, Object> map = new HashMap<>();map.put("id", id);map.put("name", name);map.put("params", params);return map;}}
@RequestAttribute——获取请求域中的值
测试代码如下:
@Controller
class RequestController {@GetMapping("/goto")public String goToPage(HttpServletRequest request) {request.setAttribute("msg", "成功了...");request.setAttribute("code", 200);return "forward:/success"; //转发到 /success 请求}@ResponseBody@GetMapping("/success")public Map success(@RequestAttribute("msg") String msg,@RequestAttribute("code") Integer code,HttpServletRequest request) {Object msg1 = request.getAttribute("msg");Map<String, Object> map = new HashMap<>();map.put("reqMethod_msg", msg1);map.put("annotation_msg", msg);return map;}
}
@CookieValue——获取cookie的值
@RestController
public class ParameterTestController {@GetMapping("/car/{id}/owner/{username}")public Map<String, Object> getCar(@PathVariable("id") Integer id,@PathVariable("username") String name,@RequestParam Map<String, String> params,@CookieValue(" _ga") String _ga,@CookieValue("_ ga") Cookie cookie) {Map<String, Object> map = new HashMap<>();map.put("id", id);map.put("name", name);map.put("params", params);return map;}
}
@RequestBody——获取post请求体的值
@RestController
public class ParameterTestController {@PostMapping("/save")public Map postMethod(@RequestBody String content) {Map<String, Object> map = new HashMap<>();map.put(" content", content);return map;}
}
2.3.2 自定义对象参数——通过数据绑定原理
可以自动类型转换与格式化,可以级联封装。
2.4 响应数据与内容协商
2.4.1 响应json——jackson.jar+@ResponseBody
环境配置
需要引入以下依赖
<dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-web</artifactId>
</dependency>
该依赖中帮我们引入了starter-json
starter-json主要使用了jackson来处理依赖
示例代码
@Controller
public class ResponseTestController {@ResponseBody@GetMapping("/test/person")public User getUser() {User user = new User();user.setAge(10);user.setName("rudy");return user;}
}
2.4.2 内容协商——根据客户端接收能力的不同,返回不同类型的数据
1、引入xml依赖
<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId>
</dependency>
引入依赖之后,优先返回xml格式的数据
原理
客户端发送请求时,请求头中携带的Accept字段对应的值控制了服务端的返回值信息:
- application/json时,返回的是json格式的数据
- application/xml时,返回的是xml格式的数据
2. 原理
1、判断当前响应头中是否已经有确定的媒体类型。MediaType
2、获取客户端(PostMan、 浏览器 Accepte请求头字段) [application/xml]
3、遍历循环所有当前系统的MessageConverter,看谁支持操作这个对象(Person)
4、找到支持操作Person的converter, 把converter支 持的媒体类型统计出来。
5、客户端需要[application/xml] 。服务端能力[10种、json. xml]
6、进行内容协商的最佳匹配媒体类型
7、用支持将对象转为最佳匹配媒体类型的converter。调用它进行转化。
3. 其他——可以开启基于请求参数的内容协商
spring:contentnegotiation:favor-parameter: true #开启请求参数内容协商模式
发请求:
- http://localhost:8080/test/person?format=json
- http://localhost:8080/test/person?format=xml
2.5 拦截器
https://www.cnblogs.com/black-spike/p/7813238.html