JSP例外処理 – JSPエラーページ
JSPにおける例外処理は、JSPの例外ページで行われます。
JSPにおける例外処理
以前、私はServletの例外処理についての投稿を書いたことがあります。なぜそれが必要かについても説明しました。同じ説明はJSPページにも適用されますし、そのためにJava EEはJSPエラーページを使用した例外処理に対して明確なアプローチを提供しています。JSPページでスローされる例外を処理するためには、エラーページとJSPのページ指示子を使用してエラーページを定義すれば十分です。
JSPエラーページ
JSPエラーページを作成するためには、pageディレクティブの属性isErrorPageの値をtrueに設定する必要があります。そうすることで、JSP内で例外JSP暗黙オブジェクトにアクセスし、それを使用してクライアントにカスタマイズされたエラーメッセージを送信することができます。
JSPエラーページの設定
我々は、JSPのserviceメソッドによってスローされる例外を処理するために、pageディレクティブのerrorPage属性を設定する必要があります。JSPのエラーページがサーブレットコードに変換される際には、Tomcatではorg.apache.jasper.runtime.HttpJspBaseを継承します。
エラーページのデプロイ記述子の設定
多くの場合、私たちはすべてのJSPで使用したい共通のエラーページを持っています。そのため、個別にすべてのJSPで設定する代わりに、web.xmlにエラーページ要素を定義することができます。また、404などの他のエラーコードの処理もJSPエラーページで設定することができます。これらがどのようにウェブアプリケーションで組み合わさるかを見てみましょう。以下の画像のようなプロジェクト構造を持つ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>
入力パラメータがnullまたは空である場合、ServletExceptionが適切なメッセージとともにスローされ、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>
上記のアプリケーションを実行すると、以下のページが応答として表示されます。 ログインページ 例外のためのJSPエラーページ 404エラーコードのためのJSPエラーページ 以上がJSPページでの例外処理です。これは非常に簡単に実装できるため、すべての例外とエラーコードを処理し、コンテナのデフォルトのエラーページではなく、有用な応答をクライアントに送信するために使用するべきです。