본문 바로가기
JSP

JSP 예외처리

by 요리하다그만둠 2022. 7. 13.

TOC(해결사 페이지)

  • 에러 페이지 지정 & 에러 페이지 작성
  • 응답 상태 코드 별 에러 페이지 지정
  • 예외 타입 별 에러 페이지 지정
  • 에러 페이지 우선 순위 및 에러 페이지 지정 형태
  • 버퍼와 에러 페이지 관계

 

에러 페이지 지정 & 에러 페이지 작성

  • <%@ page errorPage = "예외발생시 보여질 JSP지정" %>

에러 페이지 작성

-- <%@ page is ErrorPage ="true" %>

  • isErrorPage 속성이 ture 인 경우 에러 페이지로 지정

-- exception 기본 객체 : 발생한 예외 객체

  • exception.getMessage() : 예외 메시지
  • exception.printStackTrace() : 예외 추적 메시지 출력

-- IE에서 예외가 올바르게 보여지려면 에러 페이지가 응답 데이터 크기가 513 바이트보다 커야함

 

 

name 파리미터 없이 jsp를 실행해 보았습니다.

실행화면

에러 화면

이 과정에서 무슨 에러가 있는지 알수 있지만 사용자에게는 좋아 보이지 않습니다.

또한 코드가 노출 되기 때문에 보안 측면에서도 좋지않습니다.

 

try catch 문을 사용해서 작동시켜보면

요런 화면이 나오게 됩니다.

 

에러 페이지 지정하기

 

JSP는 실행 도중 익셉션이 발생할 때 위에 에러화면 대신 지정한 JSP 페이지를 보여줄 수 있는 기능을 제공하고 있습니다.

익셉션이 발생하면 보여줄 JSP 페이지는 page 디렉티브의 errorPage 속성을 사용해서 지정합니다.

 <%@ page errorPage = "/error/viewErrorMessge.jsp" %>
 // 익셉션이 발생하면 /error/viewErrorMessage.jsp 페이지를 실행하도록 지정합니다.

 

에러 페이지 작성하기

 

page 디렉티브의 errorPage 속성을 사용해서 에러 페이지를 지정하면, 에러가 발생할 때 지정한 에러 페이지를 사용하게 됩니다. 에러 페이지에 해당하는 JSP 페이지는 page 디렉티브의 isErrorPage ="true" 로 지정해야 합니다. 

출력해보면 

익셉션이 발생하면서 요렇게 지정한 JSP 페이지가 사용된걸 볼수 있습니다.

 

에러 코드 별로 에러 페이지를 지정해 줄수도 있는데

웹 서버는 존재하지 않는 페이지에 대한 요청을 받으면 

 

요런 에러 페이지로 응답해 줍니다. 화면은 웹 서버나 WAS 마나 다르다고 합니다.

실제 서비스를 제공할 땐 위에 사진과 같은 화면을 사용자에게 그대로 보여주지 않고, 알맞은 에러 페이지를 보여줍니다.

JSP/서블릿은 에러 코드별로 사용할 에러 페이지를 web.xml 파일에 지정할 수 있습니다.

 

<?xml version="1.0" encoding="utf-8">

<web-app ......>

....
	<error-page>
    	<error-code> 에러 코드 </error-code>
        <location>에러페이지의URI</location>
    </error-page>
....
</web-app>

 

<error-page> 태그는 한 개의 여러 페이지를 지정합니다. <error-code> 태그는 에러 상태 코드를 지정하고 <location> 태그는 에러 페이지로 사용할 JSP 파일의 경로를 지정합니다.

예를 들면 페이지가 존재하지 않을 때 발생하는 404 코드와 서버 내부 에러 코드인 500 에러 코드에 대해서 에러 페이지로 각각  /error/error404.jsp, /error/error500.jsp 를 사용하고 싶다면 아래처럼 <error-page> 태그를 추가해 주면됩니다.

 

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
				xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
				xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
				http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
				version = "3.1">
				
<error-page>
	<error-code>404</error-code>
	<location>/error/error404.jsp</location>
	<!-- 404 에러 응답 화면으로 /error/error404.jsp 를 사용하게 됩니다. -->
</error-page>

<error-page>
	<error-code>500</error-code>
	<location>/error/error500.jsp</location>
	<!-- 500 에러 응답 화면으로 /error/error500.jsp 를 사용하게 됩니다. -->
</error-page>
	</web-app>

JSP 페이지에서 발생하는 익셉션 종류별로 에러 페이지를 지정할 수도 있습니다. 

<error-code> 태그 대신에 <exception-type) 태그를 사용하면 됩니다.

<error-page>
	<exception-type> java.lang.NullPointerException</exception-type>
    <location>/error/errorNullpointer.jsp</location>
</error-page>

이 코드는 JSP 페이지에서 NullPointException이 발생할 경우 errorNullPointer.jsp를 에러 페이지로 보여준다는 것을 의미 해줍니다.

 

<?xml version="1.0" encoding="UTF-8"?>

<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
				xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
				xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
				http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
				version = "3.1">
				
<error-page>
	<error-code>404</error-code>
	<location>/error/error404.jsp</location>
	<!-- 404 에러 응답 화면으로 /error/error404.jsp 를 사용하게 됩니다. -->
</error-page>

<error-page>
	<error-code>500</error-code>
	<location>/error/error500.jsp</location>
	<!-- 500 에러 응답 화면으로 /error/error500.jsp 를 사용하게 됩니다. -->
</error-page>

<error-page>
	<exception-type> java.lang.NullPointerException</exception-type>
    <location>/error/errorNullpointer.jsp</location>
</error-page>

				</web-app>

 

 

errorNullPointer.jsp 페이지를 생성해 주었습니다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>NULL 에러 발생</title>
</head>
<body>
<strong>서비스 처리 과정에서 널(NULL) 에러가 발생하였습니다.</strong>
</body>
</html>

또한 ExceptionEx파일과 동일하지만 에러 페이지만 지정하지 않은 ExceptionEx2를 만들어 주었습니다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>파라미터 출력</title>
</head>
<body>
name 파라미터 값 :
<%=request.getParameter("name").toUpperCase() %>
</body>
</html>

실행 시켜보면

<error-page> 태그로 지정한 페이지의 결과 가 나옵니다.

 

에러 페이지의 우선 순위

  1. page 디렉티브의 errorPage 속성에서 지정한 에러 페이지를 보여줍니다.
  2. JSP 페이지에서 발생한 예외 타입이 web.xml 파일의 <exception-type>에서 지정한 예외 타입과 동일한 경우 지정한 에러 페이지를 보여줍니다.
  3. JSP 페이지에서 발생한 에러 코드가 web.xml 파일의 <error-code>에서 지정한 에러 코드가 동일한 경우 지정한 에러 페이지를 보여줍니다.
  4. 아무것도 해당되지 않을 경우 웹 컨테이너가 제공하는 기본 에러 페이지를 보여줍니다.

버퍼와 에러 페이지

 에러 페이지는 버퍼가 플러스 되기 전에 처리 되어야 합니다.

 

버퍼를 플러시 한 다음에 익센션이 발생되는 JSP 페이지를 작성해 보았습니다.

<%@ page language="java" contentType="text/html; charset=UTF-8"
    pageEncoding="UTF-8"%>
    <%@ page buffer ="1kb" %> <!-- 버퍼의 크기를 1kb로 지정 -->
    <%@ page errorPage = "/error/viewErrorMessage.jsp" %> <!-- 에러페이지 지정 -->
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8">
<title>버퍼 플러시 이후 에러 발생 결과</title>
</head>
<body>
<%
	for(int i=0; i<300; i++) {out.println(i);} 
	// 1kb를 초과하는 데이터를 출력해서 버퍼가 플러시 되도록 합니다. 이 과정에서 200 응답 코드가 전송됩니다.
%>
<%= 1 / 0 %> <!-- 자바에서 0으로 나누면 ArithmeticException이 발생됩니다. 익셉션이 발생하므로
					errorPage로 지정한 viewErrorMessage.jsp로 이동됩니다. -->
</body>
</html>

출력하게되면 아래와 같습니다. 

for문까지는 웹 브라우저로 전송되며 그 밑에부터는 익셉션이 발생되어 에러 페이지로 이동하게됩니다. 

'JSP' 카테고리의 다른 글

JSP javabeans  (0) 2022.07.14
JSP 쿠키  (0) 2022.07.13
JSP HTML FORM  (0) 2022.07.11
JSP request  (0) 2022.07.11
JSP 시작 웹 프로그래밍  (0) 2022.07.08