サーバー500例外が発生しました。デフォルトで処理される場合、下の図に示すように、例外をキャッチし、Tomcatデフォルトの例外ページにジャンプします。
どのWebサイトが同じであっても、Tomcatはカスタムスタイルをカスタムニーズに合わせて満たすこともできます。つまり、web.xmlファイルで構成します。
<ERROR-PAGE> <ERROR-CODE> 500 </error-Code> <location>/error.jsp </location> </error-page>
まず、それに伴う論理について話しましょう。 JSPページの実行中にエラーが発生した場合、JSPエンジンは例外オブジェクトを自動的に生成します。 JSPページが別のJSPページをエラーハンドラーとして指定した場合、JSPエンジンはこの例外オブジェクトをリクエストオブジェクトに配置し、エラーハンドラーに渡します。サーブレットを書くという印象がある場合、これはjavax.servlet.forward.request_uriと同じアイデアです。これは、JSPのテンプレートに変わるもので、JSPページのパスの代わりに元のリクエストパスを保持します。エラーハンドラーでは、ページコンパイルディレクティブのiSERRORPAGEプロパティの値がtrueに設定されているため、JSPエンジンは、リクエストオブジェクトに含まれるHTTPパラメーターから取得される例外オブジェクトを自動的に宣言します。
以下に示すように、リクエストオブジェクトに含まれる例外情報は非常にリッチです。
javaステートメントrequest.getAttribute( "javax.servlet.error.status_code")を使用するか、$ {requestscope ["javax.servlet.error.status_code"]}など、jspページでEL式を使用できます。
このカスタムエラーページは簡単ですが、JSP自体には優れたカプセル化結果があります。私は他の多くの人々のリソースも見てきましたが、慎重な研究の後、「学習」もたくさんあるので、再び「挽く」ことをしたいのです。まず、場所はJSPページまたはサーブレットですが、サーブレットが開始されない場合は、単純なJSPページを使用してください。 JSPページを通じて内部クラスのメソッドを定義して、ページとロジックの分離を実現します(サーブレットを書く必要はありません)。残りのアイデアは次のとおりです。
JSPでエラーハンドラークラスを完了します。別のページは、このエラーハンドラークラスを呼び出します。 JSPページからのエラーを受け入れるだけでなく、サーブレットコントローラーによって渡されたエラーも受け入れることができます。可能な限り多くの情報を抽出し、最初にすべての内容をメモリに書き込み、次に2つの出力ストリームからページとファイルにエラー情報を出力します。同時に、いくつかの簡単な文章を追加するときは、Webページの情報のコピーをデータベースまたはテキストに書いて、HTML/JSON/XMLを返すこともできます。
実装コードは次のとおりです。
/ ***例外処理クラス*/ class ErrorHandler {//すべての内容は最初にメモリに書き込まれ、次に2つの出力ストリームからそれぞれページとファイルに出力されます。 bytearrayoutputStream bytearrayoutputStream = new bytearrayoutputStream(); private printStream printStream = new PrintStream(bytearrayoutputStream); / ** *エラー情報を収集 * @param request * @param例外 * @param out */ public errorhandler(httpservletrequestリクエスト、スロー可能な例外、jspwriter out){setRequest(request); setException(例外); if(out!= null){try {out.print(bytearrayoutputStream); // webページへの出力} catch(ioexception e){e.printstacktrace(); }} log(request); if(bytearrayoutputStream!= null)try {bytearrayoutputStream.close(); } catch(ioexception e){e.printstacktrace(); } if(printStream!= null)printStream.close(); } / ** * * @param request * / private void setRequest(httpservletrequest request){printstream.println(); printStream.println( "ユーザーアカウント:" + request.getSession()。getAttribute( "username")); printStream.println( "アクセスパス:" + getInfo(request、 "javax.servlet.forward.request_uri"、string.class)); printStream.println( "エラーページアドレス:" + getInfo(request、 "javax.servlet.error.request_uri"、string.class)); printStream.println( "エラーコード:" + getInfo(request、 "javax.servlet.status_code"、int.class)); printStream.println( "例外タイプ:" + getInfo(request、 "javax.servlet.Error.exception_type"、class.class)); printStream.println( "例外情報:" + getInfo(request、 "javax.servlet.error.message"、string.class)); printStream.println( "例外サーブレット:" + getInfo(request、 "javax.servlet.error.servlet_name"、string.class)); printStream.println(); //他の2つのオブジェクトgetInfo(request、 "javax.servlet.jspexception"、throwable.class); getInfo(request、 "javax.servlet.forward.jspexception"、throwable.class); getInfo(request、 "javax.servlet.forward.jspexception"、throwable.class); map <string、string []> map = request.getParametermap(); for(string key:map.keyset()){printStream.println( "要求のパラメーターが含まれます:"); printStream.println(key + "=" + request.getParameter(key)); printStream.println(); } for(cookie cookie:request.getCookies()){// cookie.getValue()printStream.println( "リクエストのcookies incluse:"); printStream.println(cookie.getName() + "=" + cookie.getValue()); printStream.println(); }} / ** * * @param例外 * / private void setexception(スロー可能な例外){if(例外!= null){printstream.println( "例外情報"); printStream.println(exception.getClass() + ":" + exception.getMessage()); printStream.println(); printStream.println( "stackinformation"); exception.printstacktrace(printstream); printStream.println(); }}/** * * @param request */private void log(httpservletrequest request){file dir = new file(request.getSession()。getServletContext()。getRealPath( "/errorLog")); if(!dir.exists()){dir.mkdir(); } string timestamp = new java.text.simpledateFormat( "yyyymmdhhmmsss")。format(new date()); file file = new file(dir.getabsolutepath() + file.separatorChar + "error-" +タイムスタンプ + ".txt"); // try(fileoutputStream fileoutputStream = new fileoutputStream(file); // printStream ps = new PrintStream(fileoutputStream)){// fileに書き込み// ps.print(bytearrayoutputstream); //} catch(filenotfoundexception e){// e.printstacktrace(); //} catch(ioException e){// e.printstacktrace(); //} catch(例外e){// e.printstacktrace(); //}}/ ** * * @param request * @param key * @param type * @return */ @suppresswarnings( "un -checked")private <t> t getInfo(httpservletrequest request、string key、class <t> type){object obj = request.getattribute(key); obj == nullを返しますか? null:(t)obj; }}これにより、例外制御が可能になります。次のことは、tomcatエラーがページエラーにつながるようにweb.xmlを定義しています。
<! - 404ページにエラーはありません - > <error-page> <error-code> 404 </error-code> <location> /web-inf/jsp/common/default/error.jsp </location> </error-page> < <location> /web-inf/jsp/common/default/error.jsp </locion> </error-page> <! - //->
次のようにデフォルトページをアレンジします
ソースコードは次のとおりです。
<%@ page pageEncoding = "utf-8" iserrorpage = "true"%> <%@ include file = "/web-inf/jsp/classicjsp/util.jsp"%> <!doctype html> <html> <head> <title>エラーページ</タイトル>ボディ{max-width:600px;最小幅:320px;マージン:0 Auto;パディングトップ:2%; } textarea {width:100%; Min-Height:300px; } h1 {text-align:right;色:Lightgray; } div {マージントップ:1%; } </style> </head> <body> <h1>ごめんなさい! </h1> <div style = "パディング:2%0;テキストインデント:2em;">親愛なるユーザー:私たちはより良いサービスを提供することにコミットしていますが、人間の計算は神の計算ほど良くありません。いくつかのエラーが発生しており、それらが制御範囲内にあることを願っています...問題が繰り返し発生した場合は、システム管理者にフィードバックしてください。 </div> <textarea> <%new errorhandler(request、exception、out); %> </textarea> <div> <center> <a href = "$ {pagecontext.request.contextpath}">ホームページに戻る</a> | <a href = "javascript:history.go(-1);">前のページ</a> </center> </div> </body> </html>上記はこの記事に関するものです。すべての人の学習に役立つことを願っています。