1. نظرة عامة على servlet
1. تقنية تطوير موارد الويب الديناميكية التي توفرها Sun Company. الجوهر هو تطبيق Java السابق ، والذي يتطلب أن يقوم هذا التطبيق بتطبيق واجهة Servlet حتى يتمكن الخادم من تسميته.
2. خطوتين لتطوير servlet
*التجربة: بداية سريعة من servlet
(1) الخطوة 1: اكتب برنامج Java لتنفيذ واجهة Servlet (هنا يرث مباشرة فئة التنفيذ الافتراضية Genericservlet)
package cn.itheima ؛ import java.io.*؛ import javax.servlet.*؛ public class firstservlet تمتد genericservlet {public void service (servletrequest req ، servletResponse res) remservexception ،(2) بالإضافة إلى وضع Class المترجمة مع الحزم ضمن فئات/فئات الويب ، يجب عليك أيضًا تكوين خدمة تسجيل Web.xml لتطبيق الويب.
<Sradlet> <Sradlet-Name> firstservlet </revlet-name> <Servlet-class> cn.itheima.firstservlet </servlet-class> </servlet> <Servlet-mapping> <sterlet-name> firstservlet </servlet-name> <Url-pattern>
3. تطوير servlets مع myeclipse
2. وصف مفصل للخدمة
1. دورة الحياة: عندما يولد شيء ويموت ، ما الذي سيفعله حتما أثناء وجوده. وضعها معًا هي دورة الإعلان عن الشيء.
2. دورة حياة Servlet: بشكل عام ، عندما يتم الوصول إلى servlet لأول مرة ، يتم إنشاء كائن في الذاكرة ، ويتم استدعاء طريقة init () مباشرة بعد الإنشاء للتهيئة. لكل طلب ، يتم استخدام طريقة الخدمة (REQ ، RESP) لمعالجة الطلب. في هذا الوقت ، سيتم تغليف معلومات الطلب باستخدام كائن الطلب ، ويمثل كائن الاستجابة (فارغ في الأصل) رسالة الاستجابة ، والتي يتم تمريرها إلى طريقة الخدمة للاستخدام. عند معالجة طريقة الخدمة ، يقوم خادم Return Server بتنظيم رسالة استجابة ليتم إرجاعها إلى المتصفح بناءً على المعلومات الموجودة في الاستجابة. لم يتم تدمير Servlet بعد اكتمال الاستجابة ويبقى في الذاكرة وينتظر الطلب التالي. إلى أن يتم إغلاق الخادم أو إزالة تطبيق الويب من المضيف الظاهري ، يتم تدمير كائن Servlet ويتم استدعاء طريقة Dordle () قبل تدميرها لفعل شيء ما بعد ذلك.
3. بنية ميراث واجهة servlet
واجهة Servlet: تحدد الطريقة التي يجب أن يكون لدى Servlet ، ويجب على جميع servlets تنفيذ هذه الواجهة بشكل مباشر أو غير مباشر.
|
| ---- genericservlet: التنفيذ الافتراضي لواجهة Servlet ، servlet العامة ، هذا فئة مجردة ، يتم تنفيذ معظم الطرق افتراضيًا ، فقط طريقة الخدمة هي طريقة مجردة يجب تنفيذها من قبل الوراثة نفسه.
|
| ----- httpservlet: يتم موروث Servlet المحسّن لبروتوكول HTTP من فئة Genericservlet ، ويتم تنفيذ طريقة مجردة الخدمة. يحدد التنفيذ الافتراضي طريقة الطلب للطلب ، ويستدعي طرق Doxxxx () المختلفة وفقًا لطرق الطلب المختلفة. عادة يمكننا أن نرث httpservlet مباشرة
4. أشياء يجب ملاحظتها عند تسجيل servlets في web.xml
4.1 قم بتسجيل خدمة servlet باستخدام علامة <Servlet> <Creslet Mapping>
<Sradlet> <Sradlet-Name> FirstServlet </servlet-name> <Servlet-Class> cn.itheima.firstservlet </revlet-class>
ملاحظة: ما تريده هنا هو اسم الفئة الكاملة لـ Servlet ، وليس مسار الملف الذي يحتوي على ملحقات .java أو .class
</servlet> <Sradlet-mapping> <Sradlet-Name> FirstServlet </servlet-name> <url-pattern>/firstservlet </url-pattern> </revlet mapping>
4.2 يمكن أن يتوافق واحد <Servlet> مع متعددة <servlet mapping>
4.3 يمكنك استخدام حرف المطابقة *لتكوين <SerlVet Mapping> ، ولكن كن حذرًا من أنه يجب أن يكون مسارًا يبدأ بـ *.do أو / الذي ينتهي بـ / *.
~ نظرًا لإدخال أحرف المطابقة ، فمن الممكن أن يتوافق المسار الظاهري مع عمليات الاستقرار المتعددة. في هذا الوقت ، أي واحد يشبه أكثر ما يبحث عنه Servlet ، ومستوى *.do هو الأقل.
4.4 يمكنك تكوين التسمية الفرعية <load-on-startup> لـ <Servlet> ، مع تحديد أن servlet يتم تحميله مع بدء تشغيل الخادم ، وتحدد القيم المكونة ترتيب بدء التشغيل
servlet> <vervlet-name> invoker </servlet-name> <Servlet-class> org.apache.catalina.servlets.invokerservlet </servlet-class> <load-on-startup> 2 </load-on-startup> </servlet>
4.5 servlet الافتراضي: إذا تم تعيين مسار الوصول الخارجي للخدمة على /، فإن servlet هو servlet الافتراضي ، ولا تقوم servlets الأخرى بمعالجة الطلبات.
~ يتم تكوين Servlet الافتراضي في conf/web.xml ، ويتم معالجة الوصول إلى الموارد الثابتة وإخراج صفحات الخطأ بواسطة هذا servlet الافتراضي. إذا كتبنا خدمة افتراضية أنفسنا للكتابة فوق servlet الافتراضي في Web.xml Dad ، فإن ذلك سيؤدي إلى عدم إمكانية الوصول إلى موارد الويب الثابتة. لذلك ، لا ينصح التكوين.
4.6 قضايا سلامة الخيط في Servlet
4.6.1 لأنه عادةً ما يكون لدى Servlet مثيل واحد فقط في الذاكرة لمعالجة الطلب ، عند إرسال طلبات متعددة ، ستقوم مؤشرات ترابط متعددة بتشغيل كائن Servlet ، مما قد يؤدي إلى مشاكل سلامة مؤشرات الترابط.
(1) قد تكون هناك مشكلات سلامة مؤشرات الترابط مع متغيرات أعضاء Servlvet
*التجربة: تحديد متغير عضو inti = 0 ؛ قم بتنفيذ عملية i ++ في طريقة doxxx () والإخراج I قيمة للعميل. في هذا الوقت ، قد تحدث مشكلات سلامة الخيوط بسبب التأخير.
(2) عندما تقوم Servet بتشغيل ملفات الموارد ، تقوم مؤشرات الترابط المتعددة بتشغيل نفس الملف وتتسبب في مشكلات سلامة مؤشرات الترابط
*التجربة: يأتي الطلب مع معلمة ، ويكتب Servlet معلمة الطلب إلى ملف ، ثم يقرأ الملف ، ويطبع قيمة القراءة للعميل. قد تكون هناك مشكلات سلامة الخيط
4.6.2 الحل
(1) استخدم كتل التعليمات البرمجية المتزامنة لحل المشكلة. العيب هو أن كتلة التعليمات البرمجية المتزامنة يمكنها فقط معالجة طلب واحد في نفس الوقت ، وهو أمر غير فعال للغاية ، وبالتالي فإن كتلة الكود المتزامن تحتاج فقط إلى احتواء رمز أساسي يسبب مشكلات سلامة مؤشرات الترابط.
(2) تنفيذ واجهة SingleThreadModel لهذا servlet. هذه واجهة علامة. سيقوم Servlet المميز بحفظ تجمع Servlet في الذاكرة. إذا جاء مؤشر ترابط ولم يكن هناك معالجة كائن Servlet في التجمع ، فسيتم إنشاء واحد جديد. إذا كان هناك servlets مجانية في حمام السباحة ، استخدمها مباشرة. هذا لا يحل حقًا مشكلات السلامة في الموضوع. تم التخلي عن هذه الواجهة.
(3) كلا الحللين ليسا مثاليين ، لذا حاول ألا تظهر متغيرات الأعضاء في Servlet.
3. servletconfig
1. الكائنات التي تمثل تكوين servlets ، والتي يمكن تكوينها في <vervlet> في web.xml
<Vervlet> <Sradlet-Name> Demo5Servlet </rectlet-name> <Servlet-class> cn.itheima.demo5servlet </servlet-class> <Init-param> <param-name> data1 </parm-name> <param-value> value1 </paral-value> <init-param>
ثم استخدم this.getServletConfig () في servlet للحصول على كائن ServletConfig. يوفر هذا الكائن طرق GetInitParameter () وطرق getInitParameterNames () ، والتي يمكن أن تعبر عناصر التكوين في التكوين.
إذا كنت لا ترغب في كتابة محتوى ميت في Servlet ، فيمكنك تكوينه هنا.
4. ServletContext
1. الكائن الذي يمثل تطبيق الويب الحالي.
2. يستخدم ككائن مجال ، ونقل البيانات بين servlets المختلفة ، ونطاقه هو تطبيق الويب بأكمله.
دورة الحياة: قم بإنشاء كائن ServletContext الذي يمثل تطبيق الويب بأكمله عند تحميل تطبيق الويب في الحاوية. عند إغلاق الخادم أو تتم إزالة تطبيق الويب من الحاوية ، يتم تدمير كائن ServletContext.
~ المجال: يتم فهم المجال على أنه صندوق ، حيث يمكن وضع البيانات. نظرًا لأن المجال يسمى المجال ، فإنه يحتوي على نطاق مرئي. يمكن تشغيل البيانات في هذا المجال ضمن هذا النطاق. مثل هذا الكائن يسمى كائن المجال.
3. في web.xml ، يمكنك تكوين معلمات التهيئة لتطبيق الويب بأكمله واستخدام ServletContext
<context-param> <Param-name> param1 </parm-name> <Param-value> pvalue1 </parm-value> </suctext-param> this.getServletContext ().
4. إعادة التوجيه بين servlets المختلفة
this.getServletContext (). getRequestDispatcher ("/servlet/demo10servlet"). إلى الأمام (طلب ، استجابة) ؛بعد اكتمال تنفيذ الطريقة ، ستعود الخدمة إلى الخادم ، وسيقوم الخادم بالاتصال بـ Servlet الهدف ، حيث سيتم إعادة إنشاء الطلب وسيتم نسخ بيانات الطلب السابق.
5. قراءة ملفات الموارد
5.1 نظرًا لأن المسار النسبي هو الدليل الذي بدأه الجهاز الظاهري Java بشكل افتراضي ، فسوف نكتب مباشرة المسار النسبي بالنسبة إلى دليل Tomcat/Bin ، لذلك لا يمكننا الحصول على الموارد. إذا تم كتابة مسار مطلق ، يكون المسار المطلق خطأ عند نشر المشروع إلى بيئة أخرى.
5.2 من أجل حل هذه المشكلة ، يوفر ServletContext هذا. this.getServletContext (). getResourCeasStream ("/1.properties") ، الذي يعيد المسار الظاهري لمورد إلى دفق المسار الحقيقي للمورد.
5.3 عند الحصول على ملفات الموارد تحت غير الخدمات ، لا يوجد كائن ServletContext المستخدم ، ويمكن استخدام محمل الفئة فقط في هذا الوقت.
classloader.getResourCeasStream ("../../ 1.Properties") ، تستخدم هذه الطريقة محمل الفئة لتحميل الموارد مباشرة في الذاكرة ، والتي لديها مشاكل مع تأخيرات التحديث ، وإذا كان الملف كبيرًا جدًا ، فإنه يستغرق الكثير من الذاكرة.
classloader.getResource ("../ 1.properties"). GetPath () يعيد مباشرة المسار الحقيقي للمورد ، دون مشكلة تأخير التحديث.
لخص
ما سبق هو كل محتوى هذه المقالة حول مناقشة الأساس التقني لتطوير Servlet لفترة وجيزة ، وآمل أن يكون مفيدًا للجميع. يمكن للأصدقاء المهتمين الاستمرار في الرجوع إلى هذا الموقع:
التحليل الأساسي لتكنولوجيا جلسة servlet
بالإضافة إلى مواضيع أخرى ذات صلة على هذا الموقع ، إذا كان هناك أي أوجه قصور ، فيرجى ترك رسالة لإشارةها. شكرا لك يا أصدقائك لدعمكم لهذا الموقع!