Contents

Spring MVC 自定义错误页面

1. 概述

任何 Web 应用程序中的一个常见要求是自定义错误页面。

例如,假设您在 Tomcat 之上运行一个普通的 Spring MVC 应用程序。用户在他的浏览器中输入了一个无效的 URL,并显示了一个不那么用户友好的蓝白色堆栈跟踪 - 不理想。

在本教程中,我们将为一些 HTTP 错误代码设置自定义错误页面。

工作假设是读者对使用 Spring MVC 相当满意;如果没有,这是一个很好的开始方式

本文重点介绍 Spring MVC。我们的文章 自定义白标签错误页面  描述了如何在 Spring Boot 中创建自定义错误页面。

2. 简单的步骤

让我们从这里要遵循的简单步骤开始:

  1. web.xml中指定单个 URL /errors ,该 URL映射到每当生成错误时将处理错误的方法
  2. 使用映射*/errors创建一个名为ErrorController*的控制器
  3. 在运行时找出 HTTP 错误代码,并根据 HTTP 错误代码显示消息。例如,如果生成 404 错误,那么用户应该会看到类似*‘Resource not found’* 的消息,而对于 500 错误,用户应该会在*‘Sorry! 我们端产生了内部服务器错误’*

3. web.xml

我们首先将以下几行添加到我们的web.xml中:

<error-page>
    <location>/errors</location>
</error-page>

请注意,此功能仅在大于 3.0 的 Servlet 版本中可用。

应用程序中生成的任何错误都与 HTTP 错误代码相关联。例如,假设用户在浏览器中输入了一个 URL /invalidUrl,但是Spring 内部没有定义这样的RequestMapping。然后,由底层 Web 服务器生成一个 404 的 HTTP 代码。我们刚刚添加到web.xml中的行告诉 Spring 执行在映射到 URL /errors 的方法中编写的逻辑。

这里有一个快速的旁注——不幸的是,相应的 Java Servlet 配置没有用于设置错误页面的 API——所以在这种情况下,我们实际上需要web.xml

4. 控制器

继续,我们现在创建我们的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。内部服务器错误”的白屏。