1. 概述
在任何Web應用程序中,定製錯誤頁面是一個常見需求。
例如,假設您正在運行一個純Spring MVC應用程序,該應用程序基於Tomcat。 用户在瀏覽器中輸入一個無效URL,並看到一個不太友好的藍色和白色堆棧跟蹤——這不太理想。
在本教程中,我們將為幾個HTTP錯誤代碼設置定製的錯誤頁面。
假設讀者對Spring MVC的工作方式已經比較熟悉;如果不是,這是一個很好的入門方式。
本文重點介紹Spring MVC。 我們的文章《自定義Whitelabel錯誤頁面》描述瞭如何在Spring Boot中創建自定義錯誤頁面。
2. 簡單步驟
我們先按照以下簡單步驟進行:
- 指定一個 URL /errors 在 web.xml 中,該 URL 將映射到一個方法,用於處理任何錯誤發生時產生的錯誤
- 創建一個名為 ErrorController 的控制器,並設置一個映射 /errors
- 在運行時確定 HTTP 錯誤代碼,並根據 HTTP 錯誤代碼顯示相應的消息。 例如,如果生成了 404 錯誤,則用户應看到類似於 ‘Resource not found’ 的消息;對於 500 錯誤,用户應看到類似於 ‘Sorry! An Internal Server Error was generated at our end’ 的內容
3. Web.xml
我們首先添加以下行到我們的 web.xml:
<error-page>
<location>/errors</location>
</error-page>請注意,此功能僅適用於 Servlet 版本大於 3.0。
應用程序中產生的任何錯誤都與 HTTP 錯誤代碼相關聯。例如,如果用户在瀏覽器中輸入 URL /invalidUrl,但未在 Spring 中定義相應的 RequestMapping,則底層 Web 服務器會生成 HTTP 代碼 404。我們剛剛添加的行告訴 Spring 執行映射到 URL /errors 的方法的邏輯。
這裏有一個快速的説明——對應的 Java Servlet 配置不幸的是沒有 API 用於設置錯誤頁面,因此在這種情況下,我們需要 web.xml。
4. The Controller
接下來,我們創建我們的 ErrorController。我們創建一個統一的方法,用於攔截錯誤並顯示錯誤頁面:
@Controller
public class ErrorController {
@RequestMapping(value = "errors", method = RequestMethod.GET)
public ModelAndView renderErrorPage(HttpServletRequest httpRequest) {
ModelAndView errorPage = new ModelAndView("errorPage");
String errorMsg = "";
int httpErrorCode = getErrorCode(httpRequest);
switch (httpErrorCode) {
case 400: {
errorMsg = "Http Error Code: 400. Bad Request";
break;
}
case 401: {
errorMsg = "Http Error Code: 401. Unauthorized";
break;
}
case 404: {
errorMsg = "Http Error Code: 404. Resource not found";
break;
}
case 500: {
errorMsg = "Http Error Code: 500. Internal Server Error";
break;
}
}
errorPage.addObject("errorMsg", errorMsg);
return errorPage;
}
private int getErrorCode(HttpServletRequest httpRequest) {
return (Integer) httpRequest
.getAttribute("javax.servlet.error.status_code");
}
}
5. 前端
為了演示目的,我們將錯誤頁面保持簡單緊湊。該頁面將僅包含在一個白色的屏幕上顯示的簡短消息。創建一個名為 errorPage.jsp 的 jsp 文件:
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<%@ page session="false"%>
<html>
<head>
<title>Home</title>
</head>
<body>
<h1>${errorMsg}</h1>
</body>
</html>6. 測試
我們將模擬應用程序中發生的兩種最常見錯誤:HTTP 404 錯誤和 HTTP 500 錯誤。
運行服務器,然後訪問 localhost:8080/spring-mvc-xml/invalidUrl。由於該 URL 不存在,我們期望看到帶有消息 'Http Error Code : 404. Resource not found' 的錯誤頁面。
讓我們看看當一個處理方法拋出 NullPointerException 時會發生什麼。我們向 ErrorController 中添加了以下方法:
@RequestMapping(value = "500Error", method = RequestMethod.GET)
public void throwRuntimeException() {
throw new NullPointerException("Throwing a null pointer exception");
}請前往 localhost:8080/spring-mvc-xml/500Error。 您應該看到一個空白屏幕,顯示“Http 錯誤代碼:500. 內部服務器錯誤”的消息。
7. 結論
我們學習瞭如何為不同的 HTTP 碼設置錯誤頁面,使用 Spring MVC。我們創建了一個錯誤頁面,其中錯誤消息會根據 HTTP 錯誤碼動態顯示。