Skip to content

10. Beispielanwendung-06: rdvmedecins-pfm-spring

10.1. Portierung

Wir werden nun die vorherige Anwendung in eine Spring/Tomcat-Umgebung portieren:

Wir werden auf zwei bereits vorhandene Anwendungen zurückgreifen. Wir verwenden:

  • die [DAO]- und [JPA]-Schichten aus Version 02 JSF / Spring,
  • die [Web]-/PrimeFaces-Mobile-Schicht aus Version 05 PFM/EJB,
  • die Spring-Konfigurationsdateien aus Version 02

Hier führen wir eine Aufgabe durch, die der Portierung der JSF2 / EJB / Glassfish-Anwendung auf eine JSF2 / Spring Tomcat-Umgebung ähnelt. Daher werden wir weniger Erläuterungen geben. Bei Bedarf kann der Leser auf diese Portierung zurückgreifen.

Wir legen alle für die Portierung erforderlichen Projekte in einem neuen Ordner [rdvmedecins-pfm-spring] [1] ab:

  • [mv-rdvmedecins-spring-dao-jpa]: die [DAO]- und [JPA]-Schichten der JSF/Spring-Version 02,
  • [mv-rdvmedecins-spring-metier]: die [Business]-Schicht der Version 02 von JSF/Spring,
  • [mv-rdvmedecins-pfmobile]: die [Web]-Schicht der PrimeFaces Mobile/EJB-Version 05,
  • in [2] laden wir sie in NetBeans,
  • in [3] sind die Abhängigkeiten des Webprojekts nicht mehr korrekt:
    • die Abhängigkeiten der [DAO]-, [JPA]- und [Business]-Schichten müssen geändert werden, damit sie nun auf die Spring-Projekte verweisen;
    • Der GlassFish-Server stellte die JSF-Bibliotheken bereit. Dies ist beim Tomcat-Server nicht mehr der Fall. Sie müssen daher zu den Abhängigkeiten hinzugefügt werden.

Das [Web]-Projekt entwickelt sich wie folgt:

Die [pom.xml]-Datei für die [Web]-Schicht enthält nun die folgenden Abhängigkeiten:


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

Es treten Fehler auf. Diese werden durch die EJB-Referenzen in der [web]-Schicht verursacht. Sehen wir uns zunächst die [Application]-Bean an:

Wir entfernen alle Zeilen, die aufgrund fehlender Pakete Fehler verursachen, benennen die Schnittstelle [IMetierLocal] in [IMetier] um (so lautet ihr Name in der Spring-[Business]-Schicht) und instanziieren sie mit 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 {
 
  // business layer
  private IMetier metier;
  // errors
  private List<Erreur> erreurs = new ArrayList<Erreur>();
  private Boolean erreur = false;
 
  public Application() {
    try {
      // instantiation layer [business]
      ApplicationContext ctx = new ClassPathXmlApplicationContext("spring-config-metier-dao.xml");
      metier = (IMetier) ctx.getBean("metier");
    } catch (Throwable th) {
      // we note the error
      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;
    }
  }
 
  // getters
  public Boolean getErreur() {
    return erreur;
  }
 
  public List<Erreur> getErreurs() {
    return erreurs;
  }
 
  public IMetier getMetier() {
    return metier;
  }
}
  • Zeilen 20–21: Instanziierung der [business]-Schicht aus der Spring-Konfigurationsdatei. Dies ist die Datei, die von der [business]-Schicht verwendet wird [1]. Wir kopieren sie in das Webprojekt [2]:
  • Zeilen 22–31: Wir behandeln alle Ausnahmen und speichern deren Stacktrace im Feld in Zeile 14.

Damit weist die [Application]-Bean keine Fehler mehr auf. Sehen wir uns nun die [Form]-Bean an [1], [2]:

3
4

Wir entfernen alle fehlerhaften Zeilen (Importe und Annotationen), die auf fehlende Pakete zurückzuführen sind, und benennen die Schnittstelle [ImetierLocal] in [IMetier] um. Dies reicht aus, um alle Fehler zu beheben [3].

Zusätzlich müssen wir den Getter und den Setter für das Feld hinzufügen


  // bean Application
private Application application;

Einige der Annotationen, die aus den [Application]- und [Form]-Beans entfernt wurden, deklarierten die Klassen als Beans mit einem bestimmten Gültigkeitsbereich. Diese Konfiguration erfolgt nun in der folgenden [faces-config.xml]-Datei [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>
    <!-- message file -->
    <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>
    <!-- the applicationBean bean -->
  <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>
    <!-- the bean form -->
  <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>

Die Portierung ist abgeschlossen. Wir können nun versuchen, die Webanwendung auszuführen.

Wir überlassen es dem Leser, diese neue Anwendung zu testen. Wir können sie leicht verbessern, um den Fall zu behandeln, in dem die Initialisierung der [Application]-Bean fehlgeschlagen ist. Wir wissen, dass in diesem Fall die folgenden Felder initialisiert wurden:


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

Dieser Fall kann in der init-Methode des [Form]-Beans behandelt werden:


@PostConstruct
  private void init() {
 
    // was the initialization successful?
    if (application.getErreur()) {
      // retrieve the list of errors
      erreurs = application.getErreurs();
      // the error view is displayed
      setForms(false, false, true);
    }
 
    // caching doctors and customers
    ...
  }
  • Zeile 5: Wenn die Initialisierung der [Application]-Bean fehlgeschlagen ist,
  • Zeile 7: die Fehlerliste abrufen,
  • Zeile 9: und die Fehlerseite anzeigen.

Wenn wir also das MySQL-DBMS anhalten und die Anwendung neu starten, sehen wir nun die folgende Seite:

Image

10.2. Fazit

Die Portierung der PrimeFaces Mobile/EJB/GlassFish-Anwendung auf eine PrimeFaces Mobile/Spring/Tomcat-Umgebung erwies sich als unkompliziert. Das in der Untersuchung der JSF/Spring/Tomcat-Anwendung (Abschnitt 4.3.5) gemeldete Problem mit dem Speicherleck besteht weiterhin. Es wird auf die gleiche Weise behoben werden.

10.3. Tests mit Eclipse

Wir importieren die Maven-Projekte in Eclipse [1]:

Wir führen das Webprojekt aus [2].

Wir wählen den Tomcat-Server aus [3]. Die Startseite der Anwendung wird daraufhin im internen Browser von Eclipse angezeigt [4].

10.4. Testen auf einem mobilen Gerät

Um die Anwendung auf einem mobilen Gerät zu testen, befolgen Sie die in Abschnitt 8.5.6 beschriebenen Schritte. Hier sind einige Screenshots der Anwendung: