ビジネスクラス、セションクラス、アプリケーションクラスで例外が発生し、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画面へのスタックトレースの出力は、セキュリティ上の問題を内包します。運用時は適切な画面を作成する必要があります。