Pengecualian server 500 terjadi. Jika ditangani secara default, itu akan menangkap pengecualian dan melompat ke halaman pengecualian default Tomcat, seperti yang ditunjukkan pada gambar di bawah ini.
Tidak peduli situs web mana yang sama, jadi Tomcat juga memungkinkan gaya khusus untuk memenuhi kebutuhan khusus. Artinya, konfigurasikan di file web.xml:
<error-page> <sror-code> 500 </error-code> <location> /Error.jsp </cocion> </error-page>
Pertama, mari kita bicara tentang logika yang menyertainya. Jika kesalahan terjadi selama pelaksanaan halaman JSP, mesin JSP akan secara otomatis menghasilkan objek pengecualian. Jika halaman JSP menentukan halaman JSP lain sebagai penangan kesalahan, mesin JSP akan memasukkan objek pengecualian ini ke objek permintaan dan meneruskannya ke penangan kesalahan. Jika Anda memiliki kesan menulis servlets, ini adalah ide yang sama dengan javax.servlet.forward.request_uri, yang beralih ke template JSP, mempertahankan jalur permintaan asli alih -alih jalur halaman JSP. Di pawang kesalahan, karena nilai properti IsErrorPage dari Petunjuk Kompilasi Halaman diatur ke True, mesin JSP akan secara otomatis mendeklarasikan objek pengecualian, yang diperoleh dari parameter HTTP yang terkandung dalam objek permintaan.
Informasi pengecualian yang terkandung dalam objek permintaan sangat kaya, seperti yang ditunjukkan di bawah ini:
Anda dapat menggunakan java pernyataan request.getAttribute ("javax.servlet.error.status_code") atau Anda dapat menggunakan ekspresi el di halaman jsp, seperti $ {requestScope ["javax.servlet.error.status_code"]}.
Meskipun halaman kesalahan khusus ini sederhana, JSP itu sendiri memiliki hasil enkapsulasi yang baik. Saya juga telah melihat banyak sumber daya orang lain, tetapi setelah belajar dengan cermat, ada juga banyak "belajar" jadi saya ingin "menggiling roda ini" lagi - pertama -tama, lokasinya adalah halaman JSP, atau servlet, tetapi jika servlet mungkin tidak dimulai, cukup gunakan halaman JSP sederhana. Kami mendefinisikan metode kelas internal melalui halaman JSP untuk mencapai pemisahan halaman dan logika (tidak perlu menulis servlet). Gagasan yang tersisa adalah sebagai berikut:
Lengkapi kelas ERRORHANDLER di JSP. Halaman lain memanggil kelas kesalahan ini. Itu tidak hanya dapat menerima kesalahan dari halaman JSP, tetapi juga menerima kesalahan yang ditularkan oleh pengontrol servlet. Ini mengekstrak informasi sebanyak mungkin dan menulis semua konten ke memori terlebih dahulu, dan kemudian mengeluarkan informasi kesalahan dari dua aliran output ke halaman dan file. Pada saat yang sama, saat menambahkan beberapa kalimat sederhana, Anda juga dapat menulis salinan informasi di halaman web ke database atau teks untuk mengembalikan html/json/xml
Kode implementasi adalah sebagai berikut:
/ *** Pengecualian penanganan kelas*/ kelas errorHandler {// Semua konten ditulis ke memori terlebih dahulu, dan kemudian output dari dua aliran output ke halaman dan file masing -masing. BytearrayoutputStream bytearrayoutputStream = new bytearrayoutputStream (); private printStream printStream = new printStream (bytearrayoutputStream); / ** * Kumpulkan informasi kesalahan * @param Permintaan * @param Exception * @param out */ public errorHandler (permintaan httpservletRequest, pengecualian yang dapat dilempar, jspwriter out) {setRequest (request); setException (pengecualian); if (out! = null) {coba {out.print (bytearrayoutputStream); // output ke halaman web} catch (ioException e) {e.printstacktrace (); }} log (permintaan); if (bytearrayoutputStream! = null) coba {bytearrayoutputStream.close (); } catch (ioException e) {e.printstacktrace (); } if (printStream! = null) printStream.close (); } / ** * * @param permintaan * / private void setRequest (permintaan httpservletRequest) {printStream.println (); printStream.println ("Akun Pengguna:" + Request.GetSession (). GetAttribute ("Username")); printStream.println ("Jalur yang diakses:" + getInfo (permintaan, "javax.servlet.forward.request_uri", string.class)); printStream.println ("Alamat halaman kesalahan:" + getInfo (permintaan, "javax.servlet.error.request_uri", string.class)); printStream.println ("kode kesalahan:" + getInfo (permintaan, "javax.servlet.error.status_code", int.class)); printStream.println ("Tipe Pengecualian:" + getInfo (permintaan, "javax.servlet.error.exception_type", class.class)); printStream.println ("Informasi Pengecualian:" + getInfo (permintaan, "javax.servlet.error.message", string.class)); printStream.println ("Pengecualian Servlet:" + getInfo (permintaan, "javax.servlet.error.servlet_name", string.class)); printStream.println (); // Dua objek lainnya getInfo (permintaan, "javax.servlet.jspexception", throwable.class); getInfo (permintaan, "javax.servlet.forward.jspexception", throwable.class); getInfo (permintaan, "javax.servlet.forward.jspexception", throwable.class); Peta <string, string []> map = request.getParametermap (); untuk (tombol string: map.keyset ()) {printStream.println ("Parameter dalam permintaan termasuk:"); printStream.println (key + "=" + request.getParameter (key)); printStream.println (); } untuk (cookie cookie: request.getCookies ()) {// cookie.getValue () printStream.println ("Cookies dalam permintaan termasuk:"); printStream.println (cookie.getName () + "=" + cookie.getValue ()); printStream.println (); }} / ** * * @param Exception * / private void setException (Throwable Exception) {if (Exception! = null) {printStream.println ("Informasi Pengecualian"); printStream.println (exception.getClass () + ":" + exception.getMessage ()); printStream.println (); printStream.println ("StackInformation"); Exception.PrintStackTrace (printStream); printStream.println (); }}/** * * @param Permintaan */log private void (permintaan httpservletRequest) {file dir = file baru (request.getSession (). getserVletContext (). getRealPath ("/errorLog")); if (! dir.exists ()) {dir.mkdir (); } String timestamp = new java.text.simpledateFormat ("yyyymmddhhmmsss"). Format (tanggal baru ()); File file = file baru (dir.getAbsolutePath () + file.separatorchar + "error-" + timestamp + ".txt"); // coba (FileOutputStream FileOutputStream = new fileoutputStream (file); // printStream ps = printStream baru (fileOutputStream)) {// tulis ke file // ps.print (bytearrayoutputStream); //} catch (FileNotFoundException e) {// E.PrintStackTrace (); //} catch (ioException e) {// e.printstacktrace (); //} catch (Exception e) {// e.printstacktrace (); //}}/ ** * * @param Permintaan * @param Key * @param type * @return */ @suppressWarnings ("uncecked") private <t> t getInfo (permintaan httpservletRequest, kunci string, kelas <t> {objek obj = request.getattribute (key); Kembalikan obj == NULL? null: (t) obj; }} Ini akan memungkinkan kontrol pengecualian. Berikut ini mendefinisikan web.xml untuk membiarkan kesalahan tomcat mengarah ke kesalahan halaman.jsp yang baru saja kami tentukan
<!-404 Tidak ada kesalahan di halaman-> <RESTROR-page> <CRORE-CODE> 404 </ERROR-CODE> <Ocation> /web-inf/jsp/common/default/error.jsp </code> </error-page> <!-//--<!-500 Server kesalahan internal-> </error-page> <! <location> /web-inf/jsp/common/default/error.jsp </location> </error-page> <!-//->
Kami mengatur halaman default sebagai berikut
Kode sumber adalah sebagai berikut:
<%@ pageEncoding = "UTF-8" isErrorPage = "true"%> <%@ include file = "/web-inf/jsp/common/classicjsp/util.jsp"%> <! Doctype html> <html> <head> <itement> halaman kesalahan </title> <tyle> body {max-width: 600p; Min-lebar: 320px; margin: 0 otomatis; Padding-Top: 2%; } textarea {width: 100%; Min-Height: 300px; } h1 {text-align: benar; Warna: Lightgray; } div {margin-top: 1%; } </tyle> </head> <body> <h1> Maaf! </h1> <div style = "Padding: 2% 0; Teks-Indent: 2em;"> Pengguna yang Terhormat: Kami berkomitmen untuk memberikan layanan yang lebih baik, tetapi perhitungan manusia tidak sebagus perhitungan Tuhan. Beberapa kesalahan telah terjadi, dan saya harap mereka berada dalam ruang lingkup kontrol ... jika masalah terjadi berulang kali, silakan umpan balik kepada administrator sistem. </div> <textarea> <% new errorhandler (permintaan, pengecualian, keluar); %> </textarea> <div> <tenter> <a href = "$ {pagecontext.request.contextPath}"> Kembali ke Halaman Beranda </a> | <a href = "JavaScript: history.go (-1);"> halaman sebelumnya </a> </center> </div> </body> </html>Di atas adalah semua tentang artikel ini, saya harap ini akan membantu untuk pembelajaran semua orang.