يتطلب Struts1 أن ترث فئات الإجراء فئة أساسية مجردة. من المشاكل الشائعة في Struts1 البرمجة باستخدام فئات مجردة بدلاً من الواجهات.
• يمكن لفئة Struts 2 Action تنفيذ واجهة إجراء أو واجهات أخرى، مما يجعل الخدمات الاختيارية والمخصصة ممكنة. يوفر Struts2 فئة أساسية ActionSupport لتنفيذ الواجهات شائعة الاستخدام. واجهة الإجراء غير مطلوبة، ويمكن استخدام أي كائن POJO بمعرف التنفيذ ككائن الإجراء في Struts2.
وضع الموضوع:
• إجراء Struts1 هو وضع فردي ويجب أن يكون آمنًا لسلسلة العمليات، لأن مثيل واحد فقط من الإجراء يعالج جميع الطلبات. تحدد الإستراتيجية الفردية ما يمكن أن تفعله Struts1 Action، ويجب توخي الحذر بشكل خاص أثناء التطوير. يجب أن تكون موارد الإجراء آمنة لمؤشر الترابط أو متزامنة.
• يقوم كائن الإجراء Struts2 بإنشاء مثيل لكل طلب، لذلك لا توجد مشكلات تتعلق بسلامة سلسلة الرسائل. (في الواقع، تقوم حاوية servlet بإنشاء العديد من الكائنات القابلة للتجاهل لكل طلب ولا تسبب مشاكل في الأداء وإعادة تدوير LJ)
تبعيات السيرفلت:
• يعتمد إجراء Struts1 على Servlet API لأنه يتم تمرير HttpServletRequest وHttpServletResponse إلى أسلوب التنفيذ عند استدعاء الإجراء.
• لا يعتمد إجراء Struts 2 على الحاوية، مما يسمح باختبار الإجراء بشكل مستقل عن الحاوية. لا يزال بإمكان Struts2 Action الوصول إلى الطلب الأصلي والاستجابة إذا لزم الأمر. ومع ذلك، هناك عناصر أخرى تقلل أو تلغي الحاجة إلى الوصول إلى HttpServetRequest وHttpServletResponse مباشرة.
قابلية الاختبار:
• إحدى المشاكل الرئيسية في اختبار إجراءات Struts 1 هي أن طريقة التنفيذ تكشف عن واجهة برمجة تطبيقات servlet (مما يجعل الاختبار يعتمد على الحاوية). يوفر ملحق الجهة الخارجية - Struts TestCase - مجموعة من كائنات Struts1 الوهمية (للاختبار).
يمكن اختبار Struts 2 Action عن طريق التهيئة وتعيين الخصائص وأساليب الاتصال، كما أن دعم "حقن التبعية" يجعل الاختبار أسهل.
التقاط المدخلات:
• يستخدم Struts1 كائنات ActionForm لالتقاط الإدخال. يجب أن ترث كافة ActionForms فئة أساسية. نظرًا لأنه لا يمكن استخدام JavaBeans الأخرى كنماذج ActionForms، فغالبًا ما يقوم المطورون بإنشاء فئات زائدة عن الحاجة لالتقاط المدخلات. يمكن استخدام Dynamic Beans (DynaBeans) كبديل لإنشاء ActionForms التقليدية، ومع ذلك، قد يقوم المطورون بإعادة وصف (إنشاء) JavaBeans الموجودة (لا يزال ينتج عنها Javabeans زائدة عن الحاجة).
• يستخدم Struts 2 خصائص الإجراء مباشرة كخصائص إدخال، مما يلغي الحاجة إلى كائن إدخال ثانٍ. قد تكون خصائص الإدخال عبارة عن أنواع كائنات غنية بخصائصها (الفرعية). يمكن الوصول إلى خصائص الإجراء من خلال العلامات الموجودة على صفحة الويب. يدعم Struts2 أيضًا وضع ActionForm. يمكن استخدام أنواع الكائنات الغنية، بما في ذلك كائنات الأعمال، ككائنات إدخال/إخراج. تعمل ميزة ModelDriven هذه على تبسيط مرجع taglib إلى كائنات إدخال POJO.
لغة التعبير:
• يدمج Struts1 JSTL وبالتالي يستخدم JSTL EL. يحتوي EL هذا على اجتياز الرسم البياني للكائنات الأساسية، لكن دعم المجموعات والخصائص المفهرسة ضعيف.
• يمكن لـ Struts2 استخدام JSTL، ولكنه يدعم أيضًا لغة تعبير أكثر قوة ومرونة - "لغة تدوين الرسم البياني للكائنات" (OGNL).
ربط القيمة بالصفحة (العرض):
• يستخدم Struts 1 آليات JSP القياسية لربط الكائنات بالصفحات للوصول إليها.
يستخدم Struts 2 تقنية "ValueStack" لتمكين taglib من الوصول إلى القيم دون ربط صفحتك (العرض) بالكائن. تسمح استراتيجية ValueStack بإعادة استخدام الصفحات (طرق العرض) من خلال سلسلة من الخصائص بنفس الاسم ولكن بأنواع مختلفة.
نوع التحويل:
• خصائص Struts 1 ActionForm عادة ما تكون من النوع String. يستخدم Struts1 Commons-Beanutils لتحويل النوع. محول واحد لكل فئة، غير قابل للتكوين لكل مثيل.
• يستخدم Struts2 OGNL لتحويل النوع. يوفر محولات للكائنات الأساسية وشائعة الاستخدام.
يفحص:
• يدعم Struts 1 التحقق اليدوي بطريقة التحقق من صحة ActionForm، أو التحقق من خلال ملحق Commons Validator. يمكن أن تحتوي نفس الفئة على محتويات تحقق مختلفة، ولكن لا يمكن التحقق من الكائنات الفرعية.
• يدعم Struts2 التحقق من خلال طريقة التحقق وإطار التحقق XWork. يستخدم إطار عمل التحقق من صحة XWork التحقق من الصحة والتحقق من صحة المحتوى المحدد لنوع فئة السمة لدعم الخاصية الفرعية للتحقق من صحة السلسلة.
مراقبة تنفيذ الإجراء:
• يدعم Struts1 معالجات الطلبات المنفصلة (دورة الحياة) لكل وحدة، ولكن يجب أن تشترك جميع الإجراءات في الوحدة في نفس دورة الحياة.
• يدعم Struts2 إنشاء دورات حياة مختلفة لكل إجراء من خلال Interceptor Stacks. يمكن استخدام الأكوام مع إجراءات مختلفة حسب الحاجة
هذه المقالة مأخوذة من مدونة CSDN، يرجى الإشارة إلى المصدر عند إعادة الطباعة: http://blog.csdn.net/Ryan_lz/archive/2009/12/29/5101758.aspx.