10. تطبيق example-06: rdvmedecins-pfm-spring
10.1. النقل
نقوم الآن بنقل التطبيق السابق إلى بيئة Spring / Tomcat:
![]() |
سنعتمد على تطبيقين تمت كتابتهما مسبقًا. سنستخدم:
- الطبقات [DAO] و [JPA] من الإصدار 02 JSF / Spring،
- الطبقة [web] / Primefaces mobile من الإصدار 05 PFM / EJB،
- ملفات تكوين Spring من الإصدار 02
نقوم هنا بعمل مشابه لما تم القيام به لنقل التطبيق JSF2 / EJB / Glassfish إلى بيئة JSF2 / Spring Tomcat. ولذلك سنقدم شرحًا موجزًا. يمكن للقارئ، إذا لزم الأمر، الرجوع إلى هذا النقل.
نضع جميع المشاريع اللازمة لعملية النقل في مجلد جديد [rdvmedecins-pfm-spring] [1]:
![]() |
- [mv-rdvmedecins-spring-dao-jpa]: الطبقات [DAO] و [JPA] من الإصدار 02 JSF / Spring،
- [mv-rdvmedecins-spring-metier]: الطبقة [métier] من الإصدار 02 JSF / Spring،
- [mv-rdvmedecins-pfmobile]: الطبقة [web] من الإصدار 05 Primefaces mobile / EJB،
- في [2]، نقوم بتحميلها في Netbeans،
- في [3]، لم تعد تبعيات مشروع الويب صحيحة:
- يجب تغيير التبعيات على الطبقات [DAO] و [JPA] و [métier] لتستهدف الآن مشاريع Spring؛
- كان خادم Glassfish يوفر مكتبات JSF. لم يعد هذا هو الحال مع خادم Tomcat. لذا يجب إضافتها إلى التبعيات.
يتطور مشروع [web] على النحو التالي:
![]() |
يحتوي الملف [pom.xml] من الطبقة [web] الآن على التبعيات التالية:
<dependencies>
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>primefaces</artifactId>
<version>3.2</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>org.primefaces</groupId>
<artifactId>mobile</artifactId>
<version>0.9.1</version>
<type>jar</type>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-api</artifactId>
<version>2.1.8</version>
</dependency>
<dependency>
<groupId>com.sun.faces</groupId>
<artifactId>jsf-impl</artifactId>
<version>2.1.8</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>mv-rdvmedecins-spring-dao-jpa</artifactId>
<version>${project.version}</version>
</dependency>
<dependency>
<groupId>${project.groupId}</groupId>
<artifactId>mv-rdvmedecins-spring-metier</artifactId>
<version>${project.version}</version>
</dependency>
</dependencies>
تظهر أخطاء. وهي ناتجة عن المراجع EJB للطبقة [web]. لندرس أولاً الفول [Application]:
![]() |
نقوم بإزالة جميع الأسطر الخاطئة بسبب الحزم المفقودة، ونقوم بإعادة تسمية [IMetier] (وهذا هو اسمها في طبقة Spring [métier]) إلى واجهة [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 {
// طبقة الأعمال
private IMetier metier;
// الأخطاء
private List<Erreur> erreurs = new ArrayList<Erreur>();
private Boolean erreur = false;
public Application() {
try {
// إنشاء مثيل الطبقة [métier]
ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-config-metier-dao.xml");
metier = (IMetier) ctx.getBean("metier");
} catch (Throwable th) {
// يتم تسجيل الخطأ
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;
}
}
// مُستردات
public Boolean getErreur() {
return erreur;
}
public List<Erreur> getErreurs() {
return erreurs;
}
public IMetier getMetier() {
return metier;
}
}
- السطران 20-21: إنشاء مثيل للطبقة [métier] من ملف تكوين Spring. هذا الملف هو الملف المستخدم من قبل الطبقة [métier] [1]. نقوم بنسخه إلى مشروع الويب [2]:
![]() |
- الأسطر 22-31: ندير أي استثناء محتمل ونحفظ مكدسه في حقل السطر 14.
وبذلك، لم يعد هناك أخطاء في bean [Application]. لنلقِ نظرة الآن على bean [Form] [1]، [2]:
![]() |
|
نقوم بحذف جميع الأسطر التي تحتوي على أخطاء (import و annotations) بسبب الحزم المفقودة ونقوم بتغيير اسم واجهة [ImetierLocal] إلى [IMetier]. هذا يكفي لإزالة جميع أخطاء [3].
بالإضافة إلى ذلك، يجب إضافة getter و setter للحقل
// فئة التطبيق
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>
<!-- ملف الرسائل -->
<resource-bundle>
<base-name>
messages
</base-name>
<var>msg</var>
</resource-bundle>
<message-bundle>messages</message-bundle>
<default-render-kit-id>PRIMEFACES_MOBILE</default-render-kit-id>
</application>
<!-- البيان applicationBean -->
<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>
<!-- البيان النموذجي -->
<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>
اكتمل النقل. يمكننا الآن محاولة تشغيل تطبيق الويب.
![]() |
نترك للقارئ مهمة اختبار هذا التطبيق الجديد. يمكننا تحسينه قليلاً للتعامل مع الحالة التي تفشل فيها تهيئة bean [Application]. نعلم أنه في هذه الحالة، تمت تهيئة الحقول التالية:
// الأخطاء
private List<Erreur> erreurs = new ArrayList<Erreur>();
private Boolean erreur = false;
يمكن توقع هذه الحالة في الطريقة init للبيان [Form]:
@PostConstruct
private void init() {
// هل تمت عملية التهيئة بنجاح؟
if (application.getErreur()) {
// استرداد قائمة الأخطاء
erreurs = application.getErreurs();
// يتم عرض قائمة الأخطاء
setForms(false, false, true);
}
// يتم تخزين الأطباء والعملاء في ذاكرة التخزين المؤقت
...
}
- السطر 5: إذا تم تهيئة bean [Application] بشكل خاطئ،
- السطر 7: يتم استرداد قائمة الأخطاء،
- السطر 9: ونعرض صفحة الخطأ.
وبالتالي، إذا أوقفنا SGBD MySQL وأعدنا تشغيل التطبيق، فسنحصل الآن على الصفحة التالية:

10.2. الخلاصة
تبين أن نقل التطبيق Primefaces mobile/ EJB / Glassfish إلى بيئة Primefaces mobile / Spring / Tomcat كان أمرًا بسيطًا. لا تزال مشكلة تسرب الذاكرة التي تم الإبلاغ عنها في دراسة تطبيق JSF / Spring / Tomcat (الفقرة 4.3.5) قائمة. وسيتم حلها بالطريقة نفسها.
10.3. الاختبارات باستخدام Eclipse
نقوم باستيراد مشاريع Maven إلى Eclipse [1]:
![]() |
نقوم بتشغيل مشروع الويب [2].
![]() |
نختار خادم Tomcat [3]. ثم يتم عرض الصفحة الرئيسية للتطبيق في متصفح Eclipse الداخلي [4].
10.4. الاختبارات على الهاتف المحمول
لاختبار التطبيق على الهاتف المحمول، نتبع الخطوات الموضحة في الفقرة 8.5.6. فيما يلي صور للتطبيق:
![]() | ![]() |
![]() | ![]() |














