حدث خادم 500 استثناء. إذا تم التعامل معها افتراضيًا ، فسوف يجذب الاستثناء والقفز إلى صفحة استثناء Tomcat الافتراضية ، كما هو موضح في الشكل أدناه.
بغض النظر عن موقع الويب هو نفسه ، لذلك يتيح Tomcat أيضًا أنماطًا مخصصة لتلبية الاحتياجات المخصصة. وهذا هو ، قم بتكوينه في ملف web.xml:
<errore-page> <خطأ في الرمز> 500 </error-code> <bort> /error.jsp </socation> </error-page>
أولاً ، دعنا نتحدث عن المنطق الذي يأتي معه. في حالة حدوث خطأ أثناء تنفيذ صفحة JSP ، سيقوم محرك JSP تلقائيًا بإنشاء كائن استثناء. إذا كانت صفحة JSP تحدد صفحة JSP أخرى كمعالج خطأ ، فسيقوم محرك JSP بوضع كائن الاستثناء هذا في كائن الطلب ونقله إلى معالج الخطأ. إذا كان لديك انطباع بكتابة servlets ، فهذه هي نفس الفكرة مثل javax.servlet.forward.request_uri ، والتي تتحول إلى القالب JSP ، تحتفظ بمسار الطلب الأصلي بدلاً من مسار صفحة JSP. في معالج الأخطاء ، نظرًا لأن قيمة خاصية ISERRORPAGE لتوجيه تجميع الصفحة ، فإن محرك JSP سيعلن تلقائيًا عن كائن استثناء ، يتم الحصول عليه من معلمات HTTP الموجودة في كائن الطلب.
معلومات الاستثناء الواردة في كائن الطلب غني جدًا ، كما هو موضح أدناه:
يمكنك استخدام طلب java request.getAttribute ("javax.servlet.error.status_code") أو يمكنك استخدام تعبيرات EL في صفحة JSP ، مثل $ {requestscope ["javax.servlet.error.status_code"]}.
على الرغم من أن صفحة الخطأ المخصصة هذه بسيطة ، إلا أن JSP نفسها لديها نتائج تغليف جيدة. لقد رأيت أيضًا الكثير من موارد الأشخاص الآخرين ، ولكن بعد دراسة متأنية ، هناك أيضًا الكثير من "التعلم" ، لذلك أريد "طحن هذه العجلة" مرة أخرى - أولاً وقبل كل شيء ، الموقع عبارة عن صفحة JSP ، أو servlet ، ولكن إذا لم يتم بدء Servlet ، فما عليك سوى استخدام صفحة JSP بسيطة. نحدد طرق الفئة الداخلية من خلال صفحات JSP لتحقيق فصل الصفحة والمنطق (لا حاجة لكتابة servlets). الأفكار المتبقية هي كما يلي:
أكمل فئة ErrorHandler في JSP. صفحة أخرى تستدعي فئة errorhandler هذه. لا يمكن أن تقبل فقط الأخطاء من صفحة JSP ، ولكن أيضًا تقبل الأخطاء التي تصدرها وحدة التحكم Servlet. يستخلص أكبر قدر ممكن من المعلومات ويكتب جميع المحتويات إلى الذاكرة أولاً ، ثم يقوم بإخراج معلومات الخطأ من دفقين إخراج إلى الصفحة والملف. في الوقت نفسه ، عند إضافة بعض الجمل البسيطة ، يمكنك أيضًا كتابة نسخة من المعلومات الموجودة على صفحة الويب إلى قاعدة البيانات أو إرسال رسالة نصية لإرجاع HTML/JSON/XML
رمز التنفيذ كما يلي:
/ *** استثناء فئة معالجة*/ class errorhandler {// يتم كتابة جميع المحتويات إلى الذاكرة أولاً ، ثم الإخراج من دفقين الإخراج إلى الصفحة والملف على التوالي. bytearrayoutputstream bytearrayoutputStream = جديد bytearrayoutputstream () ؛ 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) ؛ // الإخراج إلى صفحة الويب} catch (ioException e) {E.PrintStackTrace () ؛ }} log (request) ؛ if (bytearrayoutputStream! = null) حاول {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 (طلب ، "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 (request ، "javax.servlet.error.message" ، string.class)) ؛ printstream.println ("استثناء servlet:" + getInfo (request ، "javax.servlet.error.servlet_name" ، string.class)) ؛ printstream.println () ؛ // الكائنان الآخران getInfo (طلب ، "javax.servlet.jspexception" ، throwable.class) ؛ getInfo (request ، "javax.servlet.forward.jspexception" ، throwable.class) ؛ getInfo (request ، "javax.servlet.forward.jspexception" ، throwable.class) ؛ الخريطة <string ، string []> map = request.getParamEterMap () ؛ لـ (مفتاح السلسلة: map.keyset ()) {printstream.println ("المعلمة في الطلب تتضمن:") ؛ printStream.println (Key + "=" + request.getParameter (key)) ؛ printstream.println () ؛ } لـ (ملفات تعريف الارتباط ملفات تعريف الارتباط: request.getCoOkies ()) {// cookie.getValue () printstream.println ("ملفات تعريف الارتباط في الطلب تشمل:") ؛ printstream.println (cookie.getName () + "=" + cookie.getValue ()) ؛ printstream.println () ؛ }} / ** * * param استثناء * / private void setException (استثناء قابل للارتداء) {if (استثناء! = null) {printstream.println ("معلومات الاستثناء") ؛ printStream.println (استثناء. getClass () + ":" + استثناء printstream.println () ؛ printstream.println ("stackInformation") ؛ استثناء. printstream.println () ؛ }}/** * * param request */private void log (httpservletrequest request) {file dir = new file (request.getSession (). getServletContext (). getRealPath ("/errorlog")) ؛ if (! dir.exists ()) {dir.mkdir () ؛ } timestamp string = new java.text.simpleDateFormat ("Yyyymmddhhmmsss"). التنسيق (تاريخ جديد ()) ؛ ملف الملف = ملف جديد (dir.getabsolutepath () + file.separatorchar + "error-" + timestamp + ".txt") ؛ // try (fileOutputStream FileOutputStream = new FileOutputStream (file) ؛ // printstream ps = new printstream (fileOutputStream)) {// اكتب إلى ملف // 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 ("unchected") private <t> t getInfo (httpservletrequest طلب ، مفتاح السلسلة ، الفئة <T> type) {object.get.getattribute (key) ؛ إرجاع OBJ == NULL؟ NULL: (T) OBJ ؛ }} هذا سيمكن من السيطرة على الاستثناء. يحدد ما يلي web.xml للسماح لخطأ tomcat يؤدي إلى خطأ الصفحة. jsp حددنا للتو
<!-404 لا يوجد أي خطأ في الصفحة-> <خطأ -page> <-code> 404 </error-code> <location> /web-inf/jsp/common/default/error.jsp </socation> </error-page> <!-//->! <Boint> /web-inf/jsp/common/default/error.jsp </bittern> </error-page> <!-//->
نرتب صفحة افتراضية على النحو التالي
رمز المصدر كما يلي:
<٪@ page pageencoding = "utf-8" ISERRORPAGE = "TRUE" ٪> <٪@ include file = "/web-inf/jsp/common/classicjsp/util.jsp" ٪> <! doctype html> <html> <head> page error </title> <style> body {max-width: 600px ؛ Min-Width: 320px ؛ الهامش: 0 Auto ؛ الحشو أعلى: 2 ٪ ؛ } textarea {width: 100 ٪ ؛ MINIight: 300px ؛ } h1 {text-align: right ؛ اللون: Lightgray ؛ } div {margin-top: 1 ٪ ؛ } </style> </head> <body> <h1> آسف! </h1> <div style = "padding: 2 ٪ 0 ؛ indent text: 2em ؛"> عزيزي المستخدمين: نحن ملتزمون بتقديم خدمات أفضل ، ولكن الحسابات البشرية ليست جيدة مثل حسابات الله. حدثت بعض الأخطاء ، وآمل أن تكون ضمن نطاق التحكم ... إذا حدثت المشكلة مرارًا وتكرارًا ، فيرجى ملاحظات مسؤول النظام. </viv> <evideArea> <٪ new errorhandler (طلب ، استثناء ، خارج) ؛ ٪> </textarea> <viv> <centre> <a href = "$ {pagecontext.request.contextpath}"> العودة إلى الصفحة الرئيسية </a> | <a href = "javaScript: History.go (-1) ؛"> الصفحة السابقة </a> </center> </viv> </body> </html>ما سبق هو كل شيء عن هذا المقال ، آمل أن يكون مفيدًا لتعلم الجميع.