본문 바로가기
Backend/Servlet & JSP

[Servlet & JSP] 에러 처리

by Forsaken Developer 2023. 5. 22.
728x90
728x90

[Servlet & JSP] 에러 처리

@WebServlet("/404error")
public class Error404Servlet extends HttpServlet {
	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
	    response.sendError(404,"페이지를 찾을 수 없습니다.");
	}
}

response 객체의 sendError 메소드를 통해서 의도적으로 error code와 error message를 응답할 수 있다.

위와 같은 톰캣에서 제공하고 있는 에러 페이지를 볼 수 있다.

우리가 직접 만든 에러 페이지를 보여주고 싶은 경우 별도의 처리가 필요하다.

error-page라는 element 하위에 error-code에 상태코드를 location에 요청할 서블릿 경로를 설정한다.

request 객체를 통해서 attribute라는 일종의 저장소에서 값을 저장하고 가져올 수 있다.

request의 getAttributesNames메소드를 통해서  attribute의 key를 확인해보면 javax.servlet.error.status_code와 javax.servlet.error.message라는 key가 있다.

이 key값을 request의 getAttrubute에 전달하면 value인 error status code와 error message를 가져올 수 있다.

@WebServlet("/errorPage")
public class ExceptionHandlerServlet extends HttpServlet {

	protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        StringBuilder errorPage = new StringBuilder();
        errorPage.append("<!doctype html>\n")
                 .append("<head>\n")
                 .append("</head>\n")
                 .append("<body>\n")
                 .append("<h1>\n")
                 .append(request.getAttribute("javax.servlet.error.status_code"))
                 .append(" - ")
                 .append(request.getAttribute("javax.servlet.error.message"))
                 .append("</h1>\n")
                 .append("</body>\n")
                 .append("</html>");
        
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        
        out.print(errorPage);
        out.flush();
        out.close();        
	}

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

동적 페이지를 만들어서 응답하는 과정은 동일하다.

POST요청이 왔을 때 doPost 메소드에서 doGet메소드를 호출하여 어떤 요청이 오더라도 동일한 로직 처리를 할 수 있다.

위와 같이 직접 제작한 에러 페이지를 볼 수 있게된다.

728x90
반응형

댓글