Skip to content

11. الإصدار 6 - دمج طبقة الويب في بنية JSF/EJB ثلاثية المستويات

11.1. بنية التطبيق

كانت بنية تطبيق الويب السابق كما يلي:

نستبدل الطبقة [التجارية] المحاكاة بالطبقات [التجارية، DAO، JPA] التي تم تنفيذها بواسطة EJBs في القسم 7.1:

11.2. مشروع NetBeans لطبقة الويب

يتم إنشاء مشروع NetBeans للإصدار 2 من الويب عن طريق نسخ المشروع السابق:

  • [1]: انسخ المشروع الجديد والصقه في علامة التبويب [Projects
  • [2]: قم بتسميته وتعيين مجلده،
  • [3]: تم إنشاء المشروع،

يحمل المشروع الجديد نفس اسم المشروع القديم. نقوم بتغيير ذلك:

  • [4]: قم بتغيير اسم المشروع،
  • [5]: قم بتغيير اسمه وكذلك معرف الأداة (artifactID).

هناك بعض التغييرات التي يجب إجراؤها لتكييف طبقة الويب هذه مع بيئتها الجديدة: يجب استبدال طبقة [business] المحاكاة بطبقة [business, DAO, JPA] الخاصة بالخادم الذي تم إنشاؤه في القسم 7.1. للقيام بذلك، نقوم بأمرين:

  • نقوم بإزالة حزم [exception، business، jpa] التي كانت موجودة في المشروع السابق.
  • ولتعويض هذا الحذف، نضيف مشروع خادم EJB الذي تم إنشاؤه في القسم 7.1 إلى تبعيات مشروع الويب.
  • في [1]، نضيف تبعية إلى المشروع،
  • في [2]، نختار مشروع Maven الخاص بطبقة [الأعمال]. وفي [3]، نحدد نوعه، وفي [4] نحدد نطاقه. يتم تعيين النطاق إلى `provided` للإشارة إلى أنه سيتم توفيره لوحدة الويب من قِبل بيئة التشغيل الخاصة بها. وسنرى بعد قليل أنه سيتم توفيره بواسطة تطبيق مؤسسي،
  • في [5]، تمت إضافة التبعية.

يصبح ملف [pom.xml] كما يلي:


  private boolean viewInfosIsRendered;

يمكننا الآن إزالة الحزم من طبقة [business] التي لم تعد مطلوبة:

  

نحتاج أيضًا إلى تعديل الكود في مكون [Form.java]:


<dependencies>
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>mv-pam-ejb-metier-dao-eclipselink</artifactId>
      <version>${project.version}</version>
      <scope>provided</scope>
      <type>ejb</type>
    </dependency>
    <dependency>
      <groupId>javax</groupId>
      <artifactId>javaee-web-api</artifactId>
      <version>6.0</version>
      <scope>provided</scope>
    </dependency>
  </dependencies>

السطر 7 قام بإنشاء مثيل لطبقة [business] المحاكاة. الآن يجب أن يشير إلى طبقة [business] الفعلية. يصبح الكود السابق كما يلي:


public class Form {
 
  public Form() {
  }
 
  // business layer
  private IMetierLocal metier=new Metier();
 
  // form fields
...

السطر 7: توجه العلامة @EJB حاوية السيرفلت — التي ستقوم بتنفيذ طبقة الويب — إلى إدخال EJB الذي ينفذ الواجهة المحلية IMetierLocal في حقل الأعمال في السطر 8.

لماذا الواجهة المحلية IMetierLocal بدلاً من الواجهة IMetierRemote؟ لأن طبقة الويب وطبقة EJB تعملان في نفس JVM:

يمكن للفئات الموجودة في حاوية السيرفلت الإشارة مباشرةً إلى فئات EJB الموجودة في حاوية EJB.

هذا كل شيء. طبقة الويب لدينا جاهزة. كان التحويل بسيطًا لأننا حرصنا على محاكاة طبقة [الأعمال] باستخدام فئة تتوافق مع واجهة IMetierLocal التي تنفذها طبقة [الأعمال] الفعلية.

11.3. مشروع NetBeans للتطبيق المؤسسي

يسمح تطبيق المؤسسة بالنشر المتزامن لطبقة [الويب] وطبقة EJB للتطبيق على خادم التطبيقات، في حاوية السيرفلت وحاوية EJB، على التوالي.

نقوم بما يلي:

  • في [1]، نقوم بإنشاء مشروع جديد
  • في [2]، نختار فئة [Maven]
  • في [3]، نختار نوع [تطبيق المؤسسة]
  • في [4]، نسمي المشروع
  • في [5]، نختار Java EE 6
  • في [6]، يمكن أن يتضمن مشروع المؤسسة ما يصل إلى نوعين من الوحدات النمطية:
    • وحدة EJB
    • وحدة ويب

عند إنشاء مشروع المؤسسة، يمكنك طلب إنشاء هاتين الوحدتين، اللتين ستكونان فارغتين في البداية. يُستخدم مشروع المؤسسة حصريًا لنشر الوحدات التي يحتوي عليها. عدا ذلك، فهو مجرد هيكل فارغ. هنا، نريد نشر:

  • وحدة ويب موجودة [mv-pam-jsf2-alone]. لذلك، لا داعي لإنشاء وحدة ويب جديدة.
  • وحدة EJB موجودة [mv-pam-ejb-metier-dao-eclipselink]. هنا أيضًا، لا توجد حاجة لإنشاء وحدة جديدة.

في [6]، نقوم بإنشاء مشروع مؤسسي بدون وحدات. سنقوم بإضافة وحدات الويب ووحدات EJB الخاصة به لاحقًا.

  • في [7]، تم إنشاء مشروعين Maven. مشروع المؤسسة هو المشروع الذي يحمل اللاحقة .ear. المشروع الآخر هو مشروع Maven أم للمشروع الأول. لن نهتم به.

نضيف وحدة الويب ووحدة EJB إلى مشروع المؤسسة:

  • في [1]، أضف تبعية جديدة،
  • في [2]، أضف مشروع EJB [mv-pam-ejb-metier-dao-eclipselink]. لاحظ نوع EJB الخاص به،
  • في [3]، أضف مشروع الويب [mv-pam-jsf2-ejb]. لاحظ أن نوعه هو war.

يصبح ملف [pom.xml] كما يلي:


public class Form {
 
  public Form() {
  }
 
  // business layer
  @EJB
  private IMetierLocal metier;
 
  // form fields

قبل نشر تطبيق المؤسسة [mv-pam-webapp-ear]، تأكد من وجود قاعدة بيانات MySQL [dbpam_eclipselink] ومن أنها مملوءة بالبيانات. بمجرد الانتهاء من ذلك، يمكننا نشر تطبيق المؤسسة [mv-pam-webapp-ear]:

  • في [1]، تم نشر تطبيق المؤسسة
  • في [2]، تم نشر تطبيق المؤسسة [mv-pam-webapp-ear] بنجاح.

في المتصفح، تظهر الصفحة التالية:

  • في [1]، عنوان URL المطلوب
  • في [2]، تم ملء قائمة الموظفين بالمدخلات من جدول [Employees] في قاعدة بيانات dbpam.

ندعو القارئ إلى تكرار الاختبارات من الإصدار 1 على الويب. وفيما يلي مثال على التنفيذ:

Image