웹사이트 검색

서블릿 예외 및 오류 처리 예제 자습서


오늘 우리는 서블릿 예외 및 오류 처리에 대해 살펴볼 것입니다. 예전에 Java의 예외 처리에 대한 게시물을 썼지만 웹 애플리케이션에 관해서는 Java의 일반적인 예외 처리 이상이 필요합니다.

서블릿 예외

doGet() 및 doPost() 메소드가 javax.servlet.ServletExceptionIOException을 던진다는 것을 알게 되면 애플리케이션에서 이러한 예외를 던질 때 어떤 일이 발생하는지 살펴보겠습니다. ServletException을 발생시키는 간단한 서블릿을 작성하겠습니다.

package com.journaldev.servlet.exception;

import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/MyExceptionServlet")
public class MyExceptionServlet extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
		throw new ServletException("GET method is not supported.");
	}

}

서블릿 오류

서블릿 예외 및 오류 처리

Servlet API는 배포 설명자에서 구성할 수 있는 사용자 지정 예외 및 오류 처리기 서블릿에 대한 지원을 제공합니다. 이러한 서블릿의 전체 목적은 응용 프로그램에서 발생한 예외 또는 오류를 처리하고 유용한 HTML 응답을 사용자에게 보내는 것입니다. 애플리케이션 홈 페이지에 대한 링크 또는 일부 세부 정보를 제공하여 무엇이 잘못되었는지 사용자에게 알릴 수 있습니다. 따라서 먼저 사용자 지정 예외 및 오류 처리기 서블릿을 만들어야 합니다. 응용 프로그램에 대해 여러 예외 및 오류 처리기 서블릿을 가질 수 있지만 간단하게 하기 위해 단일 서블릿을 만들어 예외와 오류 모두에 사용하겠습니다. AppExceptionHandler.java

package com.journaldev.servlet.exception;

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@WebServlet("/AppExceptionHandler")
public class AppExceptionHandler extends HttpServlet {
	private static final long serialVersionUID = 1L;

	protected void doGet(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		processError(request, response);
	}

	protected void doPost(HttpServletRequest request,
			HttpServletResponse response) throws ServletException, IOException {
		processError(request, response);
	}

	private void processError(HttpServletRequest request,
			HttpServletResponse response) throws IOException {
		// Analyze the servlet exception
		Throwable throwable = (Throwable) request
				.getAttribute("javax.servlet.error.exception");
		Integer statusCode = (Integer) request
				.getAttribute("javax.servlet.error.status_code");
		String servletName = (String) request
				.getAttribute("javax.servlet.error.servlet_name");
		if (servletName == null) {
			servletName = "Unknown";
		}
		String requestUri = (String) request
				.getAttribute("javax.servlet.error.request_uri");
		if (requestUri == null) {
			requestUri = "Unknown";
		}
		
		// Set response content type
	      response.setContentType("text/html");
	 
	      PrintWriter out = response.getWriter();
	      out.write("<html><head><title>Exception/Error Details</title></head><body>");
	      if(statusCode != 500){
	    	  out.write("<h3>Error Details</h3>");
	    	  out.write("<strong>Status Code</strong>:"+statusCode+"<br>");
	    	  out.write("<strong>Requested URI</strong>:"+requestUri);
	      }else{
	    	  out.write("<h3>Exception Details</h3>");
	    	  out.write("<ul><li>Servlet Name:"+servletName+"</li>");
	    	  out.write("<li>Exception Name:"+throwable.getClass().getName()+"</li>");
	    	  out.write("<li>Requested URI:"+requestUri+"</li>");
	    	  out.write("<li>Exception Message:"+throwable.getMessage()+"</li>");
	    	  out.write("</ul>");
	      }
	      
	      out.write("<br><br>");
	      out.write("<a href=\"index.html\">Home Page</a>");
	      out.write("</body></html>");
	}
}

배포 설명자에서 구성하는 방법을 살펴본 다음 구현과 작동 방식을 이해합니다.

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="https://www.w3.org/2001/XMLSchema-instance" xmlns="https://java.sun.com/xml/ns/javaee" xsi:schemaLocation="https://java.sun.com/xml/ns/javaee https://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
  <display-name>ServletExceptionHandling</display-name>
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
  </welcome-file-list>
  
  <error-page>
  	<error-code>404</error-code>
  	<location>/AppExceptionHandler</location>
  </error-page>
  
  <error-page>
  <exception-type>javax.servlet.ServletException</exception-type>
  <location>/AppExceptionHandler</location>
  </error-page>
</web-app>
<error-page>
  <exception-type>java.lang.Throwable</exception-type>
  <location>/AppExceptionHandler</location>
</error-page>

여러 개의 오류 페이지 항목이 있는 경우 하나는 Throwable용이고 다른 하나는 IOException이고 응용 프로그램에서 FileNotFoundException이 발생한 경우 IOException의 오류 처리기에 의해 처리됩니다. JSP 페이지를 예외 처리기로 사용할 수도 있습니다. 서블릿 매핑이 아닌 jsp 파일의 위치만 제공하면 됩니다. 여기까지가 웹 애플리케이션의 서블릿 예외 처리에 관한 것입니다. 마음에 드셨기를 바랍니다.

서블릿 예외 처리 예제 프로젝트 다운로드

이 시리즈의 다른 기사를 확인하십시오.

  1. 자바 웹 애플리케이션
  2. 자바 서블릿 자습서
  3. 자바의 세션 관리
  4. 서블릿 필터
  5. 서블릿 리스너
  6. 서블릿의 쿠키
  7. 서블릿 파일 업로드 및 다운로드 예