JSP공부를 하다가 혹은 인터넷 웹 서핑을 즐기다가 위와 비슷한 페이지를 만난적이 있을겁니다

만약 프로그래밍을 모르는 일반 사용자라면 거부감을 느낄수가 있습니다. 또한 중요한기능을 하는 웹 사이트에서 이런 영어 + 뭔지모르는 기호로 작성된 화면이 나타나면 그 웹사이트에 대해서는 신뢰감이 떨어질 수도 있습니다.

그래서 웹 사이트에서 에러가 발생됬을 경우 위와 같이 딱딱한 페이지를 출력하지말고 사용자들이 문제가 생겼음을 쉽게 알 수 있도록 이쁘게 만들어진 안내페이지를 보여주면 참 좋을거같습니다.


예외가 발생했을때 위 처럼 딱딱한 페이지가 아닌 에러페이지를 호출하기 위한 방법은 3가지가 있습니다.

1. page디렉티브를 사용한 페이지 호출

2. web.xml의 error-code태그사용한 페이지 호출

3. web.xml의 exception-type태그를 이용해 예외타입별로 페이지 호출


1. page디렉티브 사용하기

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page errorPage="errorCheck.jsp"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
        int num = 10/0;
   %>
</body>
</html>
cs

12번라인처럼 0으로 나누면 당연히 예외가 발생합니다.

이때 톰캣에서 제공하는 딱딱한 에러화면 말고 직접 에러페이지를 만들어서 보여주기위해 3번라인처럼

page디렉티브를 이용했습니다.

page디렉티브의 errorPage속성을 이용해서 에러가나면 errorCheck.jsp로 이동해라~ 라고 알려주는겁니다.

실행을 해보면~


Error.jsp에서 예외가 발생이 되서 에러페이지(errorCheck.jsp)가 출력이 됩니다.


errorCheck.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%@ page isErrorPage="true"%>
<%response.setStatus(200);%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title></title>
</head>
<body>
<h2>0으로 나눌수 없어요~</h2>
에러메시지 : <%=exception.getMessage()%>
</body>
</html>
cs

위에서 봐야할 코드는 3번라인, 4번라인 입니다.

3번라인의 page디렉티브의 isErrorPage속성을 true로 해줌으로써 이 페이지는 에러페이지임을 알려줍니다.

그리고 true여야 13번라인에서 사용된 exception기본객체를 사용할 수 있습니다.

기본값은 false이기 때문에 지워버리면 exception객체를 사용할 수 없습니다.

13번라인에서 getMessage()를 이용해서 에러메시지를 출력해줬습니다.

그리고 4번라인을 사용한 이유를 정리해보겠습니다.

웹 페이지는 status라는 상태값을 가지고 있습니다. 이 상태값으로 현재 웹페이지가 정상인지 에러인지를 알수 있습니다.

그런데 우리가 만든 에러페이지는 에러라고 알려주기 위한 정상적인 페이지인데 간혹 status가 500인 상태로 설정이 되는 경우가 있습니다.(500은 서버내부의오류)

그래서 response.setStatus(200)을 이용해서 현재 이 페이지는 정상적인 페이지라고 알려주는겁니다(200은 에러가없이 정상적으로 전송됬음을 의미)


2. web.xml을 사용하기(error-code태그이용)

이번엔 page디렉티브가 아닌 web.xml을 이용하는 방법입니다.

WEB-INF폴더 아래에 web.xml파일이 있습니다

(혹시 없으신분들 제 포스팅중 [JSP] 04. JSP 맛보기!! 에서 3번째 이미지 처럼 web.xml파일을 만들어줘야 합니다)

1
2
3
4
5
6
7
8
9
10
11
12
    ...
 
      <error-page>
          <error-code>500</error-code>
          <location>/error/error500.jsp</location>
    </error-page>
    <error-page>
          <error-code>404</error-code>
          <location>/error/error404.jsp</location>
    </error-page>
 
    ...
cs

위와 같이 error-page태그안에 error-code태그와 location태그를 사용합니다.

error-code태그에는 상태값을 세팅해주고

location태그에는 해당 상태값일 경우 표시해줄 에러페이지의 위치를 설정해줍니다.


Error.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
    <%
        int num = 10/0;
   %>
</body>
</html>
cs

page디렉티브는 사용하지 않으므로 지워줘야합니다.

이 소스코드를 실행하면 500에러가 나타나므로 error500.jsp를 보여줄겁니다.

error500.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%response.setStatus(200);%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>500에러 페이지 입니다.</h1>
</body>
</html>
cs


404errorTest.jsp

1
2
3
4
5
6
7
8
9
10
11
12
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
 <a href="ABC.jsp">ABC.jsp</a>
</body>
</html>
cs

ABC.jsp라는 페이지는 없으므로 404에러가 발생하겠네요.

error404.jsp

1
2
3
4
5
6
7
8
9
10
11
12
13
<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<%response.setStatus(200);%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>Insert title here</title>
</head>
<body>
<h1>404에러 페이지 입니다.</h1>
</body>
</html>
cs


3. exception-type태그 이용하기 

두번째 방법과 마찬가지고 web.xml파일에서 작업이 이루어집니다.

exception의 타입별로 에러페이지를 지정해 주는겁니다.

1
2
3
4
      <error-page>
          <exception-type>java.lang.ArithmeticException</exception-type>
          <location>/error/error500.jsp</location>
    </error-page>
cs

이렇게 해주고 위에서 해봤던 0으로 나눗셈하는 페이지를 실행해보면 정상적으로 에러페이지가 나올겁니다.



따라서~

별도의 에러페이지가 필요하다면 page디렉티브를 사용!

자주사용되는 에러코드를 대비하려면 web.xml에서 error-code태그를 사용하고!!

따로 처리해주어야할 예외라면 web.xm에서 exception-type태그를 사용하자!!