1. 개요
모든 웹 애플리케이션의 공통 요구 사항은 사용자 정의된 오류 페이지입니다.
예를 들어 Tomcat 위에서 바닐라 Spring MVC 앱을 실행하고 있다고 가정합니다. 사용자가 브라우저에 잘못된 URL을 입력하면 사용자에게 그다지 친숙하지 않은 파란색 및 흰색 스택 추적이 표시됩니다. 이는 이상적이지 않습니다.
이 사용방법(예제)에서는 몇 가지 HTTP 오류 코드에 대해 사용자 지정 오류 페이지를 설정합니다.
작업 가정은 독자가 Spring MVC로 작업하는 데 상당히 익숙하다는 것입니다. 그렇지 않은 경우 시작하는 좋은 방법 입니다.
이 기사는 Spring MVC에 초점을 맞춥니다. Whitelabel 오류 페이지 사용자 정의 기사에서는 Spring Boot에서 사용자 정의 오류 페이지를 생성하는 방법을 설명합니다.
2. 간단한 단계
여기에서 수행할 간단한 단계부터 시작하겠습니다.
- 오류가 생성될 때마다 오류를 처리하는 메서드에 매핑 되는 단일 URL /errors 를 web.xml에 지정합니다.
- /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 을 입력 했지만 그러한 RequestMapping 이 Spring 내부에 정의 되지 않았다고 가정합니다 . 그런 다음 기본 웹 서버에서 생성된 404의 HTTP 코드입니다. web.xml에 방금 추가한 줄 은 URL /errors에 매핑된 메서드에 작성된 논리를 실행하도록 Spring에 지시 합니다.
여기서 잠깐 덧붙이자면 해당 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 오류 코드: 404. 리소스를 찾을 수 없음' 메시지와 함께 오류 페이지가 표시될 것으로 예상됩니다 .
핸들러 메소드 중 하나가 NullPointerException을 던질 때 어떤 일이 일어나는지 봅시다 . ErrorController에 다음 메서드를 추가합니다 .
@RequestMapping(value = "500Error", method = RequestMethod.GET)
public void throwRuntimeException() {
throw new NullPointerException("Throwing a null pointer exception");
}
에 가서 로컬 호스트 : 8080 / 스프링 MVC-XML / 500Error. 'Http 오류 코드: 500. 내부 서버 오류' 메시지와 함께 흰색 화면이 표시되어야 합니다.
7. 결론
Spring MVC를 사용하여 다른 HTTP 코드에 대한 오류 페이지를 설정하는 방법을 보았습니다 . HTTP 오류 코드에 따라 오류 메시지가 동적으로 표시되는 단일 오류 페이지를 만들었습니다.