เกิดข้อยกเว้นเซิร์ฟเวอร์ 500 หากได้รับการจัดการโดยค่าเริ่มต้นมันจะจับข้อยกเว้นและข้ามไปยังหน้าข้อยกเว้นเริ่มต้นของ Tomcat ดังที่แสดงในรูปด้านล่าง
ไม่ว่าเว็บไซต์ใดจะเหมือนกันดังนั้น Tomcat ยังอนุญาตให้สไตล์ที่กำหนดเองตอบสนองความต้องการที่กำหนดเอง นั่นคือกำหนดค่าไว้ในไฟล์ web.xml:
<rorrors-page> <reror-Code> 500 </ข้อผิดพลาด-รหัส> <location>/error.jsp </location> </lecons-page>
ก่อนอื่นมาพูดถึงตรรกะที่มาพร้อมกับมัน หากเกิดข้อผิดพลาดระหว่างการดำเนินการของหน้า JSP เอ็นจิ้น JSP จะสร้างวัตถุข้อยกเว้นโดยอัตโนมัติ หากหน้า JSP ระบุหน้า JSP อื่นเป็นตัวจัดการข้อผิดพลาดเอ็นจิ้น JSP จะใส่วัตถุข้อยกเว้นนี้ลงในวัตถุคำขอและส่งผ่านไปยังตัวจัดการข้อผิดพลาด หากคุณมีความประทับใจในการเขียน servlets นี่เป็นความคิดเดียวกับ javax.servlet.forward.request_uri ซึ่งจะเปลี่ยนเป็นเทมเพลต JSP รักษาเส้นทางคำขอเดิมแทนเส้นทางของหน้า JSP ในตัวจัดการข้อผิดพลาดเนื่องจากค่าของคุณสมบัติ iSerrorPage ของคำสั่งรวบรวมหน้าถูกตั้งค่าเป็น TRUE เอ็นจิ้น JSP จะประกาศวัตถุข้อยกเว้นโดยอัตโนมัติซึ่งได้มาจากพารามิเตอร์ HTTP ที่มีอยู่ในวัตถุคำขอ
ข้อมูลข้อยกเว้นที่มีอยู่ในวัตถุคำขออุดมสมบูรณ์มากดังที่แสดงด้านล่าง:
คุณสามารถใช้คำสั่ง java request.getAttribute ("javax.servlet.error.status_code") หรือคุณสามารถใช้ EL Expressions ในหน้า JSP เช่น $ {requestScope ["Javax.servlet.error.status_Code"]}
แม้ว่าหน้าข้อผิดพลาดที่กำหนดเองนี้จะง่าย แต่ JSP เองก็มีผลลัพธ์การห่อหุ้มที่ดี ฉันยังได้เห็นทรัพยากรของคนอื่นมากมาย แต่หลังจากการศึกษาอย่างระมัดระวังนอกจากนี้ยังมี "การเรียนรู้" มากมายดังนั้นฉันจึงต้องการ "บดล้อนี้" อีกครั้ง - ก่อนอื่นตำแหน่งคือหน้า JSP หรือเซิร์ฟเล็ต แต่ถ้า servlet อาจไม่เริ่มใช้เพียงแค่ใช้หน้า JSP ง่าย ๆ เรากำหนดวิธีการคลาสภายในผ่านหน้า JSP เพื่อให้ได้การแยกหน้าและตรรกะ (ไม่จำเป็นต้องเขียน servlets) ความคิดที่เหลือมีดังนี้:
กรอกคลาส Errorhandler ใน JSP หน้าอื่นเรียกคลาสข้อผิดพลาดนี้ ไม่เพียง แต่ยอมรับข้อผิดพลาดจากหน้า JSP แต่ยังยอมรับข้อผิดพลาดที่ส่งผ่านโดยคอนโทรลเลอร์ Servlet มันแยกข้อมูลให้มากที่สุดเท่าที่จะเป็นไปได้และเขียนเนื้อหาทั้งหมดไปยังหน่วยความจำก่อนจากนั้นส่งออกข้อมูลข้อผิดพลาดจากสตรีมเอาต์พุตสองรายการไปยังหน้าและไฟล์ ในเวลาเดียวกันเมื่อเพิ่มประโยคง่ายๆสองสามประโยคคุณสามารถเขียนสำเนาข้อมูลบนหน้าเว็บไปยังฐานข้อมูลหรือข้อความเพื่อส่งคืน HTML/JSON/XML
รหัสการใช้งานมีดังนี้:
/ *** คลาสการจัดการข้อยกเว้น*/ คลาส ErrorHandler {// เนื้อหาทั้งหมดจะถูกเขียนลงในหน่วยความจำก่อนจากนั้นเอาต์พุตจากสตรีมเอาต์พุตสองรายการไปยังหน้าและไฟล์ตามลำดับ ByTeArrayOutputStream ByTeArrayOutputStream = ใหม่ byteArrayOutputStream (); privent printstream printstream = printstream ใหม่ (byteArrayOutputStream); / ** * รวบรวมข้อมูลข้อผิดพลาด * @param Request * @param Exception * @param out */ public errorhandler (คำขอ httpservletrequest, ข้อยกเว้นที่โยนได้, jspwriter out) {setRequest (คำขอ); SetException (ข้อยกเว้น); if (out! = null) {ลอง {out.print (byteArrayOutputStream); // เอาต์พุตไปยังหน้าเว็บ} catch (ioexception e) {e.printstacktrace (); }} log (คำขอ); if (byteArrayOutputStream! = null) ลอง {byteArrayOutputStream.close (); } catch (ioexception e) {e.printstacktrace (); } if (printstream! = null) printstream.close (); } / ** * * @param Request * / โมฆะส่วนตัว setRequest (คำขอ httpservletrequest) {printstream.println (); printstream.println ("บัญชีผู้ใช้:" + request.getSession (). getAttribute ("ชื่อผู้ใช้")); printstream.println ("เส้นทางที่เข้าถึงได้:" + getinfo (คำขอ, "javax.servlet.forward.request_uri", string.class)); printstream.println ("ที่อยู่หน้าข้อผิดพลาด:" + getInfo (คำขอ, "javax.servlet.error.request_uri", string.class)); printstream.println ("รหัสข้อผิดพลาด:" + getinfo (คำขอ, "javax.servlet.error.status_code", int.class)); printstream.println ("ประเภทข้อยกเว้น:" + getinfo (คำขอ, "javax.servlet.error.exception_type", class.class)); printstream.println ("ข้อมูลข้อยกเว้น:" + getinfo (คำขอ, "javax.servlet.error.message", string.class)); printstream.println ("ข้อยกเว้น servlet:" + getinfo (คำขอ, "javax.servlet.error.servlet_name", string.class)); printstream.println (); // อีกสองวัตถุ getInfo (คำขอ "javax.servlet.jspexception", throwable.class); getInfo (คำขอ "javax.servlet.forward.jspexception", throwable.class); getInfo (คำขอ "javax.servlet.forward.jspexception", throwable.class); แผนที่ <สตริง, สตริง []> map = request.getParameterMap (); สำหรับ (คีย์สตริง: map.keyset ()) {printstream.println ("พารามิเตอร์ในคำขอรวมถึง:"); printstream.println (คีย์ + "=" + request.getParameter (คีย์)); printstream.println (); } สำหรับ (คุกกี้คุกกี้: request.getCookies ()) {// cookie.getValue () printstream.println ("คุกกี้ในคำขอรวมถึง:"); printstream.println (cookie.getName () + "=" + cookie.getValue ()); printstream.println (); }} / ** * * @param Exception * / โมฆะส่วนตัว setException (ข้อยกเว้นแบบโยนได้) {ถ้า (ยกเว้น! = 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) {ไฟล์ dir = ไฟล์ใหม่ (request.getSession (). getServletContext (). getRealPath ("/errorlog")); if (! dir.exists ()) {dir.mkdir (); } timestamp สตริง = ใหม่ java.text.simpledateFormat ("yyyymmddhhmmsss") รูปแบบ (วันที่ใหม่ ()); ไฟล์ไฟล์ = ไฟล์ใหม่ (dir.getabsolutepath () + file.Separatorchar + "ข้อผิดพลาด-" + timestamp + ".txt"); // ลอง (fileOutputStream fileOutputStream = ใหม่ fileOutputStream (ไฟล์); // printstream ps = new printstream (fileOutputStream)) {// เขียนถึงไฟล์ // ps.print (byteArrayOutputStream); //} catch (filenotfoundexception e) {// e.printstacktrace (); //} catch (ioexception e) {// e.printstacktrace (); //} catch (exception e) {// e.printstacktrace (); //}}/ ** * * @param Request * @param key * @param type * @return */ @suppresswarnings ("unchecked") ส่วนตัว <t> t getinfo (httpservletrequest คำขอสตริงคลาส <t> ประเภท) {Object OBJ = คำขอ ส่งคืน obj == null? null: (t) obj; - สิ่งนี้จะช่วยให้การควบคุมข้อยกเว้น ต่อไปนี้กำหนด web.xml เพื่อให้ข้อผิดพลาดของ Tomcat นำไปสู่ข้อผิดพลาดของหน้าเว็บเราเพิ่งระบุ
<!-404 ไม่มีข้อผิดพลาดในหน้า-> <srors-page> <rerorcode> 404 </ข้อผิดพลาด-รหัส> <location>/web-inf/jsp/common/default/error.jsp </location> </srors--page> <! <location> /web-inf/jsp/common/default/error.jsp </location> </error --page> <!-//->
เราจัดเตรียมหน้าเริ่มต้นดังนี้
ซอร์สโค้ดมีดังนี้:
<%@ page pageencoding = "utf-8" iserrorPage = "true"%> <%@ include file = "/web-inf/jsp/common/classicjsp/util.jsp"%> <! ความกว้างขั้นต่ำ: 320px; มาร์จิ้น: 0 อัตโนมัติ; Padding-Top: 2%; } textarea {width: 100%; ต่ำสุด: 300px; } h1 {text-allign: ขวา; สี: Lightgray; } div {margin-top: 1%; } </style> </head> <body> <h1> ขออภัย! </h1> <div style = "การตอบสนอง: 2% 0; Indent-Indent: 2EM;"> ผู้ใช้เรียน: เรามุ่งมั่นที่จะให้บริการที่ดีขึ้น แต่การคำนวณของมนุษย์นั้นไม่ดีเท่าการคำนวณของพระเจ้า เกิดข้อผิดพลาดบางอย่างและฉันหวังว่าพวกเขาจะอยู่ในขอบเขตการควบคุม ... หากปัญหาเกิดขึ้นซ้ำ ๆ โปรดตอบกลับผู้ดูแลระบบ </div> <textarea> <% errorhandler ใหม่ (คำขอ, ยกเว้น, ออก); %> </textarea> <div> <center> <a href = "$ {pageContext.request.contextpath}"> กลับไปที่หน้าแรก </a> | <a href = "javascript: history.go (-1);"> หน้าก่อนหน้า </a> </enter> </div> </body> </html>ข้างต้นเป็นเรื่องเกี่ยวกับบทความนี้ฉันหวังว่ามันจะเป็นประโยชน์กับการเรียนรู้ของทุกคน