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 وأعدنا تشغيل التطبيق، فسنرى الآن الصفحة التالية:

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].









