知識庫 / Spring / Spring MVC RSS 訂閱

自定義錯誤頁面與 Spring MVC

Spring MVC
HongKong
8
02:44 PM · Dec 06 ,2025

1. 概述

在任何Web應用程序中,定製錯誤頁面是一個常見需求。

例如,假設您正在運行一個純Spring MVC應用程序,該應用程序基於Tomcat。 用户在瀏覽器中輸入一個無效URL,並看到一個不太友好的藍色和白色堆棧跟蹤——這不太理想。

在本教程中,我們將為幾個HTTP錯誤代碼設置定製的錯誤頁面。

假設讀者對Spring MVC的工作方式已經比較熟悉;如果不是,這是一個很好的入門方式。

本文重點介紹Spring MVC。 我們的文章《自定義Whitelabel錯誤頁面》描述瞭如何在Spring Boot中創建自定義錯誤頁面。

2. 簡單步驟

我們先按照以下簡單步驟進行:

  1. 指定一個 URL /errorsweb.xml 中,該 URL 將映射到一個方法,用於處理任何錯誤發生時產生的錯誤
  2. 創建一個名為 ErrorController 的控制器,並設置一個映射 /errors
  3. 在運行時確定 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.jspjsp 文件:

<%@ 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 錯誤碼動態顯示。

user avatar
0 位用戶收藏了這個故事!
收藏

發佈 評論

Some HTML is okay.