2003年
"例外ハンドラ"はその名の通り例外を処理するクラスです。
例外ハンドラを使用するには以下のステップが必要です。
1. org.apache.struts.action.ExceptionHandlerクラスを継承したクラスを作成。
(特にデフォルトの振る舞いで良いならExceptionHandlerを使用しても良い)
2. struts-config.xmlに設定を追加。
3. エラー画面を用意する。
4. エラー画面用のエラーメッセージを追加。
それでは1. org.apache.struts.action.ExceptionHandlerクラスを継承したクラスを
作成しよう。
org.apache.struts.action.ExceptionHandlerの振る舞いにログ出力を加えました。
import javax.servlet.http.*;
import javax.servlet.ServletException;
import org.apache.commons.logging.*;
import org.apache.struts.action.*;
import org.apache.struts.config.ExceptionConfig;
/**
* ログファイルにスタックトレースを書き込むExceptionHandler。
* @author yamarou
*/
public class BasicExceptionHandler extends ExceptionHandler {
private static final String LINE_SEPARATOR = System.getProperty(
"line.separator");
private Log log = LogFactory.getLog(this.getClass());
/**
* ログファイルにスタックトレースを書き込む。
*/
public ActionForward execute(Exception ex,
ExceptionConfig config,
ActionMapping mapping,
ActionForm form,
HttpServletRequest request,
HttpServletResponse response)
throws ServletException {
//ログ出力
StringWriter sw = new StringWriter();
PrintWriter pw = new PrintWriter(sw);
ex.printStackTrace(pw);
pw.close();
log.error(LINE_SEPARATOR + sw.toString());
ActionForward forward = super.execute(ex, config, mapping,
form, request, response);
return forward;
}
}
次いで2. struts-config.xmlに設定を追加。
[struts-config.xml]
<exception
path="/exception.jsp"
key="exception.system"
type="java.lang.Exception"
handler="jp.gr.java_conf.yamarou.app.forum.BasicExceptionHandler"/>
</global-exceptions>
[意味]
"jp.gr.java_conf.yamarou.app.forum.BasicExceptionHandler"を呼び出してから、
"/exception.jsp"に遷移して下さい。遷移する前にActionErrorのキーに
"exception.system"を設定してください。
んでもって、3. エラー画面を用意する。
[exception.jsp]
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Frameset//EN">
<HTML>
<HEAD>
<link rel=stylesheet href="base.css" type="text/css">
<META http-equiv="Content-Language" content="ja">
<META http-equiv="Content-Type" content="text/html; charset=shift_jis">
<META http-equiv="pragma" content="no-cache">
<title>エラー画面</title>
<body>
<h1>エラー画面</h1>
<html:errors/>
<br>
<a href="javascript:top.window.close()">閉じる</a><br>
</body>
</html>
そして、4. エラー画面用のエラーメッセージを追加。
[ApplicationResources.properties]
それでは動作確認といきたいところですが、プログラムの中で例外が
発生しなければなりません。しかし、俺ちゃんの作ったプログラムは
出来が良すぎて通常エラーがおきません。
そこで、掲示板メッセージファイル(classes内のmessage.txt)を削除して
読み込む処理を実行することにしましょう。ファイルがないのに読もうとしたら
当然例外が発生します。
http://localhost:8080/forum/loadMessage.doにアクセスすると、
exception.jspに遷移してエラーメッセージを表示し、
java.lang.RuntimeException: java.lang.NullPointerException
以下スタックトレースが続く・・・
というのがログファイル(forum.log)に書き込まれます。
ファイルはTomcatの場合、TOMCAT_HOME/binに出来ます。
ログファイルの設定はlog4j.propertiesの以下の指定です。
[log4j.properties]
commons-loggingからlog4jを使用しています。(詳細はvol10参照)
ってなわけで、いかがだったでしょうか?例外ハンドラの素晴らしい所は
例外を処理するクラス(ExceptionHandler)と処理される例外クラスを
外部ファイル(struts-config.xml)で関連付けることが出来ることです。
これにより、例外処理を柔軟に変更できます。
最後にお知らせです。Strutsで掲示板のソースコード、JavaDocを閲覧するページを
作りました。アドレスは
ソースコード閲覧が
http://yamarou.at.infoseek.co.jp/src.html
JavaDocが
http://yamarou.at.infoseek.co.jp/docs/index.html
です。
次回はServletフィルタを取り上げます。
んじゃ
やまろう