Spring MVC 自定义错误页面
1. 概述
任何 Web 应用程序中的一个常见要求是自定义错误页面。
例如,假设您在 Tomcat 之上运行一个普通的 Spring MVC 应用程序。用户在他的浏览器中输入了一个无效的 URL,并显示了一个不那么用户友好的蓝白色堆栈跟踪 - 不理想。
在本教程中,我们将为一些 HTTP 错误代码设置自定义错误页面。
工作假设是读者对使用 Spring MVC 相当满意;如果没有,这是一个很好的开始方式 。
本文重点介绍 Spring MVC。我们的文章 自定义白标签错误页面 描述了如何在 Spring Boot 中创建自定义错误页面。
2. 简单的步骤
让我们从这里要遵循的简单步骤开始:
- 在web.xml中指定单个 URL /errors ,该 URL映射到每当生成错误时将处理错误的方法
- 使用映射*/errors创建一个名为ErrorController*的控制器
- 在运行时找出 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.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。内部服务器错误”的白屏。