یکی از نیاز های مشترک در web application ها ایجاد صفحات نمایش خطا سفارشی است. نمایش صفحه خطای مرورگر به کاربر جلوه زیبایی ندارد و به کاربر اطلاعات کافی را در چرایی ایجاد این خطا و نحوه برگشت به مسیر درست را نمیدهد از طرفی داشتن صفحه خطای ویژه، web application را منحصر بفرد خواهد کرد و جلوه بهتری دارد
مراحل کار :
- تعریف کردن یک url منحصر بفرد ( مثلا error/ ) برای redirect کردن درخواست اشتباه کاربر به آن صفحه که View نمایش پیام خطا در آن وجود دارد
- ایجاد یک Controller که url خطای ما روی آن map شده است ( error/ )
- ساخت Http Status Code مناسب با خطا و پیام قابل مشاهده، مثلا برای 404 باید پیام "این صفحه موجود نمیباشد" و برای 500 پیام "خطای داخلی رخ داده است"
ابتدا URL صفحه خطا را در web.xml ست میکنیم :
<error-page> <location>/errors</location> </error-page>
توجه داشته باشید که این ویژگی فقط در سرولت 3 به بالا موجود است
و بعد کلاس Controller@ را میسازیم :
@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");
}
}
ساخت صفحه View :
<%@ 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>
و برای تست میتوانیم آدرس یک صفحه ای که وجود ندارد را بدهیم که 404 برگشت داده خواهد شد
و برای تست خطای داخلی 500 میتوانیم با ایجاد خطای NullPointerException آنرا شبیه سازی کنیم :
localhost:8080/spring-mvc-xml/500Error
@RequestMapping(value = "500Error", method = RequestMethod.GET)
public void throwRuntimeException() {
throw new NullPointerException("Throwing a null pointer exception");
}