Top / Struts / 例外ハンドラ(ExceptionHandler)を用いた宣言的な例外処理

Strutsの例外処理についてまとめます。Strutsの例外処理はいわゆる宣言的な例外処理機構があります。 全てのアクション、もしくは特定のアクションで××Exceptionが発生した場合はこのエラー画面へ遷移、などということができます。また、ある例外が発生したときに画面遷移だけでなく特殊な処理をしたい場合、例外ハンドラを定義することによって処理を組み込むこともできます。たとえばある例外で、内部のエラーIDを見て遷移先を切り替えたい、なんてことが可能です。

やってみる

サンプルで見てみます。アクションクラスで特定の例外(NormalException?としました)が発生したときに、error.jspに遷移させることを考えます。

流れ

normalEx -> エラー発生 -> error.jsp

という流れのサンプルです。

ソース

NormalException?をスローしたらerror.jspに遷移しなさい、またerror.NormalException?というキー値のActionMessage?を作成しなさい、という意味です。

例外がスローされると、org.apache.struts.action.ExceptionHandler?が処理を行うのですが*1、その中でActionMessage?を生成する処理があります。そこで

ActionMessage error = new ActionMessage(ae.getKey(), ex.getMessage());
ae.getKey() はstruts-config.xmlのキー値(error.NormalException)
ex.getMessage()  は例外のgetMessage()

という処理があります。つまり error.NormalException? というキー値、例外のメッセージで{0}を置換しなさい、という意味になります。

あとは普通のActionMessage?の処理と同じですね。

実行結果

<ul>
  <li>NormalException!! [普通のハンドリングをする例外!]</li>
</ul>
<hr />
<ul><li>NormalException!! [普通のハンドリングをする例外!]</li></ul>
<hr />

といったhtmlが出力されました。

アクションクラスで作成したActionMessages?がでないような、、。

ここではアクションクラスでは例外をスローしただけでしたが、アクションクラス内でいろいろなActionMessage?を作成しておいても、画面には表示されません。これについてはStruts/ActionMessagesによるエラー処理と、例外ハンドラで処理した場合の挙動の違いにまとめました。

org.apache.struts.action.ExceptionHandler?を変更して独自の処理を入れる

遷移先もstruts-config.xmlからでなく、ハンドラ内で制御する

デフォルトのExceptionHandler?は基本的に

 <exception
     key="error.NormalException"
     type="nu.mine.kino.strutsexamples.exceptions.NormalException"
     handler="nu.mine.kino.strutsexamples.exceptions.CustomizeExceptionHandler" 
     path="/WEB-INF/jsp/error.jsp"/>

と遷移先が固定でしたが、実はこの値はオプショナルで、実際の遷移先を全てハンドラにやらせることもできます。実際ExceptionHandler?のソースを見てみると、

if (ae.getPath() != null) {
  forward = new ActionForward(ae.getPath());
} else {
  forward = mapping.getInputForward();
}

というように、exceptionタグのpathから遷移先を取り出す、もしくはからactionタグのinput属性から取り出す、とやっていますが、ここをOverrideすればよいですね。

サンプル。

TIPS

スローされた例外にアクセスする

スローされたExceptionは

Globals.EXCEPTION_KEY

というキー値*2でリクエストスコープに格納されているので

<logic:present name="<%=Globals.EXCEPTION_KEY %>" >
  <bean:write name="<%=Globals.EXCEPTION_KEY %>"/> 
</logic:present>

でアクセス可能です。

関連リンク

この記事は

選択肢 投票
おもしろかった 2  
そうでもない 0  

Top / Struts / 例外ハンドラ(ExceptionHandler)を用いた宣言的な例外処理

現在のアクセス:46868


*1 これはstruts-config.xmlのhandler属性で変更可能
*2 実際の値は"org.apache.struts.action.EXCEPTION"

トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS