إعادة استخدام العروض: التضمين وملفات التاجات
إعادة استخدام العروض: التضمين وملفات التاجات
تواجه كل تطبيقات JSP في بيئة الإنتاج مشكلة مألوفة: الترويسات والتذييلات وأشرطة التنقل وأدوات الشريط الجانبي يجب أن تظهر على عشرات الصفحات — والحفاظ على اتساقها يعني مركزتها في مكان واحد. يوفر JSP ثلاث آليات متميزة لهذا الغرض: توجيه التضمين الثابت، وإجراء <jsp:include> الديناميكي، وملفات التاجات المخصصة الأكثر قوة. اختيار الآلية المناسبة لكل موقف هو جزء من كتابة كود عرض قابل للصيانة.
التضمين الثابت: توجيه include
يُحلّ توجيه التضمين الثابت في وقت الترجمة — عندما يقوم حاوي JSP بتجميع صفحتك إلى servlet. يُلصق محتوى الملف المضمَّن حرفيًا في كود Java المولَّد قبل التجميع. لذلك، يمكن للملف المضمَّن الإشارة إلى المتغيرات ذات النطاق الصفحي (page-scope) المُعرَّفة في الصفحة الرئيسية.
.jspf للإشارة إلى أنها ليست صفحات مستقلة. وضعها تحت /WEB-INF/ يمنع المتصفحات من الوصول إليها مباشرة، وهو ما يُعدّ من أفضل الممارسات.
نظرًا لأن التضمين يُحلّ في وقت التجميع، إذا قمت بتحديث header.jspf يجب أن تجبر على إعادة تجميع كل صفحة تضمّنته. في خوادم التطوير يحدث هذا عادةً تلقائيًا، لكن من المفيد الإدراك به في البيئات التي تستخدم تخزينًا مؤقتًا قويًا للكلاسات.
التضمين الديناميكي: <jsp:include>
يُحلّ إجراء <jsp:include> في وقت الطلب. في كل مرة يُخدَّم فيها الصفحة، يُرسَل طلب فرعي إلى المورد المضمَّن ويُدمج ناتجه في تدفق استجابة الصفحة الأم. هذا يعني أن الصفحة المضمَّنة تعمل كوحدة مستقلة — لا يمكنها رؤية متغيرات نطاق الصفحة الأم، لكن يمكنها قبول معاملات، ويمكنها أن تكون موردًا ديناميكيًا بالكامل (حتى servlet).
التوازن الرئيسي: التضمينات الديناميكية أكثر مرونة وتعكس دائمًا أحدث حالة للملف المضمَّن دون إعادة تجميع الصفحة الأم، لكنها تحمل تكلفة إرسال طلب فرعي مع كل طلب.
الاختيار بين التضمين الثابت والديناميكي
- استخدم الثابت (توجيه
include) للأجزاء الثابتة فعلًا — تذييلات حقوق النشر، التنقل الثابت الذي لا يتغير في وقت التشغيل، تصريحات taglib المشتركة. الدمج في وقت التجميع يعني صفر تكلفة في وقت التشغيل. - استخدم الديناميكي (
<jsp:include>) عندما يحتاج الجزء نطاقه المستقل، أو عندما تحتاج لتمرير معاملات، أو عندما يتغير ناتج الجزء مع كل طلب (مثل أداة "المستخدم المسجَّل حاليًا").
taglibs.jspf واحد يحتوي على جميع تصريحات <%@ taglib ... %> وتضمينه بشكل ثابت في مقدمة كل صفحة. لأنه تضمين ثابت، تصبح التصريحات جزءًا من كل صفحة في وقت التجميع — لا تكرار، ومكان واحد لإضافة أو حذف مكتبة.
ملفات التاجات المخصصة
يمنحك التضمين الثابت والديناميكي إعادة استخدام على مستوى جزء الصفحة. ترفع ملفات التاجات هذا إلى مستوى أعلى: تتيح لك تعريف تاج JSP مخصص بسمات مسمّاة، مما يجعل ترميزك واضح الدلالة وموثَّق بذاته. ملف التاج هو ملف .tag عادي (أو .tagx لصيغة XML) يُخزَّن في /WEB-INF/tags/ — لا Java، ولا واصف TLD مطلوب.
افترض أن لديك مكوّن "بطاقة" يتكرر في تطبيقك. عرّفه مرة واحدة:
استخدمه من أي JSP بتصريح بادئة taglib تشير إلى مجلد التاجات:
<jsp:doBody /> هو مكافئ ملف التاج لـ slot أو yield — يُصيّر أي محتوى وضعه المُستدعي بين التاج الفاتح والمغلق. إذا حذفته من ملف التاج سيُتجاهل الجسم بصمت.
سمات ملف التاج بالتفصيل
يشبه توجيه <%@ attribute %> معاملة الدالة. خياراته الرئيسية:
name— اسم السمة المستخدم في الترميز المُستدعي.required—trueأوfalse؛ سيرفض الحاوي الصفحة في وقت الترجمة إذا كانت سمة مطلوبة مفقودة.rtexprvalue—trueيسمح بتعبيرات EL (${...}) كقيمة؛falseيقصرها على سلسلة نصية حرفية.type— نوع Java للسمة (مثلjava.lang.Integer)؛ يُجري الحاوي تحويل السلسلة تلقائيًا.
بناء قالب تخطيط باستخدام ملفات التاجات
من أقوى الأنماط مع ملفات التاجات قالب تخطيط كامل للصفحة — تاج واحد يلفّ كل صفحة بإطار متسق، مما يتيح للصفحات الفرعية حقن عنوانها ومحتواها.
تصبح الصفحات الفردية نظيفة ومركّزة:
الخلاصة
ثلاث أدوات لثلاث حالات استخدام: توجيه التضمين الثابت يدمج المحتوى في وقت التجميع بلا تكلفة في وقت التشغيل، مثالي لتصريحات taglib المشتركة والأجزاء الثابتة؛ <jsp:include> يُرسل طلبًا فرعيًا في وقت التشغيل مانحًا كل جزء نطاقه المستقل وإمكانية تمرير المعاملات؛ ملفات التاجات ترفع إعادة الاستخدام إلى نموذج مكوّنات — سمات مسمّاة وفتحات للمحتوى ودعم كامل لـ JSTL في ملف .tag عادي. معًا تمنحك كل ما تحتاجه لبناء طبقة عرض متسقة وقابلة للصيانة دون تكرار سطر واحد من ترميز التخطيط.