springboot中静态资源
classpath就是resource文件夹下
欢迎页规则
项目启动默认去找静态资源下的index.html页面 默认访问该页面
favicon原则
在静态资源目录下寻找favicon.ico
缓存实验
在请求中使用Cache-Control 时,它可选的值有:
在响应中使用Cache-Control 时,它可选的值有:
配置浏览器缓存
spring:web:locale: zh_CN # 国际化的区域信息resources:add-mappings: true #开启静态资源映射cache:period: 3600 #缓存时间 以秒为单位cachecontrol: # 缓存详细控制 覆盖上面的配置max-age: 7200
自定义静态资源配置
spring:web:locale: zh_CN # 国际化的区域信息resources:# 修改resource文件夹下的静态资源路径static-locations: classpath:/a/, classpath:/a/mvc:webjars-path-pattern: /wj/**# 静态资源访问前缀static-path-pattern: /static/**
路径匹配
ant风格路径匹配
默认使用新版pathpattern路径匹配
不能匹配**在中间的情况,剩下的与ant风格兼容
配置文件改变路径匹配策略:
spring:mvc:pathmatch:matching-strategy: ant_path_matcher
内容协商
1.多端内容适配
第二种方法需要自行开启
2.效果演示
请求同一个接口,返回json和xml不同格式数据
1.引入依赖
<!-- 引入xml相关依赖-->
<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-xml</artifactId>
</dependency>
2.加入注解
在数据类型中加入
@Data
@AllArgsConstructor
@NoArgsConstructor
@JacksonXmlRootElement
//可以讲数据转化为xml格式
public class Person {private long id;private String name;private String email;private Integer age;
}
3.配置协商规则
开启基于参数传递格式
spring:mvc:contentnegotiation:favor-parameter: true # 默认参数为formatparameter-name: type # 修改参数名
效果演示:
根据type类型返回不同的内容格式
自定义内容返回
1.增加yaml返回支持
导入依赖:
<!-- 导入支持yaml解析的模块-->
<dependency><groupId>com.fasterxml.jackson.dataformat</groupId><artifactId>jackson-dataformat-yaml</artifactId>
</dependency>
编写配置:
spring:mvc:contentnegotiation:media-types:yaml: text/yaml
增加HttpMessageConverter组件
例如:MyYamlHttpMessageConverters
public class MyYamlHttpMessageConverters extends AbstractHttpMessageConverter {private ObjectMapper objectMapper=null;public MyYamlHttpMessageConverters(){//告诉springboot支持什么媒体类型(对应配置文件中的)super(new MediaType("application", "yaml", Charset.forName("utf-8")));//禁用文档开始前出现的横线YAMLFactory Factory = new YAMLFactory().disable(YAMLGenerator.Feature.WRITE_DOC_START_MARKER);this.objectMapper = new ObjectMapper(Factory);}@Overrideprotected boolean supports(Class clazz) {//只要是对象类型都支持转换return true;}@Override //requestbodyprotected Object readInternal(Class clazz, HttpInputMessage inputMessage) throws IOException, HttpMessageNotReadableException {return null;}@Override //responsebody 把对象写出去protected void writeInternal(Object returnValue, HttpOutputMessage outputMessage) throws IOException, HttpMessageNotWritableException {OutputStream body = outputMessage.getBody();try {this.objectMapper.writeValue(body,returnValue); //把对象返回值写出去}catch (Exception e){e.printStackTrace();}finally {body.close();}}
}
在配置文件中加入:
//配置一个能把对象转为yaml的MessageConverters
@Override
public void configureMessageConverters(List<HttpMessageConverter<?>> converters) {converters.add(new MyYamlHttpMessageConverters());
}
内容协商原理
httpmessageconverter
系统默认:
错误处理
1. 错误处理流程:
能处理就处理处理不了就转发给springboot处理,先精确匹配,找模板引擎下的,找不到就去静态资源下找,后模糊匹配,先找模板引擎下的,找不到就去静态资源下找,如果都没有具体页面,再去匹配error页面,若也没有,springboot会提供默认error页面
2. 错误页面解析:
如果没有配置错误处理,就会使用默认的错误页面error
规则:
- 解析一个错误页
- 如果发生了500,404,403错误(精确匹配)
- 如果有模板引擎,默认在classpath:/templates/error/精确码.html
- 如果没有模板引擎,在静态资源文件夹下找精确码.html
- 如果精确找不到精确码.html,就去找5xx.html,4xx.html(模糊匹配)
- 如果有模板引擎,默认在classpath:/templates/error/5xx.html
- 如果没有模板引擎,在静态资源文件夹下找 5xx.html
- 如果没有模板引擎templates下有error.html页面就直接渲染
- 如果都没有,容器中有一个默认为error的view,提供了默认白页功能。
@Bean(name="error")
@CondiontionalOnMissingBean(name="error")
public View defaultErrorView(){return this.defaultErrorView
}
3. 最佳实战
嵌入式容器
Servlet容器:管理,运行Servlet组件(Servlet,Filter,Listener)的环境,一般指服务器
1.自动配置原理
Web新特性
1.Problemdetails
配置开启:
spring:mvc:problemdetails:enabled: true #启动
开启后效果:使用新的MediaType类型
content-type+json+额外扩展返回