1. مقدمة
ملف PDF الخاص بالوثيقة متاح |HERE|.
أمثلة المستند متاحة |HERE|.
نهدف هنا إلى تقديم المفاهيم المهمة في Struts 2 باستخدام الأمثلة. Struts 2 هو إطار عمل ويب يوفر:
- عددًا من المكتبات في شكل ملفات JAR
- إطار عمل للتطوير: يؤثر Struts 2 على طريقة تطوير تطبيقات الويب.
المتطلبات الأساسية لفهم الأمثلة هي كما يلي:
- معرفة أساسية بلغة Java
- معرفة أساسية بتطوير الويب، ولا سيما لغة HTML.
يمكن العثور على جميع الموارد اللازمة لتلبية هذه المتطلبات الأساسية على الموقع [http://developpez.com]. وقد قمت بكتابة بعضها ويمكن العثور عليها على الموقع [https://stahe.github.io].
تتوفر الأمثلة الواردة في هذا المستند على الرابط [مقدمة إلى STRUTS 2 من خلال الأمثلة (2012)].
لمزيد من التعمق في Struts 2، يمكن استخدام المراجع التالية:
- [ref1]: وثائق Struts 2 المتوفرة على موقع Struts
- [ref2]: كتاب «Struts 2 in Action» من تأليف دونالد براون - تشاد مايكل ديفيس - سكوت ستانليك، الصادر عن دار نشر مانينغ. هذا الكتاب تعليمي بشكل خاص.
سنشير أحيانًا إلى [ref2] لإعلام القارئ بأنه يمكنه التعمق في موضوع ما من خلال هذا الكتاب.
وقد كُتب هذا المستند بطريقة تسمح بقراءته دون الحاجة إلى جهاز كمبيوتر. ولذلك، نقدم العديد من لقطات الشاشة.
1.1. مكانة Struts 2 في تطبيق الويب
أولاً، دعونا نحدد مكانة Struts 2 في عملية تطوير تطبيق ويب. غالبًا ما يتم بناء هذا التطبيق على بنية متعددة الطبقات مثل التالية:
![]() |
- الطبقة [web] هي الطبقة التي تتفاعل مع مستخدم تطبيق الويب. يتفاعل المستخدم مع تطبيق الويب من خلال صفحات الويب التي يتم عرضها بواسطة متصفح. ويقع Struts 2 في هذه الطبقة تحديدًا، ولا يوجد إلا في هذه الطبقة.
- الطبقة [metier] تُنفذ قواعد إدارة التطبيق، مثل حساب الراتب أو الفاتورة. تستخدم هذه الطبقة البيانات الواردة من المستخدم عبر الطبقة [web] ومن نظام إدارة قواعد البيانات (SGBD) عبر الطبقة [dao].
- تتولى الطبقة [dao] (كائنات الوصول إلى البيانات)، والطبقة [jpa] (واجهة برمجة تطبيقات الاستمرارية في Java)، ومحرك Jdbc إدارة الوصول إلى بيانات نظام إدارة قواعد البيانات (SGBD). تعمل الطبقة [jpa] كـ ORM (مُخطِّط الكائنات العلائقية). وهي تشكل جسراً بين الكائنات التي تتعامل معها الطبقة [dao] والصفوف والأعمدة في بيانات قاعدة البيانات العلائقية.
- يمكن تحقيق تكامل الطبقات باستخدام حاوية Spring أو EJB3 (Enterprise Java Bean).
معظم الأمثلة الواردة فيما يلي ستستخدم طبقة واحدة فقط، وهي الطبقة [web]:
![]() |
ومع ذلك، سيختتم هذا المستند بإنشاء تطبيق ويب متعدد الطبقات:
![]() |
سيتم توفير مجموعة الطبقات [metier] و [dao] و [jpa/hibernate] في شكل ملف jar مضغوط، بحيث لا يتبقى لنا سوى بناء الطبقة [web].
1.2. نموذج التطوير MVC في Struts 2
تقوم Struts 2 بتنفيذ نموذج الهندسة المعمارية المعروف باسم MVC (النموذج – العرض – وحدة التحكم) بالطريقة التالية:
![]() |
تتم معالجة طلب العميل على النحو التالي:
تكون عناوين URL المطلوبة بالصيغة http://machine:port/contexte/rep1/rep2/.../Action. يجب أن يتطابق المسار [/rep1/rep2/.../Action] مع إجراء محدد في ملف تكوين Struts 2، وإلا فسيتم رفضه. يتم تعريف الإجراء في ملف XML بالصيغة التالية:
في المثال السابق، لنفترض أن عنوان URL [ http://machine:port/contexte/actions/Action1] قد طُلب. عندئذٍ يتم تنفيذ الخطوات التالية:
- الطلب - يقوم متصفح العميل بإرسال طلب إلى وحدة التحكم [FilterDispatcher]. تمر جميع طلبات العملاء عبر هذه الوحدة. وهي بمثابة بوابة الدخول إلى التطبيق. وهي الحرف C في MVC.
- المعالجة
- تقوم وحدة التحكم C بالرجوع إلى ملف التكوين الخاص بها وتكتشف أن الإجراء actions/Action1 موجود. يُحدد الإجراء namespace (السطر 1) المُدمج مع اسم الإجراء (السمة name في السطر 2) الإجراء actions/Action1.
- يقوم وحدة التحكم C بإنشاء مثيل لـ [2a]، وهي فئة من النوع [actions.Action1] (السمة class في السطر 2). يمكن أن يكون اسم هذه الفئة وحزمتها أي شيء.
- إذا كان عنوان URL المطلوب مصحوبًا بمعلمات من النوع [param1=val1¶m2=val2&...]، فإن وحدة التحكم C تقوم بتعيين هذه المعلمات إلى الفئة [actions.Action1] بالطريقة التالية:
لذلك، يجب أن تحتوي الفئة [actions.Action1] على هذه الطرق setParami لكل معلمة من المعلمات المتوقعة parami.
- يطلب وحدة التحكم C من طريقة التوقيع [String execute()] التابعة للفئة [actions.Action1] أن يتم تنفيذها. وعندئذٍ يمكن لهذه الطريقة الاستفادة من المعلمات parami التي استردتها الفئة. وأثناء معالجة طلب المستخدم، قد تحتاج إلى الطبقة [metier] [2b]. وبمجرد معالجة طلب العميل، يمكن لهذه الطريقة استدعاء استجابات متنوعة. ومن الأمثلة النموذجية على ذلك:
- صفحة أخطاء إذا تعذر معالجة الطلب بشكل صحيح
- صفحة تأكيد في الحالات الأخرى
تُرجع الطريقة execute إلى وحدة التحكم C نتيجة من نوع سلسلة أحرف تُسمى مفتاح التنقل. في المثال أعلاه، [actions.Action1].يمكن أن تنتج الطريقة execute مفتاحي تنقل هما «page1» (السطر 3) و«page2» (السطر 4). كما أن الطريقة [actions.Action1].execute ستقوم أيضًا بتحديث القالب M [2c] الذي ستستخدمه الصفحة JSP التي سيتم إرسالها كاستجابة للمستخدم. قد يتضمن هذا القالب عناصر من:
- الفئة [actions.Action1] التي تم إنشاء مثيل لها
- جلسة عمل المستخدم
- بيانات نطاق التطبيق
- ...
- الاستجابة - يطلب وحدة التحكم C من الصفحة JSP المطابقة لمفتاح التنقل [3] أن تُعرض. هذه هي طريقة العرض (V) لـ MVC. تستخدم الصفحة JSP نموذجًا M لتهيئة الأجزاء الديناميكية من الاستجابة التي يتعين عليها إرسالها إلى العميل.
الآن، دعونا نوضح العلاقة بين بنية الويب MVC وبنية الطبقات. في الواقع، هذان مفهومان مختلفان يتم الخلط بينهما أحيانًا. لنأخذ تطبيق ويب Struts 2 أحادي الطبقة كمثال:
![]() |
إذا قمنا بتنفيذ الطبقة [web] باستخدام Struts 2، فسنحصل بالفعل على بنية ويب MVC ولكنها لن تكون بنية متعددة الطبقات. هنا، ستتولى الطبقة [web] كل شيء: العرض، والعمليات التجارية، والوصول إلى البيانات. مع Struts 2، ستقوم الفئات من النوع [Action] بهذه المهمة.
الآن، لننظر إلى بنية ويب متعددة الطبقات:
![]() |
يمكن تنفيذ الطبقة [web] بدون إطار عمل وبدون اتباع النموذج MVC. وبذلك يكون لدينا بالفعل بنية متعددة الطبقات، لكن الطبقة الويب لا تنفذ النموذج MVC.
في MVC، ذكرنا أن النموذج M هو نموذج العرض V، c.a.d، أي مجموعة البيانات التي يعرضها العرض V. في بعض الأحيان (غالبًا)، يُعطى تعريف آخر للنموذج M الخاص بـ MVC:
![]() |
يعتبر العديد من المؤلفين أن ما يقع على يمين الطبقة [web] يشكل النموذج M الخاص بـ MVC. لتجنب أي غموض، يمكننا أن نتحدث عن:
- عن «نموذج المجال» عند الإشارة إلى كل ما يقع على يمين الطبقة [présentation]
- عن «نموذج العرض» عند الإشارة إلى البيانات المعروضة بواسطة عرض V
وفيما يلي، سيشير مصطلح «نموذج M» حصريًّا إلى نموذج العرض V.
1.3. الأدوات المستخدمة
فيما يلي، نستخدم (ديسمبر 2011)
- برنامج NetBeans 7.01 المتوفر على الرابط IDE
- المكوّن الإضافي Struts 2 لـ NetBeans 7.01 المتوفر على الرابط [http://plugins.netbeans.org/plugin/39218]
- الإصدار 2.2.3 من Struts 2 المتوفر على الرابط [http://struts.apache.org/]
تجدر الإشارة إلى أن مكتبات Struts 2 المتوفرة على الرابط [http://struts.apache.org/] هي وحدها الضرورية لتطوير الأمثلة التالية. يمكن استبدال NetBeans ببرنامج آخر IDE (مثل Eclipse أو JDeveloper أو IntelliJ، ...)، أما المكون الإضافي Struts 2 فهو موجود فقط لتسهيل عمل المطور. وهو ليس ضروريًا أيضًا.
1.3.1. IDE NetBeans
على موقع تنزيل NetBeans، نختار إصدار Java EE:

1.3.2. المكوّن الإضافي Struts 2
اعتمادًا على إصدارات NetBeans، لم يكن هذا المكون الإضافي متاحًا دائمًا. في ديسمبر 2011، يمكن العثور عليه على الرابط [http://plugins.netbeans.org]. يتيح هذا الرابط التعرف على المكونات الإضافية المختلفة المتاحة لـ NetBeans. يمكن تصفية النتائج وفقًا لما تبحث عنه. في الرابط [1]، نطلب المكونات الإضافية التي تحتوي على كلمة "struts" في اسمها.
![]() |
- نضغط على الرابط [2]
![]() |
نقوم بتنزيل المكون الإضافي وفك ضغطه [2]. لدمجه في NetBeans، يمكننا اتباع الخطوات التالية:
- تشغيل NetBeans
![]() |
- في [1]، اختر القائمة «Tools/Plugins»
- في علامة التبويب [2]، استخدم الزر [3]
- في [4]، اختر ملفات .nbm الخاصة بالمكونات الإضافية التي تم تنزيلها. هنا، نختار مكتبات Struts الإصدار 2.2.3 بدلاً من مكتبات Struts 2.0.14
- بعد العودة إلى علامة التبويب [2]، نقوم بتثبيت المكونات الإضافية المحددة باستخدام الزر [5].
غالبًا ما يتطلب تثبيت المكونات الإضافية إعادة تشغيل NetBeans.
1.3.3. مكتبات Struts 2
إذا قمنا بتنزيل المكون الإضافي Struts 2 لـ NetBeans، فسنحصل على المكتبات الرئيسية لـ Struts ولكن ليس جميعها. في ما يلي، سنحتاج إلى بعض المكتبات المتوفرة على موقع Struts 2 [http://struts.apache.org/].
![]() |
نضغط على الرابط [1] ثم على الرابط [2] لتنزيل ملف zip الخاص بالإصدار 2.2.3.1. بمجرد فك ضغط حزمة التوزيع، نجد المكتبات اللازمة لـ Struts في المجلد [lib] [3] ضمن حزمة التوزيع. نجد العشرات منها، مما يطرح السؤال حول أيها ضروري. وهنا سيساعدنا المكون الإضافي لـ Struts.










