Skip to content

7. Aplikacja przykładowa-04: rdvmedecins-pf-spring

7.1. Przeniesienie

Teraz przenosimy poprzednią aplikację do środowiska Spring / Tomcat:

Będziemy opierać się na dwóch już napisanych aplikacjach. Wykorzystamy:

  • warstwy [DAO] i [JPA] z wersji 02 JSF / Spring,
  • warstwę [web] / Primefaces z wersji 03 PF / EJB,
  • pliki konfiguracyjne Springa w wersji 02

Wykonujemy tutaj pracę podobną do tej, którą przeprowadzono w celu przeniesienia aplikacji JSF2 / EJB / Glassfish do środowiska JSF2 / Spring Tomcat. Dlatego też podamy mniej wyjaśnień. W razie potrzeby czytelnik może zapoznać się z tym przeniesieniem.

Wszystkie projekty niezbędne do przeniesienia umieszczamy w nowym folderze [rdvmedecins-pf-spring] [1]:

  • [mv-rdvmedecins-spring-dao-jpa]: warstwy [DAO] i [JPA] z wersji 02 JSF / Spring,
  • [mv-rdvmedecins-spring-metier]: warstwa [métier] z wersji 02 JSF / Spring,
  • [mv-rdvmedecins-pf]: warstwa [web] z wersji 03 Primefaces / EJB,
  • w [2], ładujemy je do NetBeans,
  • w [3] zależności projektu internetowego nie są już poprawne:
    • zależności od warstw [DAO], [JPA], [métier] należy zmienić, aby odnosiły się teraz do projektów Spring;
    • serwer Glassfish dostarczał biblioteki z projektu JSF. W przypadku serwera Tomcat tak już nie jest. Należy zatem dodać je do zależności.

Projekt [web] zmienia się w następujący sposób:

Plik [pom.xml] z warstwy [web] ma teraz następujące zależności:


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

Pojawiają się błędy. Wynikają one z odwołań do pliku EJB w warstwie [web]. Przyjrzyjmy się najpierw beanowi [Application]:

Usuwamy wszystkie wiersze zawierające błędy spowodowane brakującymi pakietami, zmieniamy nazwę [IMetier] (tak nazywa się on w warstwie [métier] Spring) na interfejs [IMetierLocal] i używamy Springa do utworzenia jego instancji:


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 {

  // warstwa biznesowa
  private IMetier metier;
  // błędy
  private List<Erreur> erreurs = new ArrayList<Erreur>();
  private Boolean erreur = false;

  public Application() {
    try {
      // instancjonowanie warstwy [métier]
      ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-config-metier-dao.xml");
      metier = (IMetier) ctx.getBean("metier");
    } catch (Throwable th) {
      // odnotowano błąd
      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;
    }
  }

  // metody pobierające
  public Boolean getErreur() {
    return erreur;
  }

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

  public IMetier getMetier() {
    return metier;
  }
}
  • wiersze 20–21: instancjonowanie warstwy [métier] na podstawie pliku konfiguracyjnego Springa. Jest to ten sam plik, z którego korzystają warstwy [métier] i [1]. Kopiujemy go do projektu internetowego [2]:
  • wiersze 22–31: obsługujemy ewentualny wyjątek i zapisujemy jego stos.

Po wykonaniu tej czynności bean [Application] nie zawiera już błędów. Przyjrzyjmy się teraz beanom [Form], [1] oraz [2]:

Usuwamy wszystkie błędne wiersze (importy i adnotacje) spowodowane brakującymi pakietami. To wystarczy, aby wyeliminować wszystkie błędy [3].

Ponadto w kodzie bean’a [Form] należy dodać metody getter i setter dla pola


  // bean Application
private Application application;

Niektóre z usuniętych adnotacji w beanach [Application] i [Form] deklarowały klasy jako beany o określonym zakresie. Obecnie konfiguracja ta jest wprowadzana w następującym pliku: [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>
    <!-- plik komunikatów -->
    <resource-bundle>
      <base-name>
        messages
      </base-name>
      <var>msg</var>
    </resource-bundle>
    <message-bundle>messages</message-bundle>
  </application>
    <!-- bean 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>
    <!-- bean formularza -->
  <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>

Zasadniczo przeniesienie zostało zakończone. Pozostało nam jednak kilka szczegółów do dopracowania. Możemy spróbować uruchomić aplikację internetową.

Pozostawiamy czytelnikowi przetestowanie tej nowej aplikacji. Możemy ją nieco ulepszyć, aby obsłużyć sytuację, w której inicjalizacja bean’a [Application] zakończyła się niepowodzeniem. Wiemy, że w takim przypadku zainicjowano następujące pola:


  // błędy
  private List<Erreur> erreurs = new ArrayList<Erreur>();
private Boolean erreur = false;

Sytuację tę można przewidzieć w metodzie init fasoli [Form]:


@PostConstruct
  private void init() {

    // czy inicjalizacja przebiegła pomyślnie?
    if (application.getErreur()) {
      // pobieramy listę błędów
      erreurs = application.getErreurs();
      // wyświetlany jest widok błędów
      setForms(false, false, true);
    }

    // lekarze i klienci są zapisywani w pamięci podręcznej
    ...
  }
  • wiersz 5: jeśli bean [Application] zainicjował się nieprawidłowo,
  • wiersz 7: pobieramy listę błędów,
  • wiersz 9: i wyświetla się strona błędu.

W ten sposób, jeśli zatrzymamy SGBD i MySQL, a następnie ponownie uruchomimy aplikację, otrzymamy teraz następującą stronę:

Image

7.2. Conclusion

Przeniesienie aplikacji Primefaces / EJB / Glassfish do środowiska Primefaces / Spring / Tomcat okazało się proste. Problem z wyciekiem pamięci zgłoszony w analizie aplikacji JSF / Spring / Tomcat (punkt 4.3.5) nadal występuje.

Zostanie on rozwiązany w ten sam sposób.

7.3. Testy w środowisku Eclipse

Importujemy projekty Maven do środowiska Eclipse [1]:

Uruchamiamy projekt internetowy [2].

Wybieramy serwer Tomcat [3]. Strona główna aplikacji jest następnie wyświetlana w wewnętrznej przeglądarce Eclipse [4].