JSPでは、response.sendError(int code, String message)
を使用して、特定のエラーコード(たとえば、見つからない場合は404)とメッセージを返すことができます。デフォルトの醜いTomcatエラーページを使用している限り、これらのメッセージは正常に表示されます。ただし、カスタムエラーページを作成した場合、どのようにしてそのメッセージを受け取りますか? exception.getMessage()
またはpageContext.getErrorData()
を試しましたが、役に立ちませんでした。私はこれを何時間も探していましたが、誰も同じことを不思議に思っているようには見えません! :S
これまで404でしか試したことがないので、それが最も必要なことだと言うのを忘れました...何らかの理由で例外がnullであるため、何かを試すとNullPointerExceptionがスローされます。エラーページは404エラーページであり、web.xmlを介して設定され(すべての単一の404エラーに対して表示されるようにしたいので)、疑問に思っている人のために、はい、isErrorPageディレクティブがtrueに設定されています...
エラーメッセージは、エラーページjspのリクエストオブジェクトのjavax.servlet.error.message
属性から入手できます。
アクセスするためのjsp構文は次のとおりです。
<c:out value="${requestScope['javax.servlet.error.message']}"/>
エラーページで利用可能な他のエラー関連情報を探すことができます ここ新しいエラー属性の下。
うーんexception.getMessage()
は機能するはずです
exception.getClass().getName()
を追加してみてください
NullPointerException
である可能性がありますもちろん、これは、私が正しく覚えていれば、エラーが上部に<%@ page errorPage="/yourerrorpage.jsp" %>
が付いたjspによってスローされた場合にのみ機能します。
エラーがサーブレットから発生した場合、例外の詳細はリクエスト属性として渡されます
javax.servlet.error.status_code Java.lang.Integer
javax.servlet.error.exception_type Java.lang.Class
javax.servlet.error.message Java.lang.String
javax.servlet.error.exception Java.lang.Throwable
javax.servlet.error.request_uri Java.lang.String
javax.servlet.error.servlet_name Java.lang.String
サーブレット仕様 セクション9.9を確認してください
回答が遅くなって申し訳ありませんが、ちょうど1週間前にこの問題に直面しました。さまざまなサイトを閲覧しましたが、誰もこの問題を私が聞きたい方法で実際に理解していませんでした。この投稿で、私はいくつかの興味深い解決策を見つけて、それから私自身に思いつきました。このソースをページに含めるだけです。
<%
out.println(pageContext.getErrorData().getRequestURI());
out.println("<br/>");
out.println(pageContext.getErrorData().getStatusCode());
out.println("<br/>");
out.println(pageContext.getException());
out.println("<br/>");
%>
それは私と完全にうまくいきました。
あなたが欲しいものは私には奇妙に見えます:)。そうは言っても、私は次のことをします:
HttpResponseWrapper
を実装して、他のHttpResponse
を次のようにラップします。
public class HttpResponseWrapper implements HttpResponse {
private String errorMessage;
...
@Override
public void sendError(...) {
<save error message here>
}
...
}
フィルタを作成し、これで応答をラップします
すべてのリクエストにフィルターをかけ、チェーンの最初に
エラーページで、応答がHttpResponseWrapper
のインスタンスであるかどうかを確認します
メッセージを受け取る
exception
のErrorData
部分は、応答エラーコードではなく、例外の結果としてエラーページが読み込まれた場合にのみ設定されます。
sendError
のHttpServletResponse
については javadoc を参照してください。 sendError
に渡したメッセージが表示されない理由が記載されています(私の強調):
指定されたステータスを使用して、クライアントにエラー応答を送信します。サーバーはデフォルトで、指定されたメッセージを含むHTML形式のサーバーエラーページのように見える応答を作成し、コンテンツタイプを「text/html」に設定し、Cookieやその他のヘッダーを変更しないままにします。 渡されたステータスコードに対応するWebアプリケーションに対してエラーページ宣言が行われた場合、提案されたmsgパラメータよりも優先して返されます。
応答がすでにコミットされている場合、このメソッドはIllegalStateExceptionをスローします。この方法を使用した後、応答はコミットされていると見なされ、書き込まれるべきではありません。
あなたが使用することができます
${requestScope['javax.servlet.error.message']}
ページにjstlがない場合