Обработка исключений JSP – Страница ошибки JSP

Исключения в JSP обрабатываются страницами исключений JSP.

Обработка исключений в JSP

Некоторое время назад я написал статью о Обработке исключений в сервлете и о том, зачем нам это нужно. Та же самая логика применима и для страниц JSP, и поэтому Java EE предоставляет четкий подход к обработке исключений в JSP с использованием страниц ошибок JSP. Для обработки исключений, брошенных страницей JSP, нам просто нужна страница ошибки, и мы можем определить ее в JSP с помощью директивы страницы jsp.

Страница ошибки JSP

Чтобы создать страницу ошибки JSP, нам нужно установить значение атрибута isErrorPage директивы страницы в true, затем мы можем получить доступ к исключению через неявный объект jsp в JSP и использовать его для отправки настраиваемого сообщения об ошибке клиенту.

Конфигурация страницы ошибок JSP

Нам нужно установить атрибут директивы страницы errorPage для определения JSP, которая будет обрабатывать любое исключение, брошенное методом обслуживания JSP. Когда страница ошибки JSP транслируется в сервлетный код, она расширяет org.apache.jasper.runtime.HttpJspBase в Tomcat.

Конфигурация дескриптора развертывания страницы ошибок

В большинстве случаев у нас есть общая страница ошибок, которую мы хотим использовать для всех JSP, поэтому вместо конфигурации её во всех JSP индивидуально, мы можем определить страницу ошибок в web.xml с элементом error-page. Мы можем настроить страницу ошибок JSP для обработки других кодов ошибок, таких как 404. Давайте посмотрим, как всё это сочетается в веб-приложении. Мы создадим простое веб-приложение JSPExceptionHandling, структура проекта которого будет выглядеть как на изображении ниже. Точкой входа приложения является index.jsp, код которого приведен ниже.

<%@ page language="java" contentType="text/html; charset=US-ASCII"
    pageEncoding="US-ASCII"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Login Page</title>
</head>
<body>
<form action="login.jsp" method="post">
<strong>User ID</strong>:<input type="text" name="id"><br>
<strong>Password</strong>:<input type="password" name="password"><br>
<input type="submit" value="Login">
</form>
</body>
</html>

Когда мы отправляем форму, запрос отправляется на login.jsp, код выглядит примерно так.

<%@ page language="java" contentType="text/html; charset=US-ASCII"
    pageEncoding="US-ASCII" errorPage="error.jsp"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>User Home Page</title>
</head>
<body>
<%
	String user = request.getParameter("id");
	String pwd = request.getParameter("password");
	
	if(user == null || "".equals(user) || pwd == null || "".equals(pwd)){
		throw new ServletException("Mandatory Parameter missing");
	}
	
%>

<%-- do some DB processing, not doing anything for simplicity --%>
Hi <%=user %>
</body>
</html>

Обратите внимание, что при нулевых или пустых входных параметрах генерируется исключение ServletException с соответствующим сообщением, а errorPage определен как error.jsp, код которого приведен ниже.

<%@ page language="java" contentType="text/html; charset=US-ASCII"
    pageEncoding="US-ASCII" isErrorPage="true"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "https://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
<title>Error Page</title>
</head>
<body>
<% if(response.getStatus() == 500){ %>
<font color="red">Error: <%=exception.getMessage() %></font><br>

<%-- include login page --%>
<%@ include file="index.jsp"%>
<%}else {%>
Hi There, error code is <%=response.getStatus() %><br>
Please go to <a href="/index.jsp">home page</a>
<%} %>
</body>
</html>

Заметьте, что значение атрибута директивы страницы isErrorPage установлено в true. Когда ресурсы приложения вызывают исключения, код ошибки – 500, написан для обработки как исключений на уровне приложения, так и ошибок, таких как 404 – страница не найдена. Также обратите внимание на использование директивы включения для предоставления пользователю страницы входа в случае любого исключения. Вот файл web.xml, в котором мы определяем страницу ошибки для приложения.

<?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>JSPExceptionHandling</display-name>
  <welcome-file-list>
    <welcome-file>index.jsp</welcome-file>
   </welcome-file-list>
   
   <error-page>
   <error-code>404</error-code>
   <location>/error.jsp</location>
   </error-page>
   
   <error-page>
   <exception-type>java.lang.Throwable</exception-type>
   <location>/error.jsp</location>
   </error-page>
   
</web-app>

Теперь, когда мы запускаем вышеупомянутое приложение, мы получаем следующие страницы в ответ. Страница входа Страница ошибки JSP для исключения Страница ошибки JSP для кода ошибки 404 Вот и все для обработки исключений на страницах JSP. Реализация очень проста, и мы должны использовать ее, чтобы гарантировать обработку всех исключений и кодов ошибок и отправлять полезный ответ клиенту, а не стандартную страницу ошибки контейнера.

Source:
https://www.digitalocean.com/community/tutorials/jsp-exception-handling-jsp-error-page