Skip to content

22. الخلاصة

دعونا نستعرض ما قمنا به في هذا المستند. لقد قمنا بدراسة طبقتين [DAO] باستخدام إحدى البنيتين التاليتين:

تم تنفيذ الطبقة [DAO1] باستخدام Spring JDBC، بينما تم تنفيذ الطبقة [DAO2] باستخدام Spring JPA. كانت الطبقتان [DAO1] و [DAO2] تنفذان نفس الواجهة [IDAO]، مما سمحكتابة اختبار واحد [JUnitTestDao] لاختبار الطبقتين [DAO

وبعد ذلك، قمنا بعرض الواجهة [IDAO] على الويب بالطريقة التالية:

  • في [1]، تم عرض الطبقة [IDAO] على الويب من خلال طبقة ويب [2] تم تنفيذها بواسطة Spring MVC. إن واجهة [IDAO] هي بالفعل الواجهة المعروضة، وقد أنشأنا نسختين من خدمة الويب اعتمادًا على ما إذا كانت هذه الواجهة مُنفَّذة باستخدام بنية [DAO-JDBC] أو [DAO-JPA-JDBC
  • في [B]، يستخدم العميل البعيد واجهات URL التي تعرضها خدمة الويب والتي تتيح الوصول إلى أساليب الطبقة [IDAO-serveur]. وقد حرصنا على أن تقوم الطبقة [DAO-Client] [3] بتنفيذ واجهة [IDAO-serveur] [1]. وقد سمح لنا ذلك باستخدام نفس الاختبار [JUnitTestDao] الذي سبق استخدامه مرتين؛
  • في [3]، تم تنفيذ الطبقة [DAO-client] باستخدام Spring RestTemplate؛

وبعد ذلك، قمنا بتأمين الوصول إلى خدمة الويب:

  • في [5]، يمر طلب العميل HTTP عبر طبقة مصادقة تم تنفيذها باستخدام Spring Security؛

وبذلك، قمنا بتطوير البنية السابقة إلى ما يلي:

  • في [3]، تطبيق العميل هو في حد ذاته تطبيق ويب يتم تقديمه بواسطة خادم الويب [4]. يعرض تطبيق العميل في المتصفح نموذجًا [5] يتيح الاستعلام عن URL من خدمة الويب الآمنة. تتم عمليات الوصول HTTP إلى خدمة الويب الآمنة بفضل طبقة [jS] مُنفَّذة بلغة جافا سكريبت. تُنفِّذ هذه البنية ما يُعرف باسم «الطلبات عبر النطاقات»:
    • تقدم خدمة الويب URL بالصيغة [http://machine1:port1/
    • يتم تنزيل تطبيق الويب الخاص بالعميل من عنوان URL إلى عنوان [http://machine2:port2/]. إذا لم تكن [http://machine2:port2/] مطابقة لـ [http://machine1:port1/] (نفس الجهاز، نفس المنفذ)، فسيحظر متصفح العميل استدعاءات HTTP الواردة من الطبقة [DAO-client-js]. لحل هذه المشكلة، يجب أن تسمح خدمة الويب بالطلبات عبر النطاقات؛

تم اختبار المشاريع المعروضة باستخدام قواعد البيانات الست التالية:

  • MySQL 5 Community Edition؛
  • SQL Server 2014 Express؛
  • PostgreSQL 9.4؛
  • Oracle Express 11g الإصدار 2؛
  • IBM DB2 Express-C 10.5؛
  • Firebird 2.5.4؛

بالنسبة لكل من هذه SGBD، تم تطوير أربع طبقات [DAO] مختلفة:

  • طبقة تم تنفيذها باستخدام Spring JDBC؛
  • طبقة تم تنفيذها باستخدام Spring JPA ومزود Hibernate JPA؛
  • طبقة تم تنفيذها باستخدام Spring JPA ومزود JPA EclipseLink؛
  • طبقة مُنفَّذة باستخدام Spring JPA والمزود JPA OpenJPA؛

وبالتالي، تم عرض مجموعة مكونة من أربعة وعشرين تكوينًا مختلفًا. وقد بذلنا جهدًا كبيرًا في عملية التحليل:

  • حيث تمت كتابة الجزء الأكبر من الكود مرة واحدة فقط. ويستند هذا إلى مشروعين من مشاريع Maven للتكوين:
    • أحدهما يقوم بتكوين الطبقة JDBC؛
    • والآخر يقوم بتكوين الطبقة JPA؛

يتيح مشروع التكوين في Maven للطبقة JDBC [1] الخاصة بـ SGBD ما يلي:

  • استيراد أرشيف برنامج التشغيل JDBC؛
  • تحديد معرّفات الوصول إلى قاعدة البيانات المستخدمة والأوامر المختلفة التي ستصدرها الطبقة [DAO1] إلى برنامج التشغيل JDBC. على الرغم من أن SQL معياري، فقد واجهنا مشاكل في قابلية النقل، ويرجع ذلك أساسًا إلى وجود أسماء جداول/أعمدة في الاستعلامات تبين أنها كلمات رئيسية محظورة في بعض SGBD (الجدول ROLES لـ DB2، والعمود PASSWORD لـ Firebird). من ناحية أخرى، على الرغم من أن اسم العمود عادةً ما يكون غير حساس لحالة الأحرف (كبيرة/صغيرة)، فقد واجهنا مشكلة مع PostgreSQL فيما يتعلق بالعمود ID الخاص بالمفتاح الأساسي للجداول. فقد أراد أن يُسمى id بأحرف صغيرة؛

تتيح مشاريع Maven الثلاثة الخاصة بتكوين الطبقة JPA و[2] لـ SGBD المحدد ما يلي:

  • استيراد أرشيف التنفيذ JPA؛
  • تكوين التنفيذ JPA المستخدم لـ SGBD المحدد المتصل. ففي الواقع، الطبقة JPA هي التي ترسل الأوامر SQL إلى الطبقة JDBC. ولكي تكون فعالة، يجب أن تعرف SGBD حتى ترسل إليه الأوامر SQL التي سيتعرف عليها. ويمكن لهذه الأوامر استخدام SQL، وهو المالك لـ SGBD، بالإضافة إلى الخصائص المميزة لهذا الأخير (أنواع البيانات، التسلسلات، المشغلات، الإجراءات، التوليد التلقائي للمفاتيح الأولية، ...)؛

وبذلك تم إنشاء أربعة وعشرين مشروعًا (4 تكوينات × 6 SGBD) من تكوينات Maven التي استندت إليها جميع المشاريع الأخرى المتعلقة بتشغيل قاعدة البيانات. في المخططات أعلاه، وبما أن الطبقتين [DAO1] و [DAO2] توفران نفس الواجهة، فقد تم اختبار التكوينات الـ 24 للبنيتين المذكورتين أعلاه باستخدام فئة الاختبار الوحيدة [JUnitTestDao]. وبمجرد التحقق من صحة هاتين البنيتين، لم تعد هناك أي صعوبات:

  • يعتمد مشروع Maven لنشر قاعدة البيانات على الويب على هاتين البنيتين. وبالتالي، هناك أيضًا 24 تكوينًا ممكنًا؛
  • يعتمد مشروع Maven لتأمين الوصول إلى خدمة الويب على المشروع السابق، ولديه أيضًا 24 تكوينًا ممكنًا؛
  • وأخيرًا، يعتمد مشروع Maven الذي يسمح بالاستعلامات عبر المجالات إلى الخدمة الويب الآمنة على المشروع السابق، ويحتوي هو الآخر على 24 تكوينًا ممكنًا؛

على الرغم من أن هذا المستند لا يغطي جميع إمكانيات لغة Java ولا جميع مجالات تطبيقها، إلا أنه يمكن استخدامه كوثيقة تعليمية لتعلم اللغة. وسيكون القارئ الذي استوعب محتوى هذه الدورة قد وصل إلى مستوى «Java المتقدم» سواء في استخدام اللغة أو في استخدام إطار عمل Spring. ويمكنه عندئذ مواصلة تدريبه على لغة Java من خلال الكتب التالية:

  • [Spring MVC et Thymeleaf par l'exemple] [http://tahe.developpez.com/java/springmvc-thymeleaf] الذي يواصل تعلم منظومة Spring من خلال عرض فرعها «برمجة الويب MVC». ويستخدم هذا الكتاب قاعدة بيانات أكثر تعقيدًا من تلك التي تمت دراستها هنا؛
  • [Tutoriel AngularJS / Spring MVC] [http://tahe.developpez.com/angularjs-spring4] الذي يتميز بهيكل ويب من نوع «العميل/الخادم»، حيث يتم تنفيذ العميل باستخدام إطار العمل [AngularJS]، بينما يتم تنفيذ الخادم باستخدام [Spring MVC
  • [Introduction à Java EE] [http://tahe.developpez.com/java/javaee] الذي يتخلى عن بيئة Spring لصالح بنية ويب تستند إلى JSF (Java Server Faces) وEJB (Enterprise Java Bean
  • [Introduction à la programmation des tablettes Android] [http://tahe.developpez.com/android/exemples-intellij-aa] التي تصف بنية عميل/خادم، حيث يكون العميل جهازًا لوحيًّا يعمل بنظام Android ومبرمجًا بلغة Java، والخادم خدمة ويب تم تنفيذها بواسطة Spring MVC؛