SlideShare ist ein Scribd-Unternehmen logo
1 von 21
Michael Kurz | IRIAN


JSF und JPA effizient kombinieren
Agenda

•   Motivation
•   Architektur mit/ohne EE 6-Container
•   Integration von JPA und JSF
•   Demonstration anhand eines Beispiels:
    – MyMail 01: Architektur, JPA, JSF
    – MyMail 02: Paging
    – MyMail 03: Selektion
Motivation

• Große Datenmengen effizient darstellen
• Übersichtlichkeit durch Paging
• Performance durch gezieltes Laden aus DB
• Selektion einzelner Zeilen
• JPA und JSF ermöglichen mit Bordmitteln
  eine einfache und performante Lösung
• Leichtgewichtige Java EE 6-Architektur
Architektur und Technologie-Stack

  Architektur   Mit EE 6-Container   Ohne EE 6-Container


 Präsentation   JSF, CDI, CODI        JSF, CDI, CODI



   Service         EJB, CDI             CDI, CODI



 Datenzugriff      EJB, JPA           CDI, CODI, JPA
MyFaces Extensions CDI

• Portable Erweiterung für CDI
• Vereinfacht Arbeit mit CDI und JSF
• Mehrere Module:
   – JSF 1.2 und 2.0
   – JPA, Bean-Validation, Message, Scripting...
• Funktioniert mit:
   – CDI: OpenWebBeans, Weld
   – JSF: MyFaces, Mojarra (1.2 und 2.0)
• Stabile Version 1.0.1 verfügbar
Verwaltung des Persistenzkontexts

• Mit Java EE-Container
  – EntityManager vom Container verwaltet
    @javax.ejb.Stateless
    public class CustomerRepository {
      @PersistenceContext private EntityManager em;
    }

• Ohne Java EE-Container (mit CDI)
  – EntityManager von MyFaces CODI verwaltet
    @ApplicationScoped
    public class CustomerRepository {
      @Inject private EntityManager em;
    }
Verwaltung von Transaktionen

• Mit Java EE-Container
  – Transaktionen vom Container verwaltet
  – Steuerung über @TransactionAttribute
• Ohne Java EE-Container (mit CDI)
  – Transaktionen von MyFaces CODI verwaltet
    @ApplicationScoped
    public class CustomerService {
      @Inject
      private CustomerRepository customerRepository;

        @Transactional
        public void saveUser(User user) {...}
    }
Demonstration




Beispiel MyMail 01
• Architektur
• Integration JPA und JSF

Beispiel unter: https://github.com/jsflive/mymail-owb
Abfragen mit JPQL

• JPA 1: Stringbasierte Abfragen mit JPQL
  String queryStr = "select m from Mail m where
    m.subject like :subj order by m.date desc";

• Ausführen der Abfrage mit EntityManager
  Query query = em.createQuery(queryStr);
  query.setParameter("subj", "%108_");
  return query.getResultList();

• Nachteile:
  – Überprüfung erst zur Laufzeit
  – Dynamische Abfragen komplex
Abfragen mit Criteria API 1/2

• JPA 2: Abfragen mit dem Criteria API
• CriteriaBuilder ist Einstiegspunkt
  CriteriaBuilder b = em.getCriteriaBuilder();

• CriteriaQuery ist Container für Abfrage
  CriteriaQuery<Mail> c = b.createQuery(Mail.class);

• CriteriaQuery bietet Methoden für Klauseln
  Root<Mail> root = c.from(Mail.class);
  c.select(root);
  c.where(b.like(root.<String>get("subject"),
      b.parameter(String.class, "subj")));
  c.orderBy(b.desc(root.get("date")));
Abfragen mit Criteria API 2/2

• Ausführen der Abfrage mit EntityManager
  TypedQuery<Mail> query = em.createQuery(crit);
  query.setParameter("subj", "%108_");
  return query.getResultList();

• Vorteile:
   –   Typsicher
   –   Statisch überprüfbar zur Kompilierzeit
   –   Abfragen mit Java-Sprachmittel bauen
   –   Flexibler für dynamische Abfragen
   –   Mehr Funktionalität im Vergleich zu JPQL
Typsicherheit mit dem JPA-Metamodell

• JPA 2: Statisches, kanonisches Metamodell
  – Eine Metamodell-Klasse pro verwalteter Klasse
  – Wird im Normallfall generiert
  @StaticMetamodel(Mail.class)
  public class Mail_ {
    public static volatile
      SingularAttribute<Mail, String> subject;
    public static volatile
      ListAttribute<Mail, Attachment> attachments;
  }

  c.where(b.like(root.get(Mail_.subject),
      b.parameter(String.class, "subj")));
  c.orderBy(b.desc(root.get(Mail_.date)));
Demonstration




Beispiel MyMail 01
• JPA 2 Criteria API



Beispiel unter: https://github.com/jsflive/mymail-owb
Wie funktioniert h:dataTable?

• Anzuzeigende Daten im Attribut value
    – Arrays, Listen, ResultSet, DataModel
•   Zeilenweise Abarbeitung der Daten
•   Ein Datenelement wird zu einer Zeile
•   Variablenname aktueller Zeile in Attribut var
•   h:column für jede Zeile ausgeführt
    <h:dataTable var="mail" value="#{mailBean.mails}">
      <h:column>
        <h:outputText value="#{mail.subject}"/>
      </h:column>
    </h:dataTable>
Paging mit JSF

• h:dataTable unterstützt bereits Paging
  – Attribut first: erste Zeile der Page
  – Attribut rows: Größe der Page
   item00
   item01               Property 1     Property 2
   item02
            first="2"
   item03
                        item02.prop1   item02.prop2
            rows="2"
   item04               item03.prop1   item03.prop2
   item05
   item06


• Paginator-Komponente um first zu setzen
  – Keine Komponente im Standard
• Problem: Nur Daten für Page aus DB laden
Klasse DataModel in JSF

• javax.faces.model.DataModel<E>
  –   public void setRowIndex(int rowIndex)
  –   public E getRowData()
  –   public int getRowCount()
  –   public int getRowIndex()
  –   public boolean isRowAvailable()
  –   public Object getWrappedData()
  –   public void setWrappedData(Object data)
• Eigene Variante PageableDataModel<E>
  – Lädt und cacht Daten für aktuelle Page
Demonstration




Beispiel MyMail 02
• Paging



Beispiel unter: https://github.com/jsflive/mymail-owb
DataModel mit Selektion

• SelectableDataModel mit Set für Selektion
  public class SelectableDataModel<T>
      extends PageableDataModel<T> {
      private Set<T> selectedObjects;
      public Set<T> getSelectedObjects() {...}
      public Map<T, Boolean> getRowSelected() {...}
  }

• Selektion in Seite via Map
  <h:dataTable var="mail" value="#{mailBean.mails}">
    <h:column>
      <h:selectBooleanCheckbox
          value="#{mailBean.mails.rowSelected[mail]}"/>
    </h:column>
  </h:dataTable>
Demonstration




Beispiel MyMail 03
• Selektion



Beispiel unter: https://github.com/jsflive/mymail-owb
Fazit

• Leichtgewichtige Entwicklung mit Java EE 6
• Mit/Ohne EE 6-Container möglich
• Kombination von JPA und JSF bereits
  mit Bordmitteln sehr mächtig
• Standardisierte Lösung
• JPA 2 Criteria API flexibel, aber komplex
Neugierig?




• Marinschek, Kurz, Müllan:
  JavaServer Faces 2.0, dpunkt.Verlag
• Irian JSF@Work Online-Tutorial
  http://jsfatwork.irian.at
• JSFlive Weblog
  http://jsflive.wordpress.com

Weitere ähnliche Inhalte

Was ist angesagt?

DB-Schema-Evolution mit LiquiBase
DB-Schema-Evolution mit LiquiBaseDB-Schema-Evolution mit LiquiBase
DB-Schema-Evolution mit LiquiBasegedoplan
 
Schlanke Webarchitekturen nicht nur mit JSF 2 und CDI
Schlanke Webarchitekturen nicht nur mit JSF 2 und CDISchlanke Webarchitekturen nicht nur mit JSF 2 und CDI
Schlanke Webarchitekturen nicht nur mit JSF 2 und CDIadesso AG
 
JSF meets JS (2. ed.) - JSF-Komponenten mit JavaScript
JSF meets JS (2. ed.) - JSF-Komponenten mit JavaScriptJSF meets JS (2. ed.) - JSF-Komponenten mit JavaScript
JSF meets JS (2. ed.) - JSF-Komponenten mit JavaScriptOPEN KNOWLEDGE GmbH
 
WPF Dos n Don'ts - der WPF Rundumschlag
WPF Dos n Don'ts - der WPF RundumschlagWPF Dos n Don'ts - der WPF Rundumschlag
WPF Dos n Don'ts - der WPF RundumschlagHendrik Lösch
 
Datenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiDatenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiChristian Baranowski
 
Grails im Überblick und in der Praxis
Grails im Überblick und in der PraxisGrails im Überblick und in der Praxis
Grails im Überblick und in der PraxisTobias Kraft
 
Vor- und Nachteile von Web Components mit Polymer gegenüber AngularJS ohne P...
Vor- und Nachteile von Web Components mit Polymer gegenüber AngularJS ohne P...Vor- und Nachteile von Web Components mit Polymer gegenüber AngularJS ohne P...
Vor- und Nachteile von Web Components mit Polymer gegenüber AngularJS ohne P...Oliver Hader
 
Java Persistence in Action – Einsatz von JPA 2.x in Java-EE-Anwendungen
Java Persistence in Action – Einsatz von JPA 2.x in Java-EE-AnwendungenJava Persistence in Action – Einsatz von JPA 2.x in Java-EE-Anwendungen
Java Persistence in Action – Einsatz von JPA 2.x in Java-EE-Anwendungengedoplan
 
Wieviel client braucht das web
Wieviel client braucht das webWieviel client braucht das web
Wieviel client braucht das webgedoplan
 
Wieviel Client braucht das Web?
Wieviel Client braucht das Web?Wieviel Client braucht das Web?
Wieviel Client braucht das Web?gedoplan
 
Speeding up Java Persistence
Speeding up Java PersistenceSpeeding up Java Persistence
Speeding up Java Persistencegedoplan
 
Wie viel Client braucht das Web?JSF, Vaadin und AngularJS im Vergleich
Wie viel Client braucht das Web?JSF, Vaadin und AngularJS im VergleichWie viel Client braucht das Web?JSF, Vaadin und AngularJS im Vergleich
Wie viel Client braucht das Web?JSF, Vaadin und AngularJS im Vergleichgedoplan
 
WebGL - 3D im Browser - Erfahrungsbericht mit BabylonJS
WebGL - 3D im Browser - Erfahrungsbericht mit BabylonJSWebGL - 3D im Browser - Erfahrungsbericht mit BabylonJS
WebGL - 3D im Browser - Erfahrungsbericht mit BabylonJSOliver Hader
 

Was ist angesagt? (20)

DB-Schema-Evolution mit LiquiBase
DB-Schema-Evolution mit LiquiBaseDB-Schema-Evolution mit LiquiBase
DB-Schema-Evolution mit LiquiBase
 
GWT: Eintauchen in MVP und Internationalisierung
GWT: Eintauchen in MVP und InternationalisierungGWT: Eintauchen in MVP und Internationalisierung
GWT: Eintauchen in MVP und Internationalisierung
 
MVP mit dem Google Web Toolkit
MVP mit dem Google Web ToolkitMVP mit dem Google Web Toolkit
MVP mit dem Google Web Toolkit
 
Entity framework
Entity frameworkEntity framework
Entity framework
 
Eintauchen in MVP mit GWT
Eintauchen in MVP mit GWT Eintauchen in MVP mit GWT
Eintauchen in MVP mit GWT
 
Schlanke Webarchitekturen nicht nur mit JSF 2 und CDI
Schlanke Webarchitekturen nicht nur mit JSF 2 und CDISchlanke Webarchitekturen nicht nur mit JSF 2 und CDI
Schlanke Webarchitekturen nicht nur mit JSF 2 und CDI
 
Backbase Intro
Backbase IntroBackbase Intro
Backbase Intro
 
JSF meets JS (2. ed.) - JSF-Komponenten mit JavaScript
JSF meets JS (2. ed.) - JSF-Komponenten mit JavaScriptJSF meets JS (2. ed.) - JSF-Komponenten mit JavaScript
JSF meets JS (2. ed.) - JSF-Komponenten mit JavaScript
 
WPF Dos n Don'ts - der WPF Rundumschlag
WPF Dos n Don'ts - der WPF RundumschlagWPF Dos n Don'ts - der WPF Rundumschlag
WPF Dos n Don'ts - der WPF Rundumschlag
 
Datenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiDatenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence Api
 
Datenbankoptimierung
DatenbankoptimierungDatenbankoptimierung
Datenbankoptimierung
 
Grails im Überblick und in der Praxis
Grails im Überblick und in der PraxisGrails im Überblick und in der Praxis
Grails im Überblick und in der Praxis
 
Web Components
Web ComponentsWeb Components
Web Components
 
Vor- und Nachteile von Web Components mit Polymer gegenüber AngularJS ohne P...
Vor- und Nachteile von Web Components mit Polymer gegenüber AngularJS ohne P...Vor- und Nachteile von Web Components mit Polymer gegenüber AngularJS ohne P...
Vor- und Nachteile von Web Components mit Polymer gegenüber AngularJS ohne P...
 
Java Persistence in Action – Einsatz von JPA 2.x in Java-EE-Anwendungen
Java Persistence in Action – Einsatz von JPA 2.x in Java-EE-AnwendungenJava Persistence in Action – Einsatz von JPA 2.x in Java-EE-Anwendungen
Java Persistence in Action – Einsatz von JPA 2.x in Java-EE-Anwendungen
 
Wieviel client braucht das web
Wieviel client braucht das webWieviel client braucht das web
Wieviel client braucht das web
 
Wieviel Client braucht das Web?
Wieviel Client braucht das Web?Wieviel Client braucht das Web?
Wieviel Client braucht das Web?
 
Speeding up Java Persistence
Speeding up Java PersistenceSpeeding up Java Persistence
Speeding up Java Persistence
 
Wie viel Client braucht das Web?JSF, Vaadin und AngularJS im Vergleich
Wie viel Client braucht das Web?JSF, Vaadin und AngularJS im VergleichWie viel Client braucht das Web?JSF, Vaadin und AngularJS im Vergleich
Wie viel Client braucht das Web?JSF, Vaadin und AngularJS im Vergleich
 
WebGL - 3D im Browser - Erfahrungsbericht mit BabylonJS
WebGL - 3D im Browser - Erfahrungsbericht mit BabylonJSWebGL - 3D im Browser - Erfahrungsbericht mit BabylonJS
WebGL - 3D im Browser - Erfahrungsbericht mit BabylonJS
 

Ähnlich wie JSF und JPA effizient kombinieren (W-JAX 2011)

Fanstatic pycon.de 2012
Fanstatic pycon.de 2012Fanstatic pycon.de 2012
Fanstatic pycon.de 2012Daniel Havlik
 
Optimierung von JPA-Anwendungen
Optimierung von JPA-AnwendungenOptimierung von JPA-Anwendungen
Optimierung von JPA-Anwendungengedoplan
 
MongoDB für Java-Programmierer
MongoDB für Java-ProgrammiererMongoDB für Java-Programmierer
MongoDB für Java-ProgrammiererUwe Printz
 
MongoDB für Java Programmierer (JUGKA, 11.12.13)
MongoDB für Java Programmierer (JUGKA, 11.12.13)MongoDB für Java Programmierer (JUGKA, 11.12.13)
MongoDB für Java Programmierer (JUGKA, 11.12.13)Uwe Printz
 
Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...
Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...
Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...OPEN KNOWLEDGE GmbH
 
Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...
Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...
Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...André Krämer
 
Effiziente datenpersistierung mit JPA 2.1 und Hibernate
Effiziente datenpersistierung mit JPA 2.1 und HibernateEffiziente datenpersistierung mit JPA 2.1 und Hibernate
Effiziente datenpersistierung mit JPA 2.1 und HibernateThorben Janssen
 
Speeding up Java Persistence
Speeding up Java PersistenceSpeeding up Java Persistence
Speeding up Java Persistencegedoplan
 
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...GFU Cyrus AG
 
Lightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPALightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPAmh0708
 
Flexibilitaet mit CDI und Apache DeltaSpike
Flexibilitaet mit CDI und Apache DeltaSpikeFlexibilitaet mit CDI und Apache DeltaSpike
Flexibilitaet mit CDI und Apache DeltaSpikeos890
 
Javascript auf Client und Server mit node.js - webtech 2010
Javascript auf Client und Server mit node.js - webtech 2010Javascript auf Client und Server mit node.js - webtech 2010
Javascript auf Client und Server mit node.js - webtech 2010Dirk Ginader
 
2008 - Basta!: DAL DIY
2008 - Basta!: DAL DIY2008 - Basta!: DAL DIY
2008 - Basta!: DAL DIYDaniel Fisher
 
Never Code Alone: Von Symfony Forms zu einer SPA auf APIs
Never Code Alone: Von Symfony Forms zu einer SPA auf APIsNever Code Alone: Von Symfony Forms zu einer SPA auf APIs
Never Code Alone: Von Symfony Forms zu einer SPA auf APIsStefan Adolf
 
Praesentation TYPO3Camp Berlin Speed mit Extbase
Praesentation TYPO3Camp Berlin Speed mit ExtbasePraesentation TYPO3Camp Berlin Speed mit Extbase
Praesentation TYPO3Camp Berlin Speed mit ExtbaseStefan Frömken
 
Oracle ETL Herausforderungen - OPITZ CONSULTING - Till Sander - Wolfgang Rütter
Oracle ETL Herausforderungen - OPITZ CONSULTING - Till Sander - Wolfgang RütterOracle ETL Herausforderungen - OPITZ CONSULTING - Till Sander - Wolfgang Rütter
Oracle ETL Herausforderungen - OPITZ CONSULTING - Till Sander - Wolfgang RütterOPITZ CONSULTING Deutschland
 
Atlassian Confluence als Software-Infrastruktur
Atlassian Confluence als Software-InfrastrukturAtlassian Confluence als Software-Infrastruktur
Atlassian Confluence als Software-InfrastrukturGeorg Schmidl
 
Legacy WebApps mit AngularJS pimpen
Legacy WebApps mit AngularJS pimpenLegacy WebApps mit AngularJS pimpen
Legacy WebApps mit AngularJS pimpenPhilipp Burgmer
 

Ähnlich wie JSF und JPA effizient kombinieren (W-JAX 2011) (20)

Fanstatic pycon.de 2012
Fanstatic pycon.de 2012Fanstatic pycon.de 2012
Fanstatic pycon.de 2012
 
Optimierung von JPA-Anwendungen
Optimierung von JPA-AnwendungenOptimierung von JPA-Anwendungen
Optimierung von JPA-Anwendungen
 
MongoDB für Java-Programmierer
MongoDB für Java-ProgrammiererMongoDB für Java-Programmierer
MongoDB für Java-Programmierer
 
MongoDB für Java Programmierer (JUGKA, 11.12.13)
MongoDB für Java Programmierer (JUGKA, 11.12.13)MongoDB für Java Programmierer (JUGKA, 11.12.13)
MongoDB für Java Programmierer (JUGKA, 11.12.13)
 
Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...
Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...
Rufen Sie nicht an – wir rufen Sie an! | Server-sent Events und Web-Sockets i...
 
Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...
Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...
Das Repository-Pattern und der O/R-Mapper: Geniale Kombination oder vergebene...
 
Effiziente datenpersistierung mit JPA 2.1 und Hibernate
Effiziente datenpersistierung mit JPA 2.1 und HibernateEffiziente datenpersistierung mit JPA 2.1 und Hibernate
Effiziente datenpersistierung mit JPA 2.1 und Hibernate
 
Speeding up Java Persistence
Speeding up Java PersistenceSpeeding up Java Persistence
Speeding up Java Persistence
 
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
Java Code Quality: Gute Software braucht guten Code - Regeln für verständlich...
 
Lightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPALightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPA
 
Flexibilitaet mit CDI und Apache DeltaSpike
Flexibilitaet mit CDI und Apache DeltaSpikeFlexibilitaet mit CDI und Apache DeltaSpike
Flexibilitaet mit CDI und Apache DeltaSpike
 
Javascript auf Client und Server mit node.js - webtech 2010
Javascript auf Client und Server mit node.js - webtech 2010Javascript auf Client und Server mit node.js - webtech 2010
Javascript auf Client und Server mit node.js - webtech 2010
 
2008 - Basta!: DAL DIY
2008 - Basta!: DAL DIY2008 - Basta!: DAL DIY
2008 - Basta!: DAL DIY
 
Never Code Alone: Von Symfony Forms zu einer SPA auf APIs
Never Code Alone: Von Symfony Forms zu einer SPA auf APIsNever Code Alone: Von Symfony Forms zu einer SPA auf APIs
Never Code Alone: Von Symfony Forms zu einer SPA auf APIs
 
Praesentation TYPO3Camp Berlin Speed mit Extbase
Praesentation TYPO3Camp Berlin Speed mit ExtbasePraesentation TYPO3Camp Berlin Speed mit Extbase
Praesentation TYPO3Camp Berlin Speed mit Extbase
 
T3ak12 extbase
T3ak12 extbaseT3ak12 extbase
T3ak12 extbase
 
imatics FormEngine
imatics FormEngineimatics FormEngine
imatics FormEngine
 
Oracle ETL Herausforderungen - OPITZ CONSULTING - Till Sander - Wolfgang Rütter
Oracle ETL Herausforderungen - OPITZ CONSULTING - Till Sander - Wolfgang RütterOracle ETL Herausforderungen - OPITZ CONSULTING - Till Sander - Wolfgang Rütter
Oracle ETL Herausforderungen - OPITZ CONSULTING - Till Sander - Wolfgang Rütter
 
Atlassian Confluence als Software-Infrastruktur
Atlassian Confluence als Software-InfrastrukturAtlassian Confluence als Software-Infrastruktur
Atlassian Confluence als Software-Infrastruktur
 
Legacy WebApps mit AngularJS pimpen
Legacy WebApps mit AngularJS pimpenLegacy WebApps mit AngularJS pimpen
Legacy WebApps mit AngularJS pimpen
 

JSF und JPA effizient kombinieren (W-JAX 2011)

  • 1. Michael Kurz | IRIAN JSF und JPA effizient kombinieren
  • 2. Agenda • Motivation • Architektur mit/ohne EE 6-Container • Integration von JPA und JSF • Demonstration anhand eines Beispiels: – MyMail 01: Architektur, JPA, JSF – MyMail 02: Paging – MyMail 03: Selektion
  • 3. Motivation • Große Datenmengen effizient darstellen • Übersichtlichkeit durch Paging • Performance durch gezieltes Laden aus DB • Selektion einzelner Zeilen • JPA und JSF ermöglichen mit Bordmitteln eine einfache und performante Lösung • Leichtgewichtige Java EE 6-Architektur
  • 4. Architektur und Technologie-Stack Architektur Mit EE 6-Container Ohne EE 6-Container Präsentation JSF, CDI, CODI JSF, CDI, CODI Service EJB, CDI CDI, CODI Datenzugriff EJB, JPA CDI, CODI, JPA
  • 5. MyFaces Extensions CDI • Portable Erweiterung für CDI • Vereinfacht Arbeit mit CDI und JSF • Mehrere Module: – JSF 1.2 und 2.0 – JPA, Bean-Validation, Message, Scripting... • Funktioniert mit: – CDI: OpenWebBeans, Weld – JSF: MyFaces, Mojarra (1.2 und 2.0) • Stabile Version 1.0.1 verfügbar
  • 6. Verwaltung des Persistenzkontexts • Mit Java EE-Container – EntityManager vom Container verwaltet @javax.ejb.Stateless public class CustomerRepository { @PersistenceContext private EntityManager em; } • Ohne Java EE-Container (mit CDI) – EntityManager von MyFaces CODI verwaltet @ApplicationScoped public class CustomerRepository { @Inject private EntityManager em; }
  • 7. Verwaltung von Transaktionen • Mit Java EE-Container – Transaktionen vom Container verwaltet – Steuerung über @TransactionAttribute • Ohne Java EE-Container (mit CDI) – Transaktionen von MyFaces CODI verwaltet @ApplicationScoped public class CustomerService { @Inject private CustomerRepository customerRepository; @Transactional public void saveUser(User user) {...} }
  • 8. Demonstration Beispiel MyMail 01 • Architektur • Integration JPA und JSF Beispiel unter: https://github.com/jsflive/mymail-owb
  • 9. Abfragen mit JPQL • JPA 1: Stringbasierte Abfragen mit JPQL String queryStr = "select m from Mail m where m.subject like :subj order by m.date desc"; • Ausführen der Abfrage mit EntityManager Query query = em.createQuery(queryStr); query.setParameter("subj", "%108_"); return query.getResultList(); • Nachteile: – Überprüfung erst zur Laufzeit – Dynamische Abfragen komplex
  • 10. Abfragen mit Criteria API 1/2 • JPA 2: Abfragen mit dem Criteria API • CriteriaBuilder ist Einstiegspunkt CriteriaBuilder b = em.getCriteriaBuilder(); • CriteriaQuery ist Container für Abfrage CriteriaQuery<Mail> c = b.createQuery(Mail.class); • CriteriaQuery bietet Methoden für Klauseln Root<Mail> root = c.from(Mail.class); c.select(root); c.where(b.like(root.<String>get("subject"), b.parameter(String.class, "subj"))); c.orderBy(b.desc(root.get("date")));
  • 11. Abfragen mit Criteria API 2/2 • Ausführen der Abfrage mit EntityManager TypedQuery<Mail> query = em.createQuery(crit); query.setParameter("subj", "%108_"); return query.getResultList(); • Vorteile: – Typsicher – Statisch überprüfbar zur Kompilierzeit – Abfragen mit Java-Sprachmittel bauen – Flexibler für dynamische Abfragen – Mehr Funktionalität im Vergleich zu JPQL
  • 12. Typsicherheit mit dem JPA-Metamodell • JPA 2: Statisches, kanonisches Metamodell – Eine Metamodell-Klasse pro verwalteter Klasse – Wird im Normallfall generiert @StaticMetamodel(Mail.class) public class Mail_ { public static volatile SingularAttribute<Mail, String> subject; public static volatile ListAttribute<Mail, Attachment> attachments; } c.where(b.like(root.get(Mail_.subject), b.parameter(String.class, "subj"))); c.orderBy(b.desc(root.get(Mail_.date)));
  • 13. Demonstration Beispiel MyMail 01 • JPA 2 Criteria API Beispiel unter: https://github.com/jsflive/mymail-owb
  • 14. Wie funktioniert h:dataTable? • Anzuzeigende Daten im Attribut value – Arrays, Listen, ResultSet, DataModel • Zeilenweise Abarbeitung der Daten • Ein Datenelement wird zu einer Zeile • Variablenname aktueller Zeile in Attribut var • h:column für jede Zeile ausgeführt <h:dataTable var="mail" value="#{mailBean.mails}"> <h:column> <h:outputText value="#{mail.subject}"/> </h:column> </h:dataTable>
  • 15. Paging mit JSF • h:dataTable unterstützt bereits Paging – Attribut first: erste Zeile der Page – Attribut rows: Größe der Page item00 item01 Property 1 Property 2 item02 first="2" item03 item02.prop1 item02.prop2 rows="2" item04 item03.prop1 item03.prop2 item05 item06 • Paginator-Komponente um first zu setzen – Keine Komponente im Standard • Problem: Nur Daten für Page aus DB laden
  • 16. Klasse DataModel in JSF • javax.faces.model.DataModel<E> – public void setRowIndex(int rowIndex) – public E getRowData() – public int getRowCount() – public int getRowIndex() – public boolean isRowAvailable() – public Object getWrappedData() – public void setWrappedData(Object data) • Eigene Variante PageableDataModel<E> – Lädt und cacht Daten für aktuelle Page
  • 17. Demonstration Beispiel MyMail 02 • Paging Beispiel unter: https://github.com/jsflive/mymail-owb
  • 18. DataModel mit Selektion • SelectableDataModel mit Set für Selektion public class SelectableDataModel<T> extends PageableDataModel<T> { private Set<T> selectedObjects; public Set<T> getSelectedObjects() {...} public Map<T, Boolean> getRowSelected() {...} } • Selektion in Seite via Map <h:dataTable var="mail" value="#{mailBean.mails}"> <h:column> <h:selectBooleanCheckbox value="#{mailBean.mails.rowSelected[mail]}"/> </h:column> </h:dataTable>
  • 19. Demonstration Beispiel MyMail 03 • Selektion Beispiel unter: https://github.com/jsflive/mymail-owb
  • 20. Fazit • Leichtgewichtige Entwicklung mit Java EE 6 • Mit/Ohne EE 6-Container möglich • Kombination von JPA und JSF bereits mit Bordmitteln sehr mächtig • Standardisierte Lösung • JPA 2 Criteria API flexibel, aber komplex
  • 21. Neugierig? • Marinschek, Kurz, Müllan: JavaServer Faces 2.0, dpunkt.Verlag • Irian JSF@Work Online-Tutorial http://jsfatwork.irian.at • JSFlive Weblog http://jsflive.wordpress.com