3

web.xmlでエラーページを定義しました。

 <error-page>
   <exception-type>java.lang.Exception</exception-type>
   <location>/error.jsp</location>
 </error-page>

そのエラーページには、作成したカスタムタグがあります。このタグのタグハンドラーは、発生したエラーのスタックトレースを電子メールで送信します。ほとんどの場合、これはうまく機能します。

それがうまく機能しないのは、エラーが発生したときに出力がすでにクライアントに送信され始めている場合です。その場合、次のようになります。

SEVERE: Exception Processing ErrorPage[exceptionType=java.lang.Exception, location=/error.jsp]
 java.lang.IllegalStateException

このエラーは、出力がすでに開始された後、リクエストをエラーページにリダイレクトできないために発生すると思います。私が使用した回避策は、特に大きなJSPページのバッファサイズを増やすことです。しかし、私は既存のアプリケーションに適用できる汎用エラーハンドラーを作成しようとしています。また、バッファーが十分に大きいことを確認するために、何百ものJSPページを調べることが可能かどうかはわかりません。

この場合、実際にエラーページをクライアントに表示できない場合でも、スタックトレースの電子メールコードを実行できるようにする方法はありますか?

4

3 に答える 3

2

クライアントへのデータ送信をすでに開始している場合、errorPage は使用されません。私がしていることは、JavaScript コールバックを使用して不完全なページをチェックし、エラー ページにリダイレクトすることです。インクルードヘッダーなどのページの先頭で、ブール値のjavascript変数をfalseに初期化し、オンロードハンドラーを登録して状態を確認し、エラーページにリダイレクトします。

<script type="text/javascript">
        var pageLoadSuccessful = false;//set to true in footer.jsp
        dojo.addOnLoad(function(){
            if (!pageLoadSuccessful) window.location = "<c:url value="/error.do" />";
        });
</script>

次に、フッター jsp で、この変数を true に設定してください。

<script type="text/javascript">
    pageLoadSuccessful = true;//declared in header.jsp
</script>
于 2009-12-02T16:13:52.787 に答える
1

<%@ page errorPage = "/ myerrorpage.jsp"%>ディレクティブを使用してみましたか?

次に、myerrorpage.jspで<%page isErrorPage ="true"$>を使用する必要があります。

それで問題は解決するかもしれません。それに関する唯一の問題は、何らかの方法ですべてのJSPにそれを含める必要があるということです。

于 2008-10-16T23:44:09.277 に答える
1

実際、この特定の問題は、JSP でスクリプトレットを使用していたことを示しています。これは悪い習慣であり、この特定の問題がその主な理由の 1 つです。JSP で taglibs/EL だけになるように、すべてのビジネス ロジックを実際のJava クラスに移動する必要があります。サーブレット/フィルターでは、リクエストを JSP に転送する前に例外を完全に処理できます。

于 2009-12-02T16:17:46.057 に答える