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 # 默认参数为format
parameter-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);
}
@Override
protected boolean supports(Class clazz) {
//只要是对象类型都支持转换
return true;
}
@Override //requestbody
protected 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+额外扩展返回