ビジネスクラス、セションクラス、アプリケーションクラスで例外が発生し、try-catch節やhandleExceptionメソッドで処理されなかった場合、JSPエラーページが表示されます。handleExceptionメソッドによるエラー処理については“4.2 エラー処理”を参照してください。
JSPエラーページは2箇所で指定可能です。
@pageディレクティブ
uji:dispatch
uji:dispatchで指定したエラーページは、ビジネスクラス処理中の例外についてのみ使用され、@pageディレクティブで指定したエラーページより優先して使用されます。 @pageディレクティブで指定したエラーページには、アプリケーションの全てのエラーが表示されます。
<%@ page errorPage="jspError.jsp" %> <uji:dispatch errorPage="dispatchError.jsp" />
JSPエラーページではJSPスクリプトレットを使用して例外の処理ができます。以下はJSPエラーページの例です。
<HTML> <HEAD> <META http-equiv="Content-Type" content="text/html; charset=shift_jis"> <%@ page contentType= "text/html; charset=shift_jis" %> <%@ page isErrorPage="true" %> <%@ page import="java.io.PrintWriter, com.fujitsu.uji.ApplicationProfile, com.fujitsu.uji.log.*" %> </HEAD> <BODY> <PRE> <% if(exception != null) { // HTML画面に出力する Throwable ex; // 注意:HTML画面への出力はセキュリティ上の問題を内包しています。 // 以下のソースはデバッグ時のみ利用してください。 /* PrintWriter writer = new PrintWriter(out); ex = exception; while(ex instanceof NestedException) { String msg = ex.getClass().getName() + " : " + ex.getMessage(); msg = msg.replace('<','['); msg = msg.replace('>',']'); writer.println(msg); ex = ((NestedException)ex).getRootCause(); } ex.printStackTrace(writer); */ // アプリケーションログに出力する ApplicationProfile ap = (ApplicationProfile)application.getAttribute (ApplicationProfile.APPLICATIONKEY); if(ap != null) { LogComposer lc = ap.getLogComposer(); if(lc != null) { ex = exception; while(ex instanceof NestedException) { String msg = ex.getClass().getName() + " : " + ex.getMessage(); msg = msg.replace('<','['); msg = msg.replace('>',']'); lc.println(msg); ex = ((NestedException)ex).getRootCause(); } lc.printStackTrace(ex); } } } %> </PRE> </BODY> </HTML>
ポイント
HTML画面へのスタックトレースの出力は、セキュリティ上の問題を内包します。運用時は適切な画面を作成する必要があります。