دورة حياة JSP: شرح المراحل والمخطط

⚡ ملخص ذكي

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

  • 🔄 سبع مراحل: تتم عمليات الترجمة، والترجمة، وتحميل الفئات، وإنشاء النسخ، والتهيئة، ومعالجة الطلبات، والتدمير بهذا الترتيب الثابت.
  • 📄 ترجمة: يقوم الحاوية بالتحقق من صحة الصفحة، ثم يكتب Java ملف المصدر، لذا يصبح demo.jsp هو demo_jsp.java قبل تنفيذ أي شيء.
  • ⚙️ تجميع: يتم تجميع هذا المصدر المُنشأ إلى demo_jsp.class، والذي يحتفظ به Tomcat ضمن دليل العمل الخاص به بجانب ملف .java.
  • 🚀 ثلاث طرق: تقوم الدالة jspInit() بإعداد الصفحة مرة واحدة، وتستجيب الدالة _jspService() لكل طلب، وتقوم الدالة jspDestroy() بتحرير الموارد في النهاية.
  • 🚫 قاعدة واحدة: يتم إنشاء _jspService() بواسطة الحاوية ويجب ألا يتم كتابتها أو تجاوزها بواسطة مؤلف الصفحة.
  • 🗃️ خطاف التنظيف: يُعد تجاوز الدالة jspDestroy() المكان الصحيح لإغلاق اتصالات قاعدة البيانات وفتح الملفات.

مراحل دورة حياة صفحات JSP من الترجمة إلى التدمير

ما هي دورة حياة JSP؟

دورة حياة جي إس بي يُعرَّف تحويل صفحة JSP إلى سيرفلت بأنه عملية تحويل صفحة JSP إلى سيرفلت، إذ يجب تحويل صفحة JSP إلى سيرفلت قبل أن تتمكن من معالجة طلبات الخدمة. تبدأ دورة حياة السيرفلت بإنشاء صفحة JSP وتنتهي بتدمير نسخة السيرفلت المُنشأة منها.

لأن الفئة المُنشأة هي سيرفلت عادي، فإن كل ما تعرفه بالفعل عن السيرفلتtracلا يزال هذا الأمر سارياً. Java الكود الذي يكتبه الحاوية هو ما يتم تشغيله فعلياً؛ ملف JSP هو المصدر الذي تقوم أنت بصيانته فقط.

مراحل مختلفة من دورة حياة JSP

عندما يطلب المتصفح ملف JSP، يتحقق محرك JSP أولاً مما إذا كان بحاجة إلى تجميع الصفحة. إذا لم يتم تجميع ملف JSP مطلقًا، أو إذا تم تعديله منذ آخر عملية تجميع، يقوم محرك JSP بتجميع الصفحة.

تتضمن عملية تجميع صفحة JSP ثلاث خطوات:

  • تحليل JSP
  • تحويل JSP إلى servlet
  • تجميع servlet

مخطط دورة حياة JSP

يوضح الرسم البياني أدناه دورة حياة JSP، والتي traces صفحة واحدة من ملف المصدر وصولاً إلى الفئة التي ينفذها الحاوية.

مخطط دورة حياة JSP يوضح الترجمة، والتجميع، والتحميل، وإنشاء النسخ، والتهيئة، ومعالجة الطلبات، والتدمير

الخطوات التالية توضح دورة حياة JSP:

  1. ترجمة صفحة JSP
  2. تجميع صفحة JSP (تجميع صفحة JSP في ملف _jsp.java)
  3. تحميل الفئات (يتم تحويل الملف _jsp.java إلى ملف الفئة _jsp.class)
  4. إنشاء نسخة (يتم إنشاء كائن من السيرفلت المُولّد)
  5. التهيئة (يتم استدعاء طريقة jspInit() بواسطة الحاوية)
  6. معالجة الطلب (يتم استدعاء طريقة _jspService() بواسطة الحاوية)
  7. تدمير (يتم استدعاء طريقة 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 الموضح في الكود أدناه.

تم إنشاء مصدر سيرفلت demo_jsp.java من 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

الإخراج:

ثم يقوم المتصفح بعرض العداد، كما توضح لقطة الشاشة أدناه.

عدد مرات طباعة مخرجات المتصفح لملف demo.jsp هو: 1

  • هنا يمكنك أن ترى في لقطة الشاشة أن الناتج هو 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لذلك يجب تحديث عمليات الاستيراد القديمة عند نقل تطبيق إلى خادم حالي.

الأسئلة الشائعة

تتشابه دورة حياة كل منهما بعد الترجمة. تضيف صفحة JSP مرحلتين في البداية، وهما الترجمة والتجميع، اللتان تحولان الصفحة إلى ملف مصدر servlet وفئة. بدءًا من تحميل الفئة، يستمر servlet في العمل.tracينطبق ذلك دون تغيير.

ضمن دليل عمل الخادم، في المسار work/Catalina/localhost/ /org/apache/jsp. يتم وضع كل من مصدر .java المُنشأ وملف .class المُجمّع هناك، لذا يصبح home.jsp هو home_jsp.java و home_jsp.class.

يقوم الحاوية بإنشائه من محتوى الصفحة أثناء الترجمة. يعتمد توقيعه على بروتوكول الطلب، لذا فإن المواصفات تستبعده من واجهة JspPage وتمنع مؤلفي الصفحات من تعريفه بأنفسهم.

يقوم السيرفلت المُنشأ بتنفيذ دالة init() لتخزين إعداداته، ثم يستدعي دالة jspInit(). يقوم مُصممو الصفحات بتجاوز دالة jspInit() لضمان عدم تخطي إعداد الحاوية، وهو ما يُخاطر به تحديدًا تجاوز دالة init() المكتوبة يدويًا.

تقوم عملية الترجمة المسبقة بترجمة وتجميع كل صفحة عند وقت الإنشاء أو النشر بدلاً من وقت الطلب الأول. وهذا يزيل تأخير الاستجابة الأولى، ويكشف أخطاء الترجمة قبل الإصدار، ويسمح بالنشر دون الحاجة إلى مُجمِّع على الخادم.

لا يزال مدعومًا كصفحات خادم جاكرتا. التغيير الرئيسي هو مساحة اسم الحزمة: بدءًا من جاكرتا EE 9، انتقلت واجهة برمجة التطبيقات من javax.servlet.jsp إلى jakarta.servlet.jsp، لذا يجب إعادة كتابة عمليات الاستيراد القديمة قبل التشغيل على خادم حديث.

تقوم المساعدات المدعومة بالذكاء الاصطناعي بقراءة حزمة _jsp.java المُنشأة tracوتقوم هذه الأداة بتحديد أخطاء الترجمة وربطها بسطر البرنامج النصي المُسبب للمشكلة، وهو الجزء الأصعب في معالجة أخطاء الترجمة. كما أنها تُشير إلى البرامج النصية التي تنتمي إلى ملف علامة أو خادم.

نعم. يقوم برنامج Copilot بإنشاء نصوص برمجية، وكتل JSTL، ومعالجة النماذج، ومطابقة فئات servlet من تعليق. Revاطلع على مخرجات مساحة اسم حزمة جاكارتا وللبرامج النصية التي يجب أن تكون بلغة التعبير، حيث أن الاقتراحات غالباً ما تتبع الدروس التعليمية القديمة.

تلخيص هذه التدوينة بـ: