Skip to content

7. Örnek uygulama-04: rdvmedecins-pf-spring

7.1. Uygulamanın taşınması

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

Zaten yazılmış iki uygulamadan yararlanacağız. Şunları kullanacağız:

  • 02 sürümündeki [DAO] ve [JPA] katmanları ile JSF / Spring,
  • 03 sürümündeki [web] / Primefaces katmanı (PF / 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-pf-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-pf]: 03 sürümündeki [web] katmanı Primefaces / 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ına ilişkin 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 artık böyle değil. 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>${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>

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 {
      // katmanın örneklenmesi [métier]
      ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-config-metier-dao.xml");
      metier = (IMetier) ctx.getBean("metier");
    } catch (Throwable th) {
      // hata kaydediliyor
      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ı yönetiyoruz ve istisna yığınını kaydediyoruz.

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

Eksik paketler nedeniyle hatalı tüm satırları (import ve açıklamalar) siliyoruz. Bu, [3] ile ilgili tüm hataları 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'ler 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>
  </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>

Normalde, taşıma işlemi tamamlanmıştır. Ancak halletmemiz gereken birkaç ayrıntı kalmıştır. 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ılmış olduğu 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

7.2. Conclusion

Primefaces / EJB / Glassfish uygulamasının Primefaces / Spring / Tomcat ortamına taşınması kolay oldu. JSF / Spring / Tomcat uygulaması incelemesinde (4.3.5. paragraf) bildirilen bellek sızıntısı sorunu devam etmektedir.

Bu sorun da aynı şekilde çözülecektir.

7.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ülenir [4].