SpringBoot静态资源与缓存配置全解析

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

规则:

  1. 解析一个错误页
    1. 如果发生了500,404,403错误(精确匹配)
      1. 如果有模板引擎 ,默认在classpath:/templates/error/精确码.html
      2. 如果没有模板引擎,在静态资源文件夹下找精确码.html
    1. 如果精确找不到精确码.html,就去找5xx.html,4xx.html(模糊匹配)
      1. 如果有模板引擎,默认在classpath:/templates/error/5xx.html
      2. 如果没有模板引擎,在静态资源文件夹下找 5xx.html
  1. 如果没有模板引擎templates下有error.html页面就直接渲染

  2. 如果都没有,容器中有一个默认为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+额外扩展返回

2.函数式Web

相关推荐
军训猫猫头7 分钟前
3.检查函数 if (!CheckStart()) return 的妙用 C#例子
开发语言·c#
coding随想8 分钟前
JavaScript中的系统对话框:alert、confirm、prompt
开发语言·javascript·prompt
灵哎惹,凌沃敏9 分钟前
C语言/Keil的register修饰符
c语言·开发语言
探索java12 分钟前
Java并发编程中的StampedLock详解:原理、实践与性能优化
java·stampedlock
界面开发小八哥24 分钟前
「Java EE开发指南」如何用MyEclipse将Java项目转换为Web项目?
java·ide·java-ee·eclipse·开发工具·myeclipse
pobu16834 分钟前
aksk前端签名实现
java·前端·javascript
Azxcc038 分钟前
C++迭代器失效
开发语言·c++
0wioiw01 小时前
Flutter基础(前端教程⑤-组件重叠)
开发语言·前端·javascript