Skip to content

10. Örnek uygulama-06: rdvmedecins-pfm-spring

10.1. Uygulamanın Taşınması

Şimdi önceki uygulamayı Spring / Tomcat ortamına taşıyoruz:

Daha önce yazılmış iki uygulamadan yararlanacağız. Şunları kullanacağız:

  • 02 sürümündeki [DAO] ve [JPA] katmanları JSF / Spring,
  • 05 sürümündeki [web] / Primefaces mobile katmanı (PFM / EJB),
  • sürüm 02'ye ait Spring yapılandırma dosyaları

Burada, JSF2 / EJB / Glassfish uygulamasını bir JSF2 / Spring Tomcat ortamına taşımak için yapılan çalışmaya benzer bir çalışma yapıyoruz. Bu nedenle daha az açıklama yapacağız. Okuyucu, gerekirse bu taşıma çalışmasına başvurabilir.

Taşıma işlemi için gerekli tüm projeleri yeni bir [rdvmedecins-pfm-spring] [1] klasörüne yerleştiriyoruz:

  • [mv-rdvmedecins-spring-dao-jpa]: 02 sürümünün [DAO] ve [JPA] katmanları JSF / Spring,
  • [mv-rdvmedecins-spring-metier]: 02 sürümündeki [métier] katmanı (JSF / Spring),
  • [mv-rdvmedecins-pfmobile]: 05 sürümündeki [web] katmanı Primefaces mobile / EJB,
  • [2]'e dönüştürdükten sonra bunları NetBeans'e yüklediğimizde,
  • [3]'te, web projesinin bağımlılıkları artık doğru değil:
    • [DAO], [JPA] ve [métier] katmanlarındaki bağımlılıklar, artık Spring projelerini hedef alacak şekilde değiştirilmelidir;
    • Glassfish sunucusu, JSF kütüphanelerini sağlıyordu. Tomcat sunucusunda ise durum böyle değildir. Bu nedenle, bu kütüphaneler bağımlılıklara eklenmelidir.

[web] projesi şu şekilde güncellenmiştir:

[web] katmanındaki [pom.xml] dosyası artık aşağıdaki bağımlılıklara sahiptir:


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

Hatalar ortaya çıkıyor. Bu hatalar, [web] katmanındaki EJB referanslarından kaynaklanıyor. Öncelikle [Application] bean'ini inceleyelim:

Eksik paketler nedeniyle hatalı olan tüm satırları kaldırıyoruz, [IMetier]'i (bu, Spring'in [métier] katmanındaki adıdır) [IMetierLocal] arayüzü olarak yeniden adlandırıyoruz ve Spring'i kullanarak bunun bir örneğini oluşturuyoruz:


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 {

  // iş mantığı katmanı
  private IMetier metier;
  // hatalar
  private List<Erreur> erreurs = new ArrayList<Erreur>();
  private Boolean erreur = false;

  public Application() {
    try {
      // [métier] katmanının örneklenmesi
      ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-config-metier-dao.xml");
      metier = (IMetier) ctx.getBean("metier");
    } catch (Throwable th) {
      // hatkayı kaydediyoruz
      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;
    }
  }

  // alıcılar
  public Boolean getErreur() {
    return erreur;
  }

  public List<Erreur> getErreurs() {
    return erreurs;
  }

  public IMetier getMetier() {
    return metier;
  }
}
  • 20-21. satırlar: Spring yapılandırma dosyasından [métier] katmanının örneklenmesi. Bu dosya, [métier] ve [1] katmanları tarafından kullanılan dosyadır. Bunu [2] web projesine kopyalıyoruz:
  • 22-31. satırlar: Olası bir istisnayı işliyoruz ve istisna yığınını 14. satırdaki alana kaydediyoruz.

Bu işlem tamamlandıktan sonra, [Application] bean'inde artık hata kalmamıştır. Şimdi [Form], [1] ve [2] bean'lerine bakalım:

3
4

Eksik paketler nedeniyle hatalı tüm satırları (ithalat ve açıklamalar) siliyoruz ve [IMetier] arayüzünü [ImetierLocal] olarak yeniden adlandırıyoruz. Bu, tüm [3] hatalarını ortadan kaldırmak için yeterlidir.

Ayrıca, [Form] bean koduna,


  // Application bean'i
private Application application;

[Application] ve [Form] bean'lerinde kaldırılan bazı anotasyonlar, sınıfları belirli bir kapsamda bean olarak tanımlıyordu. Artık bu yapılandırma, aşağıdaki [faces-config.xml] ve [4] dosyalarında yapılmaktadır:


<?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>
    <!-- mesaj dosyası -->
    <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 bean'i -->
  <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>
    <!-- form bean'i -->
  <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>

Taşıma işlemi tamamlandı. Web uygulamasını çalıştırmayı deneyebiliriz.

Bu yeni uygulamayı okuyucunun test etmesine bırakıyoruz. [Application] bean'inin başlatılmasının başarısız olduğu durumu yönetmek için uygulamayı biraz iyileştirebiliriz. Bu durumda, aşağıdaki alanların başlatıldığı bilinmektedir:


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

Bu durum, [Form] bean'inin init yönteminde öngörülebilir:


@PostConstruct
  private void init() {

    // başlatma işlemi başarılı oldu mu?
    if (application.getErreur()) {
      // hata listesi alınır
      erreurs = application.getErreurs();
      // hatalar sayfası görüntüleniyor
      setForms(false, false, true);
    }

    // doktorlar ve müşteriler önbelleğe alınıyor
    ...
  }
  • 5. satır: [Application] bean'i hatalı bir şekilde başlatılmışsa,
  • 7. satır: hata listesi alınır,
  • 9. satır: hata sayfası görüntülenir.

Böylece, SGBD ve MySQL'i durdurup uygulamayı yeniden başlattığımızda, artık şu sayfayı görüyoruz:

Image

10.2. Conclusion

Primefaces mobile / EJB / Glassfish uygulamasının Primefaces mobile / Spring / Tomcat ortamına taşınması kolay oldu. JSF / Spring / Tomcat uygulamasının incelemesinde (4.3.5. paragraf) bildirilen bellek sızıntısı sorunu devam etmektedir. Bu sorun da aynı şekilde çözülecektir.

10.3. Eclipse ile testler

Maven projelerini Eclipse'e içe aktarıyoruz [1]:

[2] web projesini çalıştırıyoruz.

Tomcat sunucusunu seçiyoruz: [3]. Ardından, uygulamanın ana sayfası Eclipse'in dahili tarayıcısında görüntüleniyor: [4].

10.4. Mobil cihazlarda testler

Uygulamayı mobil cihazda test etmek için 8.5.6 numaralı paragrafta belirtildiği şekilde ilerleyeceğiz. İşte uygulamanın fotoğrafları: