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+額外擴展返回