Поиск по сайту:

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


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

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

Некоторое время назад я написал пост о директиве страницы jsp.

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

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

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

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

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

<%@ 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 — страница не найдена. Также обратите внимание на использование директивы include для предоставления пользователю страницы входа в случае любого исключения. Вот файл 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>