دورة حياة JSP: شرح المراحل والمخطط
⚡ ملخص ذكي
تصف دورة حياة JSP كيف يقوم الحاوية بترجمة الصفحة إلى servlet، وتجميعها، وتحميل الفئة، وإنشاء مثيل، وتهيئته، وخدمة كل طلب من خلال طريقة الخدمة التي تم إنشاؤها، وأخيراً تدميرها.

ما هي دورة حياة JSP؟
دورة حياة جي إس بي يُعرَّف تحويل صفحة JSP إلى سيرفلت بأنه عملية تحويل صفحة JSP إلى سيرفلت، إذ يجب تحويل صفحة JSP إلى سيرفلت قبل أن تتمكن من معالجة طلبات الخدمة. تبدأ دورة حياة السيرفلت بإنشاء صفحة JSP وتنتهي بتدمير نسخة السيرفلت المُنشأة منها.
لأن الفئة المُنشأة هي سيرفلت عادي، فإن كل ما تعرفه بالفعل عن السيرفلتtracلا يزال هذا الأمر سارياً. Java الكود الذي يكتبه الحاوية هو ما يتم تشغيله فعلياً؛ ملف JSP هو المصدر الذي تقوم أنت بصيانته فقط.
مراحل مختلفة من دورة حياة JSP
عندما يطلب المتصفح ملف JSP، يتحقق محرك JSP أولاً مما إذا كان بحاجة إلى تجميع الصفحة. إذا لم يتم تجميع ملف JSP مطلقًا، أو إذا تم تعديله منذ آخر عملية تجميع، يقوم محرك JSP بتجميع الصفحة.
تتضمن عملية تجميع صفحة JSP ثلاث خطوات:
- تحليل JSP
- تحويل JSP إلى servlet
- تجميع servlet
مخطط دورة حياة JSP
يوضح الرسم البياني أدناه دورة حياة JSP، والتي traces صفحة واحدة من ملف المصدر وصولاً إلى الفئة التي ينفذها الحاوية.
الخطوات التالية توضح دورة حياة JSP:
- ترجمة صفحة JSP
- تجميع صفحة JSP (تجميع صفحة JSP في ملف _jsp.java)
- تحميل الفئات (يتم تحويل الملف _jsp.java إلى ملف الفئة _jsp.class)
- إنشاء نسخة (يتم إنشاء كائن من السيرفلت المُولّد)
- التهيئة (يتم استدعاء طريقة jspInit() بواسطة الحاوية)
- معالجة الطلب (يتم استدعاء طريقة _jspService() بواسطة الحاوية)
- تدمير (يتم استدعاء طريقة jspDestroy() بواسطة الحاوية)
شرح مراحل دورة حياة JSP
دعونا نلقي نظرة على كل نقطة من النقاط المذكورة أعلاه بمزيد من التفصيل.
1) ترجمة صفحة JSP:
A Java يتم إنشاء ملف servlet من ملف مصدر JSP. هذه هي الخطوة الأولى في دورة حياة JSP. في مرحلة الترجمة، يتحقق الحاوية من صحة بناء جملة صفحة JSP وملفات الوسوم.
- يقوم حاوية JSP بتفسير التوجيهات والإجراءات القياسية، والإجراءات المخصصة التي تشير إلى مكتبات العلامات (جميعها جزء من صفحة JSP ويتم تغطيتها في عناصر جي إس بي البرنامج التعليمي) المستخدم في صفحة JSP هذه.
- في الوصف التصويري أعلاه، يتم تحويل demo.jsp إلى demo_jsp.java في الخطوة الأولى
لنأخذ مثالاً على "demo.jsp" كما هو موضح أدناه:
Demo.jsp
<html>
<head>
<title>Demo JSP</title>
</head>
<%
int demvar=0;%>
<body>
Count is:
<% Out.println(demovar++); %>
<body>
</html>
ملاحظة بخصوص القائمة أعلاه: تمت إعادة إنتاجه تمامًا كما نُشر ليطابق لقطة شاشة servlet المُولّدة التالية. لن يتم تجميع متغيرين إملائيين فيه إذا تم نسخهما حرفيًا — تم تعريف المتغير على النحو التالي: demvar ولكن طُبع على النحو التالي: demovar، ويكون كائن الإخراج الضمني هو out بأحرف صغيرة، لا Outقم بتصحيح كليهما قبل تشغيل الصفحة بنفسك.
Code شرح لملف Demo.jsp
Code السطر 1: علامة بداية HTML
Code السطر 2: علامة الرأس
Code السطر 3 – 4: وسم العنوان، أي Demo JSP، ووسم رأس الإغلاق
Code السطران 5 و6: علامة Scriptlet حيث يتم تهيئة المتغير demo
Code السطر 7 – 8: في وسم <body>، نص يُراد طباعته في المخرجات (العدد هو: )
Code السطر 9: علامة Scriptlet حيث نحاول طباعة المتغير demovar بقيمته المتزايدة
Code السطر 10 – 11: تم إغلاق وسوم Body و HTML
يتم تحويل صفحة Demo JSP إلى servlet demo_jsp الموضح في الكود أدناه.
Code شرح لملف Demo_jsp.java
Code السطر 1: فئة Servlet demo_jsp ترث من الفئة الأصلية HttpServlet
Code السطران 2-3: تجاوز طريقة الخدمة الخاصة بـ JSP، أي _jspService، والتي تحتوي على كائنات HttpServletRequest وHttpServletResponse كمعاملات لها
Code السطر 4: طريقة الفتح
Code السطر 5: استدعاء الدالة getWriter() من كائن الاستجابة للحصول على طباعةWriter كائن (يطبع تمثيلاً منسقاً للكائنات إلى دفق إخراج نصي)
Code السطر 6: استدعاء دالة setContentType الخاصة بكائن الاستجابة لتعيين نوع المحتوى
Code السطر 7: استخدام دالة write() الخاصة بـ PrintWriter كائن لتحليل HTML
Code السطر 8: تهيئة متغير demovar إلى 0
Code السطر 9: استدعاء دالة write() الخاصة بـ PrintWriter كائن لتحليل النص
Code السطر 10: استدعاء دالة print() الخاصة بـ PrintWriter الهدف هو زيادة قيمة المتغير demovar من 0 + 1 = 1. وبالتالي، ستكون النتيجة 1.
Code السطر 11: استخدام دالة write() الخاصة بـ PrintWriter كائن لتحليل HTML
الإخراج:
ثم يقوم المتصفح بعرض العداد، كما توضح لقطة الشاشة أدناه.
- هنا يمكنك أن ترى في لقطة الشاشة أن الناتج هو 1، لأن قيمة demvar تُهيأ إلى 0 ثم تُزاد إلى 0 + 1 = 1
في المثال أعلاه ،
- ملف demo.jsp هو ملف JSP يتم فيه تهيئة متغير واحد وزيادته. يتم تحويل هذا الملف إلى سيرفلت (demo_jsp.class) حيث يقوم محرك JSP بتحميل صفحة JSP وتحويلها إلى محتوى سيرفلت.
- عند حدوث التحويل، يتم تحويل جميع نصوص القوالب إلى عبارات println()، ويتم تحويل جميع عناصر JSP إلى Java رمز.
هذه هي الطريقة التي تتم بها ترجمة صفحة JSP البسيطة إلى فئة servlet.
2) تجميع صفحة JSP
- المولد Java يتم تجميع ملف servlet في Java فئة سيرفلت
- ترجمة Java يمكن أن يحدث نقل صفحة المصدر إلى فئة التنفيذ الخاصة بها في أي وقت بين نشر صفحة JSP في الحاوية ومعالجة صفحة JSP.
- في الوصف المصور أعلاه، يتم تجميع ملف demo_jsp.java إلى ملف فئة demo_jsp.class
- في Apache Tomcat، يتم كتابة كلا الملفين ضمن دليل عمل الخادم، في
work/Catalina/localhost/<app>/org/apache/jsp، وهو أول مكان يجب البحث فيه عند تشخيص خطأ في الترجمة
3) تحميل الفصل
- تم الآن تحميل فئة servlet التي تم إنشاؤها من مصدر JSP في الحاوية.
4) المثيل
- في هذه الخطوة يتم إنشاء الكائن، أي نسخة من الفئة.
- يدير الحاوية مثيلًا واحدًا أو أكثر من هذه الفئة استجابةً للطلبات والأحداث الأخرى. عادةً ما تُبنى حاوية JSP باستخدام حاوية servlet. تُعد حاوية JSP امتدادًا لحاوية servlet، حيث تدعم كلتا الحاويتين JSP وservlet.
- تُعلن واجهة JspPage، التي يوفرها الحاوية، عن طريقتي jspInit() و jspDestroy().
- توجد واجهة HttpJspPage تعالج طلبات HTTP، وتحتوي أيضًا على دالة الخدمة. يعتمد توقيعها على البروتوكول، ولهذا السبب يقوم الحاوية بإنشاء هذه الدالة بدلاً من مطالبة مؤلف الصفحة بتعريفها.
5) التهيئة
public void jspInit() { //initializing the code }
- تقوم طريقة jspInit() بتهيئة مثيل servlet الذي تم إنشاؤه من JSP، ويتم استدعاؤه بواسطة الحاوية في هذه المرحلة.
- بمجرد إنشاء الكائن، يتم استدعاء طريقة التهيئة مباشرة بعد ذلك.
- يتم استدعاؤها مرة واحدة فقط خلال دورة حياة JSP، ويتم تعريف طريقة التهيئة كما هو موضح أعلاه.
6) معالجة الطلب
void _jspservice(HttpServletRequest request HttpServletResponse response) { //handling all request and responses }
- يتم استدعاء الدالة _jspService() بواسطة الحاوية لجميع الطلبات التي ترفعها صفحة JSP خلال دورة حياتها
- في هذه المرحلة، يجب أن تمر الصفحة بجميع المراحل المذكورة أعلاه، وعندها فقط يمكن استدعاء طريقة الخدمة.
- يقوم بتمرير كائنات الطلب والاستجابة
- لا يمكن تجاوز هذه الطريقة، لأن الحاوية تكتبها أثناء الترجمة.
- الطريقة موضحة أعلاه. وهي مسؤولة عن معالجة جميع طرق HTTP، أي GET و POST وغيرها.
7) تدمير
public void _jspdestroy() { //all clean up code }
- يتم استدعاء الدالة jspDestroy() أيضًا بواسطة الحاوية
- يتم استدعاء هذه الطريقة عندما يقرر الحاوية أنها لم تعد بحاجة إلى مثيل servlet لخدمة الطلبات.
- بمجرد استدعاء دالة التدمير، يصبح السيرفلت جاهزًا لعملية جمع البيانات المهملة.
- هذه هي نهاية دورة الحياة.
- يمكننا تجاوز jspDestroy() عند إجراء أي عملية تنظيف، مثل تحرير اتصالات قاعدة البيانات أو إغلاق الملفات المفتوحة.
ملاحظة تسمية جديرة بالذكر: بدءًا من جاكرتا EE 9 فصاعدًا، تعيش هذه الأنواع في jakarta.servlet.jsp حزمة بدلاً من javax.servlet.jspلذلك يجب تحديث عمليات الاستيراد القديمة عند نقل تطبيق إلى خادم حالي.



