引言
????????沒有完美的程序啤覆,只有不斷的追求完美,我們才能進步和成長宅楞,程序的運行不可能是一帆風順的针姿,當出現(xiàn)一些錯誤時,比如500服務(wù)器內(nèi)部錯誤厌衙,404用戶訪問錯誤的URL距淫,405用戶無此權(quán)限........針對這些問題Spring Boot給我們提供了一些錯誤的信息頁面提示。
????????作為開發(fā)人員我們一眼就能看懂婶希,但是如果給用戶看這種頁面榕暇,不知情的用戶還以為我們的系統(tǒng)怎么了,造成用戶體驗度非常不好喻杈,針對這些問題我們應(yīng)該給用戶友好的提示拐揭,一般我們都需要定制一些錯誤的頁面。
自定義錯誤頁面:
1.靜態(tài)資源的方式:
????????1.在resources
目錄下創(chuàng)建public/error
目錄奕塑,編寫錯誤頁面堂污。
2.訪問測試:
2.動態(tài)方式:
1.使用IDEA建立一個Spring Boot項目龄砰,在pom.xml文件中添加和配置如下內(nèi)容:
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-tomcat</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
</dependency>
<dependency>
<groupId>org.apache.tomcat.embed</groupId>
<artifactId>tomcat-embed-jasper</artifactId>
</dependency>
2.在src/main/
下創(chuàng)建webapp/view/error/
目錄盟猖,并在下面定義錯誤頁面:
3.在application.yml
文件中配置Spring MVC
視圖解析器:
4.編寫ErrorConfiguration
配置類:
(1)編寫代碼之間我們先普及一下小知識:
????????我們使用基于java容器配置的方式,在Spring 3.0
中引入了基于java容器的配置换棚,Spring
Java容器配置支持中的中心工件是 @Configuration
注解用于注釋類和@Bean
用于注釋方法式镐,對于熟悉Spring
XML配置中<beans/>
配置的開發(fā)人員,@Bean
注釋與<bean/>
元素的作用相同固蚤。
????????EmbeddedServletContainerCustomizer
接口可以自定義嵌入式servlet容器的策略界面娘汞。這種類型的bean將在容器本身啟動之前與容器工廠進行回調(diào),因此我們可以設(shè)置端口夕玩,地址你弦,錯誤頁面等惊豺。
????????通過查看API發(fā)現(xiàn)此接口只有一個方法customize
,此方法需要傳遞ConfigurableEmeddedServletContainer
的實現(xiàn)類對象禽作。
????????ConfigurableEmeddedServletContainer
是一個接口尸昧,閱讀API文檔得知此接口繼承了ErrorPageRegistry
接口。
????????閱讀API文檔得知ErrorPageRegistry
接口中只有一個addErrorPage
方法旷偿,此方法需要傳遞ErrorPage
對象烹俗。
????????閱讀API文檔得知ErrorPage
類表示簡單和容器無關(guān)的servlet錯誤頁面抽象,此類相當于web.xml
中的<error-page>
萍程,ErrorPage提供了三種構(gòu)造方法幢妄,我們只使用public ErrorPage(org.springframework.http.HttpStatus status,String path)
構(gòu)造茫负,指出一個錯誤類型(org.springframework.http.HttpStatus
是一個枚舉類型磁浇,里面提供了http
狀態(tài)碼
),并傳遞一個錯誤呈現(xiàn)的路徑即可朽褪。
(2)知識普及完了開始編寫編寫ErrorConfiguration配置類:
@Configuration
public class ErrorConfiguration {
@Bean
public EmbeddedServletContainerCustomizer containerCustomizer() {
return new EmbeddedServletContainerCustomizer(){
@Override
public void customize(ConfigurableEmbeddedServletContainer container) {
container.addErrorPages(new ErrorPage(HttpStatus.BAD_REQUEST, "/error/400.html"));
container.addErrorPages(new ErrorPage(HttpStatus.NOT_FOUND, "/error/404.html"));
container.addErrorPages(newErrorPage(HttpStatus.METHOD_NOT_ALLOWED,"/error/405.html"));
container.addErrorPages(new ErrorPage(HttpStatus.INTERNAL_SERVER_ERROR, "/error/500.html"));
}
};
}
5.編寫ErrorController
前端控制器:
(1)腦補一下:
????????Spring4.3
中引進了@GetMapping
置吓、@PostMapping
、@PutMapping
缔赠、@DeleteMapping
衍锚、@PatchMapping
,來幫助簡化常用的HTTP方法的映射嗤堰,并更好地表達被注解方法的語義戴质。
????????@GetMapping
是一個組合注解,是@RequestMapping(method = RequestMethod.GET)
的縮寫踢匣,該注解將http get
請求映射到特定的處理方法上告匠,其余的那幾個大家舉一反三也就明白了吧。
(2)編寫代碼:
@Controller
@RequestMapping(value = "error")
public class ErrorController {
/**
* 配置400錯誤轉(zhuǎn)發(fā)
* @return
*/
@GetMapping(value = "400.html")
public String badequest() {
return "error/400";
}
/**
* 配置404錯誤轉(zhuǎn)發(fā)
* @return
*/
@GetMapping(value = "404.html")
public String notFound() {
return "error/404";
}
/**
* 配置405錯誤轉(zhuǎn)發(fā)
* @return
*/
@GetMapping(value = "405.html")
public String merthodNotAllowed() {
return "error/405";
}
/**
* 配置500錯誤轉(zhuǎn)發(fā)
* @return
*/
@GetMapping(value = "500.html")
public String serverError() {
return "error/500";
}
}
6.訪問測試:
總結(jié)
????????這兩種方式我這里都進行了配置离唬,我想證明一下兩種方式如果同時存將會使用哪種方式呢后专,通過實踐證明,當靜態(tài)資源配置和動態(tài)配置同時存在時動態(tài)資源配置生效输莺。