ServletContext ومعاملات التهيئة
ServletContext ومعاملات التهيئة
يعمل كل تطبيق قائم على سيرفلت داخل سياق تطبيق ويب واحد — بيئة تشغيل مشتركة تديرها حاوية السيرفلت. الكائن الذي يمثّل هذه البيئة هو ServletContext. إنّ فهمه هو مفتاح ربط إعدادات التطبيق على مستوى كامل، ومشاركة الكائنات بين السيرفلتات، وتجنّب الاقتران الضيّق الناتج عن تضمين القيم مباشرةً داخل فئات السيرفلت.
ما هو ServletContext؟
عندما تشغّل الحاوية (Tomcat أو Jetty أو WildFly وغيرها) تطبيق الويب الخاص بك، تُنشئ نسخة واحدة فقط من ServletContext لذلك التطبيق. تشترك جميع السيرفلتات والفلاتر والمستمعين في ملف .war ذاته في هذه النسخة الواحدة. فكّر فيها على أنها الذاكرة العامة ومخزن الإعدادات للتطبيق.
يمكنك الحصول عليها من داخل أي سيرفلت بـ:
أو من خلال كائن ServletConfig:
.war، فكل منهما يحصل على ServletContext خاص به ولا يمكنه رؤية سمات الآخر مباشرةً. هذا حدٌّ عزل مقصود.
معاملات تهيئة السياق
معاملات تهيئة السياق هي أزواج اسم-قيمة مُعلَنة في web.xml (أو ما يُعادله القائم على التعليقات التوضيحية) وتكون مرئية لكل سيرفلت وفلتر في التطبيق. هي المكان المناسب لإعدادات التطبيق الشاملة التي لا ينبغي تضمينها بشكل ثابت — عناوين URL لقواعد البيانات، وعناوين واجهات API، وأعلام الميزات، وأسماء البيئات.
أعلن عنها في web.xml:
اقرأها من أي سيرفلت:
تُعيد getInitParameter(String name) القيمة null إذا لم يكن الاسم موجودًا، لذا احرص دائمًا على الحماية من ذلك في كود الإنتاج.
معاملات تهيئة السيرفلت
أحيانًا يكون المعامل منطقيًا فقط لسيرفلت واحد بعينه — مهلة خاصة بسيرفلت، أو مسار قالب، أو حجم صفحة. أعلن عن هذه المعاملات كـ معاملات تهيئة سيرفلت، إمّا في web.xml داخل عنصر <servlet> أو عبر سمة initParams لتعليق @WebServlet.
باستخدام التعليق التوضيحي (Jakarta EE 9+):
لاحظ النمط: اقرأ معاملات التهيئة مرة واحدة في init() وخزّنها في حقول نسخة. استدعاء getInitParameter() في كل طلب مسموح به لكنه مُكلف؛ فالقيم لا تتغير بعد النشر.
init() للإعداد لمرة واحدة. حلّل معاملات التهيئة وتحقّق منها وخزّنها مؤقتًا هناك. إذا كان معامل مطلوب مفقودًا أو مشوّهًا، ارمِ ServletException — ستمتنع الحاوية عن تشغيل السيرفلت، مما يجعل الإعداد الخاطئ مرئيًا فورًا بدلًا من الانهيار الصامت وقت الطلب.
سمات السياق — مشاركة الكائنات الحية
تحمل معاملات التهيئة قيم String فقط مقروءة من ملفات الإعداد. لمشاركة كائنات تطبيق حية بين السيرفلتات (تجمّع اتصالات، أو سجل خدمات، أو كائن إعدادات محلَّل)، استخدم سمات السياق. هذه مراجع كائنات Object اعتباطية مخزنة تحت مفتاح نصي.
يمكن لأي سيرفلت عندئذٍ استرداد التجمّع المشترك:
ServletContext. خزّن كائنات آمنة للخيوط (thread-safe) أو ثابتة (immutable) أو مزامَنة بالكامل كسمات سياق فقط — DataSource آمن؛ أما ArrayList العادية فلا.
مقارنة سمات التهيئة — دليل القرار
- معامل تهيئة السياق (
<context-param>): إعدادات مشتركة على مستوى التطبيق — عنوان URL لقاعدة البيانات، اسم البيئة، اللغة الافتراضية. - معامل تهيئة السيرفلت (
@WebInitParam/<init-param>): إعدادات خاصة بسيرفلت واحد وغير ذات صلة بالآخرين — حجم الصفحة، اسم القالب، المهلة. - سمة السياق (
setAttribute): كائنات حية تحتاج إلى مشاركة بين السيرفلتات في وقت التشغيل — تجمّعات الاتصالات، ونسخ الخدمات، والذاكرات المؤقتة على مستوى التطبيق.
التسجيل العملي مع ServletContext
يعرض ServletContext أيضًا طريقة تسجيل أساسية تكتب في ملف سجل الحاوية — مفيدة لتشخيص بدء التشغيل:
في تطبيقات الإنتاج ستستبدل هذا بإطار تسجيل مناسب (SLF4J مع Logback)، لكنه خلال التطوير طريقة سريعة للتأكد من أن المعاملات تُقرأ بشكل صحيح.
الخلاصة
ServletContext هو البيئة المشتركة على مستوى التطبيق — نسخة واحدة لكل ملف .war منشور. استخدم معاملات تهيئة السياق (<context-param>) للإعدادات النصية الشاملة للتطبيق، ومعاملات تهيئة السيرفلت (@WebInitParam) للإعدادات الخاصة بكل سيرفلت، وسمات السياق (setAttribute / getAttribute) لمشاركة الكائنات الحية الآمنة للخيوط بين السيرفلتات. قراءة معاملات التهيئة مرة واحدة في init() وتخزينها في الحقول هو النمط الموحّد والفعّال. في الدرس التالي ستستخدم توجيه الطلبات والتضمين لتأليف استجابات السيرفلت.