Skip to content

10. اپلیکیشن نمونه-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] را بررسی کنیم:

ما تمام خطوطی را که به دلیل عدم وجود بسته‌ها خطا ایجاد می‌کنند، حذف می‌کنیم، رابط [IMetierLocal] را به [IMetier] تغییر نام می‌دهیم (این نام آن در لایه Spring [métier] است) و از 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;
  }
}
  • خطوط ۲۰–۲۱: نمونه‌سازی لایه [métier] از فایل پیکربندی Spring. این فایلی است که توسط لایه‌های [métier] و [1] استفاده می‌شود. ما آن را در پروژه وب [2] کپی می‌کنیم:
  • خطوط ۲۲–۳۱: ما هر استثنا را مدیریت می‌کنیم و ردپای استک آن را در فیلد خط ۱۴ ذخیره می‌کنیم.

با انجام این کار، بین [Application] دیگر هیچ خطایی ندارد. اکنون بیایید به بین‌های [Form]، [1] و [2] نگاهی بیندازیم:

3
4

ما تمام خطوط نادرست (واردات و anotationها) ناشی از پکیج‌های گم‌شده را حذف کرده و رابط [IMetier] را به [ImetierLocal] تغییر نام می‌دهیم. این کار برای از بین بردن تمام خطاهای [3] کافی است.

علاوه بر این، گتر و ستر برای فیلد


  // بیان برنامه
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>

پورت کامل شد. اکنون می‌توانیم اجرای برنامه وب را امتحان کنیم.

آزمون این برنامه جدید را به خواننده واگذار می‌کنیم. می‌توانیم آن را کمی بهبود دهیم تا در صورتی که فرآیند инициализация (ابتدایی‌سازی) بیون [Application] با شکست مواجه شود، با این وضعیت برخورد کند. می‌دانیم که در این حالت، فیلدهای زیر инициализация شده‌اند:


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

این سناریو را می‌توان در متد init از بیون [Form] مدیریت کرد:


@PostConstruct
  private void init() {

    // آیا inicialization موفق بود؟
    if (application.getErreur()) {
      // بازیابی فهرست خطاها
      erreurs = application.getErreurs();
      //نمای خطاها نمایش داده می‌شود
      setForms(false, false, true);
    }

    // کش کردن پزشکان و مشتریان
    ...
  }
  • خط ۵: اگر bean [Application] در инициалиزه‌سازی ناموفق بوده باشد،
  • خط ۷: فهرست خطاها را بازیابی کنید،
  • خط ۹: و صفحهٔ خطا را نمایش می‌دهیم.

بنابراین، اگر SGBD و MySQL را متوقف کرده و برنامه را مجدداً راه‌اندازی کنیم، اکنون صفحه زیر را مشاهده می‌کنیم:

Image

10.2. Conclusion

مهاجرت برنامه PrimeFaces Mobile / EJB / GlassFish به محیط PrimeFaces Mobile / Spring / Tomcat ساده بود. مشکل نشت حافظه که در تحلیل برنامه JSF / Spring / Tomcat (بخش 4.3.5) گزارش شده بود، همچنان پابرجاست. این مشکل به همان روش حل خواهد شد.

10.3. آزمایش با اکلیپس

ما پروژه‌های Maven را به Eclipse [1] وارد می‌کنیم:

ما پروژه وب [2] را اجرا می‌کنیم.

ما سرور Tomcat [3] را انتخاب می‌کنیم. صفحهٔ اصلی برنامه سپس در مرورگر داخلی Eclipse [4] نمایش داده می‌شود.

10.4. آزمایش موبایل

برای آزمایش برنامه روی دستگاه موبایل، مراحل شرح‌داده‌شده در بخش 8.5.6 را دنبال کنید. در اینجا چند اسکرین‌شات از برنامه آورده شده است: