連載
» 2002年03月13日 00時00分 公開

JSPコーディング・テクニック(4):エラー対処とパフォーマンス (1/3)

前回「文字列処理と入力チェック」までで、入力チェックの仕組みが組み込まれた共有ブックマークが出来上がりました。本連載の最終回となる今回は、予期しない内部エラーが発生したときのエラーページの表示方法と、コネクションプールを用いたデータベースアクセスの効率化について述べ、最後にこの連載のまとめを行います。

[三谷純,タイムインターメディア]

(1)内部エラーへの対応

 JSPプログラムの内部エラーが発生した場合、通常ではエラーの内容を示すメッセージがブラウザに表示されます。開発者にとっては有益な情報ですが、このメッセージが一般ユーザーに見られてしまうと、JSPプログラムの内部構造が分かってしまい、都合が悪いことがあります。

 JSPでは、内部エラーが発生したときにどのページを表示するかをページディレクティブで指定できます。この仕組みを使用することで、一般ユーザーにはエラーの詳細を隠しながら、管理者はエラーの詳細を調べられるようになります。当然のことながら、エラーログのチェックも重要ですが、Webページ上で簡単にエラーの内容を確認できる仕組みは便利です。

 今回紹介する、内部エラーに対する処理の流れは下図のようになります。

図 エラー発生時の処理の流れ 図 エラー発生時の処理の流れ

 まず、表示ページのディレクティブに次のように記述します。

<%@ page contentType="text/html; charset=euc-jp" errorPage="/error_page.jsp" %>

 errorPage="/error_page.jsp" の記述により、エラーが発生したときには、error_page.jspの内容が表示されるようになります。

 今回、このerror_page.jspでは、アクセスされたリモートIPアドレスをチェックし、ローカルIPであればエラーの詳細を表示し、そうでなければerror_message.jspへ再度転送し、一般ユーザー向けのエラーメッセージを表示するようにします。

エラーの発生するページ

 それでは、動作テスト用に次のようなエラーが発生するJSPプログラムを作成してみます。

1: <%@ page contentType="text/html; charset=euc-jp" errorPage="/error_page.jsp" %>
2: <%
3: // エラーの発生する例
4: Object nullObject = null;
5: out.println(nullObject.toString());
6: %>
エラーの発生する例のプログラム error_test.jsp

 上記のプログラムに文法的な誤りはありませんが、実体が存在しない(nullである)オブジェクトnullObjectに対して、5行目でtoString()メソッドを呼び出しているため、このJSPプログラムでは実行時にNullPointerExceptionが発生します。

エラーページ

 次に、実際にエラーが発生した場合に表示される error_page.jsp を次のように作成してみます。

 1: <%@ page isErrorPage="true" contentType="text/html; charset=euc-jp" %>
 2: <%
 3: // リモートIPアドレスがローカルIPでなかったら errro_message.jsp へ転送
 4: if(!request.getRemoteAddr().startsWith("192.168.")) {
 5: %><jsp:forward page="error_message.jsp" /><%
 6: }
 7: %>
 8: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 9: <html>
10: <head>
11: <meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
12: <title>エラー</title>
13: </head>
14: <body>
15: 次のようなエラーが発生しました。
16: <b><%= exception %></b><br>
17: <hr>
18: <pre>
19: <% exception.printStackTrace(new java.io.PrintWriter(out)); %>
20: </pre>
21: </body>
22: </html>
エラーが発生したときに処理されるJSPページ error_page.jsp

 エラーが発生したときに表示されるページとして使用されるJSPページでは、ディレクティブに

isErrorPage="true"

の記述を行います。

 これにより、発生したエラーがexceptionという暗黙オブジェクトに設定されます。このオブジェクトを参照することでエラーの内容を知ることができます。

 error_page.jspでは、リクエストのリモートIPアドレスを取得し、それが「192.168.」で始まる場合はローカルアドレスであると判断し、エラーの詳細を表示するための処理を行います。そうでない場合は、外部からのアクセスであると認識し、5行目でerror_message.jspへ処理を転送することで、一般ユーザー向けのエラーメッセージを表示します。

 エラーの内容は16行目で表示し、

16: <b><%= exception %></b><br>

その詳細はexceptionオブジェクトのprintStackTrace メソッドにより、

19: <% exception.printStackTrace(new java.io.PrintWriter(out)); %>

のように出力させています。

外部からのアクセスに対するエラーページ

 外部からアクセスしているユーザーに対しては、error_message.jspという一般的なエラー表示用のページを表示させることにします。エラーの詳細はあえて表示せずに、管理者へ報告するように依頼します。このページは、次のような単純なHTML文として作成しました。

 1: <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
 2: <html>
 3: <head>
 4:    <meta http-equiv="Content-Type" content="text/html; charset=euc-jp">
 5:     <title>エラー</title>
 6: </head>
 7: <body>
 8: エラーが発生しました。<br>
 9: 管理者へ御報告ください。<br>
10: <br>
11: <a href="javascript:history.go(-1)">戻る</a>
12: </body>
13: </html>
外部からのアクセスに対するエラーメッセージ error_message.jsp

エラーページの動作テスト

 以上のようにしてerror_test.jspへアクセスすると、ローカルアドレスからアクセスした場合に次のようなメッセージが表示されます。

 外部からアクセスした場合には、次のようなメッセージが表示されます。

 アクセス元のIPアドレスにより、表示するエラーの内容を切り替えることができました。

       1|2|3 次のページへ

Copyright © ITmedia, Inc. All Rights Reserved.

RSSについて

アイティメディアIDについて

メールマガジン登録

@ITのメールマガジンは、 もちろん、すべて無料です。ぜひメールマガジンをご購読ください。