1. 概述

在任何Web应用中,自定义错误页面都是一个常见的需求。例如,如果你在Tomcat上运行一个基本的Spring MVC应用,用户在浏览器中输入无效URL时,可能会看到一个不太友好的蓝色和白色堆栈跟踪,这并不理想。

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

假设读者对Spring MVC有一定的了解;如果没有,可以参考我们的入门教程:从零开始学习Spring MVC

本文主要关注Spring MVC。关于如何在Spring Boot中创建自定义错误页面,请参考我们的文章:自定义白标错误页面

2. 简单步骤

接下来,我们按照以下步骤操作:

  1. web.xml中指定一个单一的URL */errors,该URL映射到一个方法,当应用程序生成错误时将处理它。
  2. 创建一个名为ErrorController的控制器,其映射路径为*/errors
  3. 在运行时确定HTTP错误代码,并根据HTTP错误代码显示相应的消息。例如,如果生成了404错误,用户应看到“资源未找到”的提示,而对于500错误,用户应看到“抱歉!在我们的服务器端产生了内部服务器错误”的信息。

3. web.xml

首先,我们在web.xml中添加以下内容:

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

请注意,此功能仅在Servlet版本3.0以上可用。应用程序内产生的任何错误都与HTTP错误代码相关联。例如,如果用户在浏览器中输入/invalidUrl,但Spring中没有定义相应的RequestMapping,则底层Web服务器会生成404错误。我们刚刚添加到web.xml的代码告诉Spring执行映射到/errors URL上的方法中的逻辑。

这里有一个小注释:对应的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.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”消息的错误页面。

现在,让我们看看当ErrorController中的某个处理方法抛出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 Error Code : 500. Internal Server Error”。

7. 总结

我们了解了如何使用Spring MVC为不同的HTTP代码设置错误页面。我们创建了一个单一的错误页面,其中错误消息根据HTTP错误代码动态显示。


« 上一篇: OkHttp 使用教程
» 下一篇: Java字符串转换