便利なコードパーツ集!

やまろうのプログラミングTips

Java

Strutsで掲示板作る!例外ハンドラを使おう

投稿日:2016年12月6日 更新日:

スポンサーリンク



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の振る舞いにログ出力を加えました。

package jp.gr.java_conf.yamarou.app.forum;import java.io.*;
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]

<global-exceptions>
<exception
path="/exception.jsp"
key="exception.system"
type="java.lang.Exception"
handler="jp.gr.java_conf.yamarou.app.forum.BasicExceptionHandler"/>
</global-exceptions>

[意味]

"java.lang.Exception"がActionクラスから投げられた場合、
"jp.gr.java_conf.yamarou.app.forum.BasicExceptionHandler"を呼び出してから、
"/exception.jsp"に遷移して下さい。遷移する前にActionErrorのキーに
"exception.system"を設定してください。

んでもって、3. エラー画面を用意する。
[exception.jsp]

<%@ page language="java" contentType="text/html;charset=Shift_JIS" %>
<%@ 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]

exception.system=システムで障害が発生しました。

それでは動作確認といきたいところですが、プログラムの中で例外が
発生しなければなりません。しかし、俺ちゃんの作ったプログラムは
出来が良すぎて通常エラーがおきません。

そこで、掲示板メッセージファイル(classes内のmessage.txt)を削除して
読み込む処理を実行することにしましょう。ファイルがないのに読もうとしたら
当然例外が発生します。

http://localhost:8080/forum/loadMessage.doにアクセスすると、

exception.jspに遷移してエラーメッセージを表示し、

2003-10-20 09:50:56,328 (BasicExceptionHandler.java:43) -
java.lang.RuntimeException: java.lang.NullPointerException
以下スタックトレースが続く・・・

というのがログファイル(forum.log)に書き込まれます。
ファイルはTomcatの場合、TOMCAT_HOME/binに出来ます。

ログファイルの設定はlog4j.propertiesの以下の指定です。
[log4j.properties]

log4j.appender.Default.File=forum.log

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フィルタを取り上げます。
んじゃ
やまろう

スポンサーリンク

-Java

Copyright© やまろうのプログラミングTips , 2020 AllRights Reserved Powered by AFFINGER4.