グローバル例外を使う

 StrutsベースのアプリケーションでActionの処理中に例外が発生した場合、 デフォルトでは例外のスタックトレースを含んだシステム管理者向けのエラーメッセージが出力されます。 これをユーザ向けにカスタマイズするために、 例外のクラスによって特定のJSPページにフォワードするようにする、 グローバル例外(global-exceptions)の仕組みを利用すると便利です。 以下に手順を示します。

  1. struts-config.xmlの、global-exceptionsタグに、以下のように書き加えます。

    <global-exceptions>
      <exception key="error.global.sql"
         type="java.sql.SQLException" path="/error.jsp"/>
      <exception key="error.global.nullpo"
         type="java.lang.NullPointerException" path="/error.jsp"/>
      <exception key="error.global.app"
         type="my.common.AppTrapException" path="/error.jsp"/>
    </global-exceptions>
    

    この意味は、SQLException、NullPointerExceptionと、 自分で作った例外クラスのAppTrapExceptionが発生した場合に、 /error.jspページにフォワードする、という設定です。 key属性の値は、そのフォワード先(ここではerror.jsp)の中でエラーメッセージとして表示するためのメッセージのキーを指定します。
  2. アプリケーションのメッセージ・リソースの定義ファイル (ApplicationResources.properties)に、1.でkey属性に使った各キーに対応するメッセージを定義します。

    error.global.sql=データベース接続エラーが発生しました。
    error.global.nullpo=アプリケーションNullエラーが発生しました。
    error.global.app=アプリケーション論理エラーが発生しました。
    

  3. 以下にerror.jspの例を示します。

    <%@page pageEncoding="Windows-31J"%>
    <%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
    <html:html>
    <html:errors/>
    <p>システム担当者にお問い合わせ下さい。</p>
    </html:html>
    


グローバル例外の仕組みの発展的な使い方

 上で示した簡潔な手順はとても便利ですが、2つほど欠点があります。

  1. global-exceptionsで例外をフォワードすると、 その例外に対するスタックトレースがログファイルに出力されなくなる。
  2. エラーJSPページでhtml:errorsタグを使ってエラーメッセージを表示しているために、 エラーの見出し(メッセージリソースのerrors.headerとerrors.footerで定義する) が、ユーザの入力ミスのときに表示されるものと同じになってしまう。 例えばユーザの入力ミスの場合には「入力にエラーがあります。再入力して下さい」 のような見出しを出すようにしていると、 グローバル例外のときも「入力にエラーがあります〜」と表示されてしまい、 ユーザは??となる。
1.の問題を解決するには2つの方法があります。 1つめは、スタックトレースを出力するように拡張した、ExceptionHandlerの派生クラスを独自に開発する、 という方法です。もっと簡単な2つめの方法は、 エラーJSPページに次のようなスクリプトレットを埋め込むことです。

<%
Object o = request.getAttribute(Globals.EXCEPTION_KEY);
if (o != null) {
    Throwable t = (Throwable) o;
    out.println("[" + t.toString() + "]");
    // サーブレットコンテナの標準出力(コンソール)に出力する場合
    t.printStackTrace();
    // Webアプリケーションのログに出力する場合
    application.log("Application Error Detected and Forwarded", t);
}
%>

2.の問題を解決するには、エラーJSPページに、 html:errorsタグの代わりに、html:messagesタグを使って次のように自分でメッセージの表示をデザインします。

<ul>
 <html:messages id="error">
 <li><bean:write name="error"/></li>
 </html:messages>
</ul>

(上のエラーJSPページではtaglibディレクティブでbeanタグライブラリの宣言をしてないので、 それも追加する必要があります)

Server Side Java Index Top

(first uploaded 2004/01/01 last updated 2004/01/01, URANO398)

楽天モバイル[UNLIMITが今なら1円] ECナビでポインと Yahoo 楽天 LINEがデータ消費ゼロで月額500円〜!


無料ホームページ 無料のクレジットカード 海外格安航空券 解約手数料0円【あしたでんき】 海外旅行保険が無料! 海外ホテル