1. 概述
在任何Web应用中,自定义错误页面都是一个常见的需求。例如,如果你在Tomcat上运行一个基本的Spring MVC应用,用户在浏览器中输入无效URL时,可能会看到一个不太友好的蓝色和白色堆栈跟踪,这并不理想。
在这个教程中,我们将设置一些HTTP错误代码的自定义错误页面。
假设读者对Spring MVC有一定的了解;如果没有,可以参考我们的入门教程:从零开始学习Spring MVC。
本文主要关注Spring MVC。关于如何在Spring Boot中创建自定义错误页面,请参考我们的文章:自定义白标错误页面。
2. 简单步骤
接下来,我们按照以下步骤操作:
- 在
web.xml
中指定一个单一的URL*/errors
,该URL映射到一个方法,当应用程序生成错误时将处理它。 - 创建一个名为
ErrorController
的控制器,其映射路径为*/errors
。 - 在运行时确定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错误代码动态显示。