Skip to content

7. مثال على التطبيق-04: rdvmedecins-pf-spring

7.1. النقل

سنقوم الآن بنقل التطبيق السابق إلى بيئة Spring/Tomcat:

سنبني على تطبيقين موجودين بالفعل. سنستخدم:

  • طبقات [DAO] و[JPA] من الإصدار 02 لـ JSF / Spring،
  • طبقة [web] / Primefaces من الإصدار 03 لـ PF / EJB،
  • ملفات تكوين Spring من الإصدار 02

هنا، نقوم بمهمة مشابهة لتلك التي تم القيام بها لنقل تطبيق JSF2 / EJB / Glassfish إلى بيئة JSF2 / Spring Tomcat. لذلك، سنقدم تفسيرات أقل. إذا لزم الأمر، يمكن للقارئ الرجوع إلى ذلك النقل.

نقوم بوضع جميع المشاريع اللازمة لعملية النقل في مجلد جديد [rdvmedecins-pf-spring] [1]:

  • [mv-rdvmedecins-spring-dao-jpa]: طبقات [DAO] و[JPA] لإصدار JSF/Spring 02،
  • [mv-rdvmedecins-spring-metier]: طبقة [business] للإصدار 02 من JSF / Spring،
  • [mv-rdvmedecins-pf]: طبقة [الويب] للإصدار 03 من Primefaces / EJB،
  • في [2]، نقوم بتحميلها في NetBeans،
  • في [3]، لم تعد تبعيات مشروع الويب صحيحة:
    • يجب تغيير التبعيات على طبقات [DAO] و[JPA] و[business] لتستهدف الآن مشاريع Spring؛
    • قدم خادم GlassFish مكتبات JSF. لم يعد هذا هو الحال مع خادم Tomcat. لذلك يجب إضافتها إلى التبعيات.

يتطور مشروع [الويب] على النحو التالي:

يحتوي ملف [pom.xml] الخاص بطبقة [الويب] الآن على التبعيات التالية:


<dependencies>    
    <dependency>
      <groupId>${project.groupId}</groupId>
      <artifactId>mv-rdvmedecins-spring-metier</artifactId>
      <version>${project.version}</version>
    </dependency>
    <dependency>
      <groupId>com.sun.faces</groupId>
      <artifactId>jsf-api</artifactId>
      <version>2.1.7</version>
    </dependency>
    <dependency>
      <groupId>com.sun.faces</groupId>
      <artifactId>jsf-impl</artifactId>
      <version>2.1.7</version>
    </dependency>
    <dependency>  
      <groupId>org.primefaces</groupId>  
      <artifactId>primefaces</artifactId>  
      <version>3.3</version>  
    </dependency>
  </dependencies>

تظهر أخطاء. وهي ناتجة عن مراجع EJB في طبقة [web]. دعونا أولاً نفحص حبة [Application]:

نقوم بإزالة جميع الأسطر التي تسبب أخطاء بسبب الحزم المفقودة، ونعيد تسمية [IMetier] (اسمها في طبقة [business] في Spring) إلى واجهة [IMetierLocal]، ونستخدم Spring لإنشاء مثيل لها:


package beans;
 
import java.util.ArrayList;
import java.util.List;
import org.springframework.context.ApplicationContext;
import org.springframework.context.support.ClassPathXmlApplicationContext;
import rdvmedecins.metier.service.IMetier;
 
public class Application {
 
  // business layer
  private IMetier metier;
  // errors
  private List<Erreur> erreurs = new ArrayList<Erreur>();
  private Boolean erreur = false;
 
  public Application() {
    try {
      // instantiation layer [business]
      ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-config-metier-dao.xml");
      metier = (IMetier) ctx.getBean("metier");
    } catch (Throwable th) {
      // we note the error
      erreur = true;
      erreurs.add(new Erreur(th.getClass().getName(), th.getMessage()));
      while (th.getCause() != null) {
        th = th.getCause();
        erreurs.add(new Erreur(th.getClass().getName(), th.getMessage()));
      }
      return;
    }
  }
 
  // getters
  public Boolean getErreur() {
    return erreur;
  }
 
  public List<Erreur> getErreurs() {
    return erreurs;
  }
 
  public IMetier getMetier() {
    return metier;
  }
}
  • السطران 20-21: إنشاء مثيل لطبقة [business] من ملف تكوين Spring. هذا هو الملف الذي تستخدمه طبقة [business] [1]. نقوم بنسخه إلى مشروع الويب [2]:
  • السطور 22-31: نتعامل مع أي استثناءات ونحفظ تتبع المكدس الخاص بها.

وبذلك، لم يعد لدى حبة [Application] أي أخطاء. والآن لنلقِ نظرة على حبة [Form] [1]، [2]:

نقوم بإزالة جميع الأسطر الخاطئة (عمليات الاستيراد والتعليقات التوضيحية) الناتجة عن الحزم المفقودة. وهذا يكفي لإزالة جميع الأخطاء [3].

بالإضافة إلى ذلك، نحتاج إلى إضافة دالتي getter و setter للحقل


  // bean Application
private Application application;

بعض التعليقات التوضيحية التي تمت إزالتها من حبوب [Application] و [Form] كانت تعلن عن الفئات كحبوب ذات نطاق محدد. الآن، يتم تعيين هذا التكوين في ملف [faces-config.xml] التالي [4]:


<?xml version='1.0' encoding='UTF-8'?>
 
<!-- =========== FULL CONFIGURATION FILE ================================== -->
 
<faces-config version="2.0"
              xmlns="http://java.sun.com/xml/ns/javaee" 
              xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
              xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-facesconfig_2_0.xsd">
 
  <application>
    <!-- message file -->
    <resource-bundle>
      <base-name>
        messages
      </base-name>
      <var>msg</var>
    </resource-bundle>
    <message-bundle>messages</message-bundle>
  </application>
    <!-- the applicationBean bean -->
  <managed-bean>
    <managed-bean-name>applicationBean</managed-bean-name>
    <managed-bean-class>beans.Application</managed-bean-class>
    <managed-bean-scope>application</managed-bean-scope>
  </managed-bean>
    <!-- the bean form -->
  <managed-bean>
    <managed-bean-name>form</managed-bean-name>
    <managed-bean-class>beans.Form</managed-bean-class>
    <managed-bean-scope>session</managed-bean-scope>
    <managed-property>
      <property-name>application</property-name>
      <value>#{applicationBean}</value>
    </managed-property>
  </managed-bean>
</faces-config>

عادةً ما تكون عملية النقل قد اكتملت. ومع ذلك، لا تزال هناك بعض التفاصيل التي يجب تسويتها. يمكننا محاولة تشغيل تطبيق الويب.

سنترك للقارئ مهمة اختبار هذا التطبيق الجديد. يمكننا تحسينه قليلاً للتعامل مع الحالة التي تفشل فيها تهيئة حبة [Application]. نعلم أنه في هذه الحالة، تمت تهيئة الحقول التالية:


  // erreurs
  private List<Erreur> erreurs = new ArrayList<Erreur>();
private Boolean erreur = false;

يمكن معالجة هذا السيناريو في طريقة init الخاصة بـ [Form] bean:


@PostConstruct
  private void init() {
 
    // was the initialization successful?
    if (application.getErreur()) {
      // retrieve the list of errors
      erreurs = application.getErreurs();
      // the error view is displayed
      setForms(false, false, true);
    }
 
    // caching doctors and customers
    ...
  }
  • السطر 5: إذا فشل تهيئة حبة [Application
  • السطر 7: استرجع قائمة الأخطاء،
  • السطر 9: وعرض صفحة الخطأ.

وبالتالي، إذا أوقفنا نظام إدارة قواعد البيانات MySQL وأعدنا تشغيل التطبيق، فسنرى الآن الصفحة التالية:

Image

7.2. الخلاصة

أثبت نقل تطبيق PrimeFaces/EJB/GlassFish إلى بيئة PrimeFaces/Spring/Tomcat أنه أمر بسيط. لا تزال مشكلة تسرب الذاكرة التي تم الإبلاغ عنها في دراسة تطبيق JSF/Spring/Tomcat (القسم 4.3.5) قائمة.

وسيتم حلها بنفس الطريقة.

7.3. الاختبارات باستخدام Eclipse

نقوم باستيراد مشاريع Maven إلى Eclipse [1]:

نقوم بتشغيل مشروع الويب [2].

نختار خادم Tomcat [3]. ثم تُعرض الصفحة الرئيسية للتطبيق في متصفح Eclipse الداخلي [4].