JSP例外処理 – JSPエラーページ

例外処理はJSPでJSP例外ページによって行われます。

JSPにおける例外処理

以前、私はServlet例外処理についての記事を書き、なぜそれが必要なのかについて説明しました。同じ説明がJSPページにも適用され、そのためJava EEはJSPでの例外処理に対する明確なアプローチを提供しています。JSPページでスローされる例外を処理するために必要なのは、エラーページとjspページディレクティブを使用してJSPでエラーページを定義するだけです。

JSPエラーページ

JSPエラーページを作成するには、ページディレクティブの属性isErrorPageの値をtrueに設定し、それからJSPで例外jsp暗黙のオブジェクトにアクセスして、それを使用してクライアントにカスタマイズされたエラーメッセージを送信することができます。

JSPエラーページの設定

ページディレクティブerrorPage属性を設定する必要があります。これにより、JSPサービスメソッドでスローされた例外を処理するJSPが定義されます。JSPエラーページがサーブレットコードに変換されると、Tomcatではorg.apache.jasper.runtime.HttpJspBaseを拡張します。

エラーページのデプロイメント記述子の設定

ほとんどの場合、すべてのJSPで共通のエラーページを使用したいので、個々のJSPでそれを構成する代わりに、web.xmlでエラーページを定義できます。これをerror-page要素で行います。また、404などの他のエラーコードを処理するために、JSPエラーページを設定できます。これらがウェブアプリケーションでどのように組み合わされるかを見てみましょう。以下のイメージのように、プロジェクト構造が表示されます。アプリケーションのエントリーポイントは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>

お知らせ:入力パラメータがnullまたは空の場合、それはServletExceptionをスローし、適切なメッセージとerrorPageerror.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>

上記のアプリケーションを実行すると、次のページが応答として表示されます。ログインページ 例外のためのJSPエラーページ 404エラーコードのためのJSPエラーページ JSPページでの例外処理に関するすべての情報を実装するのは非常に簡単であり、すべての例外とエラーコードを処理し、コンテナのデフォルトのエラーページではなく、有用な応答をクライアントに送信するために使用する必要があります。

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