تتمثل الوظيفة الرئيسية لـ Servlet في معالجة طلبات العميل والرد. لهذا السبب ، لكل طلب ، ستقوم حاوية الويب بإنشاء كائنين قبل الاتصال بالخدمة () ، وهما httpservletrequest و httpservletresponse. حيث يقوم HttPservletRequest بتغليف رسائل طلب HTTP ، فإن HttPservletResponse يغلف رسائل استجابة HTTP. تجدر الإشارة إلى أنه أثناء تشغيل خادم الويب ، ستقوم كل servlet بإنشاء كائن مثيل واحد فقط ، ولكن كل طلب سيتصل بالخدمة (ServleTRequest REQ ، ServleTResponse Res) لمثيل Servlet. HttpservletRequest هنا هي فئة فرعية من ServletRequest ، و HttPservletResponse هي فئة فرعية من servletresponse.
إن مخطط علاقة الميراث في واجهة HttPservletRequest وواجهة HttPservletResponse كما يلي:
1. httpservletresponse
ترث واجهة httpservletresponse من واجهة servletResponse. نظرًا لأن رسائل استجابة HTTP مقسمة إلى ثلاثة أجزاء: صف الحالة ، وجسم رسائل الاستجابة ، وجسم الرسائل ، تحدد واجهة HTTPSERVELTRESPONSE طريقة لإرسال رمز حالة الاستجابة ورأس رسالة الاستجابة وجسم رسالة الاستجابة إلى العميل. على الرغم من أن هناك العديد من الطرق في واجهة HTTPSERSVLETRESPONSE ، إلا أننا نستخدم فقط عدد قليل من الأشياء الشائعة الاستخدام. إذا كنت تستخدم طرقًا أخرى ، فيمكنك قراءة التعليمات البرمجية المصدر أو المعلومات ذات الصلة للاستجابة.
إرسال وظائف رمز الحالة المتعلقة
الطريقة وصف الفراغ العام setStatus (Int SC) يعين رمز الحالة لرسالة الاستجابة. يقوم خادم الويب بإنشاء سطر حالة مع رمز الحالة 200 افتراضيًا. يرسل الفراغ العام senderror (int sc) رمز الحالة الذي يشير إلى رسالة الخطأ. تضيف الطريقة الثانية أيضًا رسالة نصية لتقديم الوصف على Senderror public void (int sc ، string msg)
إرسال وظائف رسالة رسالة الاستجابة
الطريقة الوصف public void addheader (اسم السلسلة ، قيمة السلسلة) يعين حقل رأس استجابة HTTP ، ويحدد الاسم اسم الحقل ، والقيمة تحدد قيمة الحقل. يمكن لـ ADDHeader إضافة حقل رأس الاستجابة بنفس الاسم ، سيقوم Setheader بتجاوز حقل الرأس بنفس الاسم الذي يحدد الفراغ العام (اسم السلسلة ، قيمة السلسلة) الفراغ العام setContentLength (int len) يحدد حجم محتوى الكيان من خطوة الاستجابة ، في بايت ، مجموعة من محتوى servte من نوع servite ) . هو ، يعين قيمة حقل حقل المحتوى العام setCharCterencoding (سلسلة charset) تعيين حرف محتوى الإخراج ، أي ، يعين قيمة حقل نوع المحتوى. لاحظ أن أولوية هذه الطريقة أعلى من تلك الخاصة بطلب SERDLECT SERDLECT SERDLECT
إرسال وظائف رسائل استجابة الجسم المتعلقة
| طريقة | يوضح |
| ServleToutPutStream getOutputStream () | احصل على دفق إخراج البايت من نوع httpservletponse servletoutputstram |
| Printwriter GetWriter () | احصل على نوع ServleTwriter لدفق الحرف من HttPservletResponse |
مشكلة الإخراج الصينية المشوهة
يتم تخزين البيانات الموجودة في أجهزة الكمبيوتر في شكل ثنائي ، لذلك عند نقل النص ، سيحدث التحويل بين بايتات الأحرف. يتم الانتهاء من التحويل بين الأحرف والبايت من خلال جدول بحث رمز. تسمى عملية تحويل الأحرف إلى بايت الترميز ، وتسمى عملية تحويل البايت إلى أحرف فك التشفير. إذا كانت جداول التعليمات البرمجية المستخدمة للتشفير وفك التشفير مختلفة ، فستحدث مشكلات الكود المشتعلة.
ملاحظة: عند ترميز دفق إخراج الأحرف لكائن httpservletResponse ، يكون الافتراضي هو ترميز ISO 8859-1. طريقة الترميز هذه غير متوافقة مع الصينية. على سبيل المثال ، سيتم ترميز "الصين" على أنها "63 63" (سيتم عرض أحرف لا يمكن العثور عليها في جدول رمز ISO 8959-1 63). عندما يقوم المتصفح بفك تشفير البيانات المستلمة ، فإنه سيستخدم GB2312 افتراضيًا ، فك تشفير "63" إلى "؟" ، وسيقوم المتصفح بفك تشفير الشخصين "الصين" إلى "؟؟".
مثال برنامج httpservletresponse
package zzz ؛ import java.io.ioException ؛ import java.io.printwriter ؛ استيراد javax.servlet.http.httpservlet ؛ استيراد javax.servlet.http.httpservled DOGET (طلب httpservletrequest ، استجابة httpservletresponse) يلقي ioException {// اضبط رسالة الاستجابة لترميز ، بعد التعليق "الصين" ، "response.setContentType) Dopost (طلب httpservletrequest ، استجابة httpservletponse) يلقي ioException {this.doget (طلب ، استجابة) ؛في بعض الأحيان ستواجه مشكلة القفز بانتظام. يمكن لحقل رأس التحديث في HTTP إخطار المتصفح بالتحديث تلقائيًا والانتقال إلى الصفحات الأخرى خلال فترة زمنية محددة ، وستقوم صفحة الويب بالتحديث والقفز إلى الصفحة المحددة بانتظام.
package zzz ؛ import java.io.ioException ؛ import java.io.printwriter ؛ استيراد javax.servlet.http.httpservlet ؛ استيراد javax.servlet.http.httpservled DOGET (طلب httpservletrequest ، استجابة httpservletresponse) يلقي ioException {// تعيين رسالة ترميز استجابة الاستجابة. desponse.Setheader ("Refresh" ، "2 ؛ url = http: //www.baidu.com") ؛ printWriter out = response.getWriter () ؛ Out.println ("Hello China ، قفز إلى Baidu في ثانيتين ...") ؛ } Override public void dopost (طلب httpservletrequest ، استجابة httpservletresponse) يلقي ioException {this.doget (طلب ، استجابة) ؛ }}2. httpservletrequest
ترث واجهة httpservletrequest واجهة ServleTRequest وتستخدم خصيصًا لرسائل طلب HTTP المغلفة. نظرًا لأن معلومات طلب HTTP تتضمن ثلاثة أجزاء: سطر الطلب ، رأس الطلب وطلب الجسم ، تحدد واجهة httpservletrequest الأساليب ذات الصلة للحصول على سطر الطلب ورأس الطلب وجسم الطلب.
الطرق ذات الصلة للحصول على صفوف الطلبات
| طريقة | يوضح |
| السلسلة العامة getMethod () | احصل على طرق طلب HTTP ، النشر ، الحصول على ، إلخ. |
| السلسلة العامة getRequesturi () | احصل على جزء اسم المورد في خط الطلب |
| السلسلة العامة getquerystring () | احصل على جزء المعلمة في خط الطلب |
| السلسلة العامة getProtocol () | احصل على اسم البروتوكول والإصدار في سطر الطلب ، مثل HTTP 1.1 |
| السلسلة العامة getContextPath () | احصل على المسار الذي ينتمي إلى تطبيق الويب في عنوان URL للطلب |
في الواقع ، يمكن رؤية طريقة سطر الطلب من اسم الطريقة ، لذلك لن أنشره واحدًا تلو الآخر هنا.
الطرق ذات الصلة للحصول على رؤوس رسالة الطلب
| طريقة | يوضح |
| السلسلة العامة getheader (اسم السلسلة) | احصل على قيمة الحقل المحدد ، إذا لم يتم إرجاع عدم وجود فارغ ، إذا كانت هناك عوائد متعددة ، فإن القيمة الأولى |
| التعداد العام <string> getheaders (اسم السلسلة) | إرجاع كائن مجموعة التعداد مع الحقل المحدد |
| التعداد العام <string> getheadernames () | إرجاع كائن مجموعة التعداد يحتوي على جميع الحقول |
| السلسلة العامة getContentType () | احصل على قيمة حقل نوع المحتوى |
اطبع جميع قيم حقل رأس الطلب
package zzz ؛ import java.io.ioException ؛ استيراد java.io.printwriter ؛ استيراد java.util.enumeration ؛ استيراد javax.servlet.http.httpservlet Httpservlet {Override public void doget (طلب httpservletrequest ، استجابة httpservletresponse) يلقي ioException {// set message message revised.setContentType ("text/html ؛ charset = utf-8") ؛ printWriter out = response.getWriter () ؛ التعداد <string> names = request.getheaderNames () ؛ بينما (names.hasmoreElements ()) {string name = names.nextElement () ؛ قيمة السلسلة = request.getheader (name) ؛ Out.println (name + ":" + value + "</br>") ؛ }} Override public void dopost (طلب httpservletrequest ، استجابة httpservletresponse) يلقي ioException {this.doget (request ، repress) ؛ }}الطرق ذات الصلة للحصول على جسم الطلب
الطريقة الوصف servletinputstream getInputStream () يحصل على كائن ServleTinputStream المطلوب. إذا كان محتوى الكيان غير نص ، فيمكنك فقط الحصول على جسم رسالة جسم الطلب من خلال طريقة getInputStream. يحصل BufferedReader GetReader () على كائن BufferredReader المطلوب. سيقوم هذا الكائن بتحويل بيانات بايت محتوى الكيان إلى سلسلة نصية مشفرة بواسطة مجموعة الأحرف المحددة.
احصل على معلمات الطلب
| طريقة | يوضح |
| السلسلة العامة getParameter (اسم السلسلة) | احصل على قيمة المعلمة المحددة ، وإرجاع فارغة بدون هذه المعلمة |
| التعداد العام <string> getParameternames () | إرجاع كائن التعداد الذي يحتوي على جميع أسماء المعلمات |
| السلسلة العامة [] getParametervalues (اسم السلسلة) | قد يكون هناك العديد من المعلمات نفسها في طلب HTTP للحصول على جميع قيم المعلمة المقابلة لنفس اسم المعلمة. |
3. requestDispatcher واجهة
عندما يطلب العميل مورد ويب ، إذا كنت تريد أن يقوم الخادم بإخطار مورد آخر مثل معالجة الطلب ، بالإضافة إلى استخدام الوظيفة sendRexirect () لتنفيذ إعادة التوجيه ، فيمكن أيضًا تنفيذها من خلال كائن مثيل واجهة requestDispatcher. يتم تعريف طريقة للحصول على كائن requestDispatcher في واجهة ServleTRequest - GetRequestDispatcher (مسار السلسلة) ، والذي يقوم بإرجاع كائن requestDispatcher للمورد المحدد بواسطة مسار معين. يجب أن يبدأ مسار المعلمة بـ "/" لتمثيل الدليل الجذر لتطبيق الويب الحالي ، أي أن مسار المسار يجب أن يكون في برنامج الويب هذا ، وإلا سيحدث استثناء.
طرق في واجهة requestDispatcher
| طريقة | وظيفة |
| الفراغ العام للأمام (طلب ServletRequest ، استجابة ServletResponse) | تمرير servlet إلى مورد ويب آخر وقم بتمرير الطلب إلى مورد آخر للاستجابة |
| تشمل الفراغ العام (طلب ServletRequest ، استجابة ServletResponse) | تستخدم لتضمين موارد أخرى كمحتوى استجابة حالي |
ما سبق هو التفسير التفصيلي لطلب الويب Java وأمثلة الاستجابة التي أدخلها المحرر. آمل أن يكون ذلك مفيدًا للجميع!