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


Go Fullstack
Webanwendungen mit Java EE 6 bauen
Agenda
•   Motivation
•   Architektur und Technologie-Stack
•   Details Architektur
•   MyFaces CODI: CDI trifft JSF
•   Demonstration anhand eines Beispiels
•   MyGourmet EE (http://jsfatwork.irian.at)
•      Keine Einführung in EJB, CDI, JSF...
Motivation
•   Java EE 6 liegt im Trend
•   Leichtigkeit des (Entwickler-)Seins
•   Entwickler: Fokus auf Geschäftslogik
•   Container: Services, Integration
•   (Krasses) Beispiel aus der Praxis:
    – Alt: EJB 2.1 + Struts + MDA: 70000 loc
    – Neu: EJB 3.1 + CDI + JSF 2: 5500 loc
                     Der Vortragende warnt:
       Dieser Vortrag kann zum Überdenken alter Muster
         und spontanen Neuimplementierungen führen!
Die Leichtigkeit von Java EE 6
• Führt Ease-of-Development-Strategie von
  Java EE 5 konsequent weiter
• EJB 3.1 auf Minimum reduziert:
  @javax.ejb.Stateless
  public class CustomerService {
    @javax.inject.Inject
    private CrudService crudService;
    ...
  }


• CDI erhöht Flexibilität enorm
Architektur und Technologie-Stack

 JSF, CDI, CODI    Präsentation



   EJB, CDI          Service



   EJB, JPA        Datenzugriff
Architektur kleine/mittlere Projekte

                                           @Entity
 JSF, CDI, CODI             Präsentation   Firma
                                           @Entity
                                           Person
                  @Entity
   EJB, CDI                   Service      @Entity
                  Firma
                                           Kontakt
                  @Entity
                  Person

   EJB, JPA       @Entity   Datenzugriff
                  Kontakt
Architektur große Projekte

 JSF, CDI, CODI             Präsentation   FirmaDto

                                           PersonDto
                  @Entity
   EJB, CDI       Firma       Service      KontaktDto
                  @Entity
                  Person

   EJB, JPA       @Entity   Datenzugriff
                  Kontakt
Datenzugriffsschicht 1/2
• Kein DAO-Layer im klassischen Sinn
• Auf einen CRUD-Service reduziert
• Generischer Zugriff auf EntityManager
  – persist, merge, delete, find
• Ausführen von Queries
  – Named Queries
  – JPA 2 Criteria Queries
• Kann in komplexeren Applikationen Basis für
  weitere Services sein
Datenzugriffsschicht 2/2
• Service setzt Transaktion voraus
  @javax.ejb.Stateless
  @javax.ejb.TransactionAttribute(
      TransactionAttributeType.MANDATORY)
  public class CrudService {
    @PersistenceContext
    private EntityManager em;
  }


• In Serviceschicht eingeimpft (CDI)
  @javax.inject.Inject
  private CrudService crudService;
Serviceschicht 1/2
• Kapselt Geschäftslogik
• Service-Facade definiert Schnittstelle für
  Client
• Charakteristik Service-Facade:
  – Stateless-Session-Beans
  – Methoden starten Transaktion
  – Benutzen andere Services (CDI)
• Keine klassische Facade!
• Optional @Remote auf Service-Facade
Serviceschicht 2/2
• Beispiel einer Service-Facade:
  @javax.ejb.Stateless
  @javax.ejb.TransactionAttribute(
      TransactionAttributeType.REQUIRES_NEW)
  public class CustomerService {
    @javax.inject.Inject
    private CrudService crudService;
  }


• Transaktionen durch Container (default)
  @javax.ejb.TransactionManagement(
    TransactionManagementType.CONTAINER)
Demonstration




Datenzugriffs- und Service-Layer
• Datenzugriffsschicht mit CRUD-Service
• Serviceschicht mit Service-Facades

Beispiel unter: https://github.com/jsflive/mygourmet-ee
Präsentationsschicht
• Webapplikation mit JSF 2.0
• JSF 2.0 vereinfacht Entwicklung enorm
• CDI verwaltet Managed-Beans
  @javax.inject.Named
  @javax.enterprise.context.RequestScoped
  public class CustomerPage {
    @javax.inject.Inject
    private CustomerService service;


• Gut: JSF 2 + CDI
• Besser: JSF 2 + CDI + MyFaces CODI
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
CODI: JSF Modul
• Erweitertes Konversationskonzept
  – @ConversationScoped (!= CDI)
  – @WindowScoped
  – @ViewAccessScoped
• Ermöglicht CDI mit JSF-Annotationen
• @Inject für folgende JSF-Artefakte:
  – Konverter, Validatoren, Phase-Listener
• Typsichere View-Config, Page-Beans
CODI: Konversationen
•   Mehrere Konversationen pro Ansicht
•   Konversation an Tab/Fenster gebunden
•   Konversation beginnt mit Bean-Zugriff
•   Manuell oder durch Timeout beendet
    @Named @ConversationScoped
    public class WizardBean {
      @Inject
      private Conversation conversation;
     public void finish() {
       this.conversation.close();
     }
CODI: Konversationen gruppieren
• Standard: Eine Konversation pro Bean
• @ConversationGroup um mehrere Beans
  in Konversation zu gruppieren
 public interface Wizard {}
 @Named @ConversationScoped
 @ConversationGroup(Wizard.class)
 public class Page1 {}
 @Named @ConversationScoped
 @ConversationGroup(Wizard.class)
 public class Page2 {}
CODI: Konversationen (Varianten)
• @ViewAccessScoped
  – Beginnt mit erstem Bean-Zugriff
  – Lebensdauer pro Ansicht erweitert
  – Bis Bean in Ansicht nicht benutzt wird
• @WindowScoped
  – Konversation pro Fenster/Tab
• Zugriff auf WindowContext möglich
  @Inject
  private WindowContext windowContext;
Demonstration




MyFaces CODI: Konversationen




Beispiel unter: https://github.com/jsflive/mygourmet-ee
CODI: @Inject für JSF-Artefakte
• @Advanced ermöglicht @Inject für:
  – Konverter
  – Validatoren
  – Phase-Listener
  @Advanced
  @FacesConverter("categoryConverter")
  public class CategoryConverter {
    @Inject
    private FinderService finderService;
    ...
  }
CODI: View-Konfiguration 1/2
• View-Konfiguration für /myPage.xhtml
  @Page
  @PageBean(MyPageBean.class)
  public final class MyPage implements ViewConfig {}


• Metadaten wie Page-Beans
• Typsichere Navigation
  public Class<? extends ViewConfig> next() {
    return MyPage.class;
  }
CODI: View-Konfiguration 2/2
• Page-Beans als Event-Listener
  public class MyPageBean {
    @InitView
    protected void initView() {}
    @PrePageAction
    protected void prePageAction() {}
    @PreRenderView
    protected void preRenderView() {}
    @BeforePhase(PROCESS_VALIDATIONS)
    protected void preValidate() {}
    @AfterPhase(PROCESS_VALIDATIONS)
    protected void postValidate() {}
  }
Demonstration




MyFaces CODI im Einsatz
• @Inject in JSF-Artefakten
• View-Konfiguration und Page-Beans

Beispiel unter: https://github.com/jsflive/mygourmet-ee
EntityConverter via Producer
• Producer-Methode pro Entität
  @ApplicationScoped
  public class ConverterProducer {
    @Produces @Named
    public EntityConverter<Category> getCategoryConverter(Finder f) {
      return new EntityConverter<Category>(f, Category.class);
    }
    @Produces @Named
    public EntityConverter<Provider> getProviderConverter(Finder f) {
      return new EntityConverter<Provider>(f, Provider.class);
    }
  }

• Einsatz in Seite
  <h:selectManyListbox value="#{bean.categories}"
      converter="#{categoryConverter}">
SelectItems via Producer
• Producer für JSF-Select-Items
  @ApplicationScoped
  public class SelectItemProducer {
    @Produces @RequestScoped @CategoryItems @Named
    public List<SelectItem> getCategoryItems() {...}
    @Produces @RequestScoped @CreditCardItems @Named
    public List<SelectItem> getCreditCardItems() {...}
  }

• Einsatz der Select-Items
  <h:selectManyListbox id="categories"
      value="#{bean.selectedCategories}">
    <f:selectItems value="#{categoryItems}"/>
  </h:selectManyListbox>
Demonstration




CDI und JSF
• SelectItems via Producer



Beispiel unter: https://github.com/jsflive/mygourmet-ee
Fazit
•   JavaEE 6 erlaubt schlanke Architektur
•   Starke Konkurrenz zu Spring
•   Alle Schichten „standardisiert“
•   Portabilität von Code und Wissen
•   JSF 2.0 + CDI + MyFaces CODI hebt
    UI-Entwicklung auf neue Ebene
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
 
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
 
Kann ich mit Grails Enterprise Applikationen umsetzen?
Kann ich mit Grails Enterprise Applikationen umsetzen?Kann ich mit Grails Enterprise Applikationen umsetzen?
Kann ich mit Grails Enterprise Applikationen umsetzen?Tobias Kraft
 
Enterprise 2.0 Portale mit Grails. Geht das?
Enterprise 2.0 Portale mit Grails. Geht das?Enterprise 2.0 Portale mit Grails. Geht das?
Enterprise 2.0 Portale mit Grails. Geht das?Tobias Kraft
 
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
 
Wieviel Client braucht das Web?
Wieviel Client braucht das Web?Wieviel Client braucht das Web?
Wieviel Client braucht das Web?gedoplan
 
Wieviel client braucht das web
Wieviel client braucht das webWieviel client braucht das web
Wieviel client braucht das webgedoplan
 
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
 
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
 
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
 
Datenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiDatenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiChristian Baranowski
 
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
 
Speeding up Java Persistence
Speeding up Java PersistenceSpeeding up Java Persistence
Speeding up Java Persistencegedoplan
 

Was ist angesagt? (20)

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
 
Feature Flags mit Togglz
Feature Flags mit TogglzFeature Flags mit Togglz
Feature Flags mit Togglz
 
Eintauchen in MVP mit GWT
Eintauchen in MVP mit GWT Eintauchen in MVP mit GWT
Eintauchen in MVP mit GWT
 
DB-Schema-Evolution mit LiquiBase
DB-Schema-Evolution mit LiquiBaseDB-Schema-Evolution mit LiquiBase
DB-Schema-Evolution mit LiquiBase
 
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
 
Kann ich mit Grails Enterprise Applikationen umsetzen?
Kann ich mit Grails Enterprise Applikationen umsetzen?Kann ich mit Grails Enterprise Applikationen umsetzen?
Kann ich mit Grails Enterprise Applikationen umsetzen?
 
Enterprise 2.0 Portale mit Grails. Geht das?
Enterprise 2.0 Portale mit Grails. Geht das?Enterprise 2.0 Portale mit Grails. Geht das?
Enterprise 2.0 Portale mit Grails. Geht das?
 
Backbase Intro
Backbase IntroBackbase Intro
Backbase Intro
 
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
 
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
Wieviel client braucht das webWieviel client braucht das web
Wieviel client braucht das web
 
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
 
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
 
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
 
Datenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence ApiDatenbankzugriff mit der Java Persistence Api
Datenbankzugriff mit der Java Persistence Api
 
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...
 
Speeding up Java Persistence
Speeding up Java PersistenceSpeeding up Java Persistence
Speeding up Java Persistence
 
Web Components
Web ComponentsWeb Components
Web Components
 

Andere mochten auch

Horário das turmas a partir de 03-10-16
Horário das turmas a partir de 03-10-16Horário das turmas a partir de 03-10-16
Horário das turmas a partir de 03-10-1620161974
 
Java swing 1de4
Java swing 1de4Java swing 1de4
Java swing 1de4Hugo Godoy
 
Lurdes Saavedra Adquisició informació escrita
Lurdes Saavedra Adquisició informació escritaLurdes Saavedra Adquisició informació escrita
Lurdes Saavedra Adquisició informació escritaaula20_2012
 
AUDI_Recommandation letter 2015
AUDI_Recommandation letter 2015AUDI_Recommandation letter 2015
AUDI_Recommandation letter 2015Aurelie Mongrard
 
Tickle Timer MVP1 Live Demo
Tickle Timer MVP1 Live DemoTickle Timer MVP1 Live Demo
Tickle Timer MVP1 Live DemoAmaraj Judge
 
Creating Repository & Project area and exploring the project area in Rational...
Creating Repository & Project area and exploring the project area in Rational...Creating Repository & Project area and exploring the project area in Rational...
Creating Repository & Project area and exploring the project area in Rational...Bharat Malge
 
business type resume
business type resumebusiness type resume
business type resumeKrisha Parmar
 
Trabalho de Mídias globais
Trabalho de Mídias globaisTrabalho de Mídias globais
Trabalho de Mídias globaisRenata Santiago
 
09 23 09
09 23 0909 23 09
09 23 09kmckim
 

Andere mochten auch (11)

Resumeup2
Resumeup2Resumeup2
Resumeup2
 
Horário das turmas a partir de 03-10-16
Horário das turmas a partir de 03-10-16Horário das turmas a partir de 03-10-16
Horário das turmas a partir de 03-10-16
 
Java swing 1de4
Java swing 1de4Java swing 1de4
Java swing 1de4
 
FUNDAMENTOS DE LA WEB 2.0
FUNDAMENTOS DE LA WEB 2.0FUNDAMENTOS DE LA WEB 2.0
FUNDAMENTOS DE LA WEB 2.0
 
Lurdes Saavedra Adquisició informació escrita
Lurdes Saavedra Adquisició informació escritaLurdes Saavedra Adquisició informació escrita
Lurdes Saavedra Adquisició informació escrita
 
AUDI_Recommandation letter 2015
AUDI_Recommandation letter 2015AUDI_Recommandation letter 2015
AUDI_Recommandation letter 2015
 
Tickle Timer MVP1 Live Demo
Tickle Timer MVP1 Live DemoTickle Timer MVP1 Live Demo
Tickle Timer MVP1 Live Demo
 
Creating Repository & Project area and exploring the project area in Rational...
Creating Repository & Project area and exploring the project area in Rational...Creating Repository & Project area and exploring the project area in Rational...
Creating Repository & Project area and exploring the project area in Rational...
 
business type resume
business type resumebusiness type resume
business type resume
 
Trabalho de Mídias globais
Trabalho de Mídias globaisTrabalho de Mídias globais
Trabalho de Mídias globais
 
09 23 09
09 23 0909 23 09
09 23 09
 

Ähnlich wie Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)

Lean web architecture mit jsf 2.0, cdi & co.
Lean web architecture mit jsf 2.0, cdi & co.Lean web architecture mit jsf 2.0, cdi & co.
Lean web architecture mit jsf 2.0, cdi & co.adesso AG
 
Lightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPALightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPAmh0708
 
Icinga 2009 at Nagios Workshop
Icinga 2009 at Nagios WorkshopIcinga 2009 at Nagios Workshop
Icinga 2009 at Nagios WorkshopIcinga
 
Cloud Native und Java EE: Freund oder Feind?
Cloud Native und Java EE: Freund oder Feind?Cloud Native und Java EE: Freund oder Feind?
Cloud Native und Java EE: Freund oder Feind?Josef Adersberger
 
Cloud Native & Java EE: Freund oder Feind?
Cloud Native & Java EE: Freund oder Feind?Cloud Native & Java EE: Freund oder Feind?
Cloud Native & Java EE: Freund oder Feind?QAware GmbH
 
Softwerkskammer Chemnitz Special Pecha Kucha Night
Softwerkskammer Chemnitz Special Pecha Kucha NightSoftwerkskammer Chemnitz Special Pecha Kucha Night
Softwerkskammer Chemnitz Special Pecha Kucha NightChristinaLerch1
 
Architectures for .Net Core Applications
Architectures for .Net Core ApplicationsArchitectures for .Net Core Applications
Architectures for .Net Core ApplicationsRobin Sedlaczek
 
Domain-Driven Design in der Praxis
Domain-Driven Design in der PraxisDomain-Driven Design in der Praxis
Domain-Driven Design in der PraxisMichael Mirold
 
Server Revolutions- Der Spring Source DM Server
Server Revolutions- Der Spring Source DM ServerServer Revolutions- Der Spring Source DM Server
Server Revolutions- Der Spring Source DM ServerSandro Sonntag
 
MongoDB Munich 2012: Spring Data MongoDB
MongoDB Munich 2012: Spring Data MongoDBMongoDB Munich 2012: Spring Data MongoDB
MongoDB Munich 2012: Spring Data MongoDBTobias Trelle
 
Neue Features der Java EE 6
Neue Features der Java EE 6Neue Features der Java EE 6
Neue Features der Java EE 6GFU Cyrus AG
 
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
 
Top 10 Internet Trends 2007
Top 10 Internet Trends 2007Top 10 Internet Trends 2007
Top 10 Internet Trends 2007Jürg Stuker
 
DACHNUG50 Domino REST API - Konzepte und Hintergruende.pdf
DACHNUG50 Domino REST API - Konzepte und Hintergruende.pdfDACHNUG50 Domino REST API - Konzepte und Hintergruende.pdf
DACHNUG50 Domino REST API - Konzepte und Hintergruende.pdfDNUG e.V.
 
Große Applikationen mit AngularJS
Große Applikationen mit AngularJSGroße Applikationen mit AngularJS
Große Applikationen mit AngularJSSebastian Springer
 
2009 - DNC: Silverlight ohne UI - Nur als Cache
2009 - DNC: Silverlight ohne UI - Nur als Cache2009 - DNC: Silverlight ohne UI - Nur als Cache
2009 - DNC: Silverlight ohne UI - Nur als CacheDaniel Fisher
 
Ajax in domino web-anwendungen - der nächste schritt
Ajax in domino web-anwendungen - der nächste schrittAjax in domino web-anwendungen - der nächste schritt
Ajax in domino web-anwendungen - der nächste schrittdominion
 

Ähnlich wie Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011) (20)

Lean web architecture mit jsf 2.0, cdi & co.
Lean web architecture mit jsf 2.0, cdi & co.Lean web architecture mit jsf 2.0, cdi & co.
Lean web architecture mit jsf 2.0, cdi & co.
 
CDI
CDICDI
CDI
 
TDD für Testmuffel
TDD für TestmuffelTDD für Testmuffel
TDD für Testmuffel
 
GWT
GWTGWT
GWT
 
Lightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPALightweight AOP with CDI and JPA
Lightweight AOP with CDI and JPA
 
Icinga 2009 at Nagios Workshop
Icinga 2009 at Nagios WorkshopIcinga 2009 at Nagios Workshop
Icinga 2009 at Nagios Workshop
 
Cloud Native und Java EE: Freund oder Feind?
Cloud Native und Java EE: Freund oder Feind?Cloud Native und Java EE: Freund oder Feind?
Cloud Native und Java EE: Freund oder Feind?
 
Cloud Native & Java EE: Freund oder Feind?
Cloud Native & Java EE: Freund oder Feind?Cloud Native & Java EE: Freund oder Feind?
Cloud Native & Java EE: Freund oder Feind?
 
Softwerkskammer Chemnitz Special Pecha Kucha Night
Softwerkskammer Chemnitz Special Pecha Kucha NightSoftwerkskammer Chemnitz Special Pecha Kucha Night
Softwerkskammer Chemnitz Special Pecha Kucha Night
 
Architectures for .Net Core Applications
Architectures for .Net Core ApplicationsArchitectures for .Net Core Applications
Architectures for .Net Core Applications
 
Domain-Driven Design in der Praxis
Domain-Driven Design in der PraxisDomain-Driven Design in der Praxis
Domain-Driven Design in der Praxis
 
Server Revolutions- Der Spring Source DM Server
Server Revolutions- Der Spring Source DM ServerServer Revolutions- Der Spring Source DM Server
Server Revolutions- Der Spring Source DM Server
 
MongoDB Munich 2012: Spring Data MongoDB
MongoDB Munich 2012: Spring Data MongoDBMongoDB Munich 2012: Spring Data MongoDB
MongoDB Munich 2012: Spring Data MongoDB
 
Neue Features der Java EE 6
Neue Features der Java EE 6Neue Features der Java EE 6
Neue Features der Java EE 6
 
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...
 
Top 10 Internet Trends 2007
Top 10 Internet Trends 2007Top 10 Internet Trends 2007
Top 10 Internet Trends 2007
 
DACHNUG50 Domino REST API - Konzepte und Hintergruende.pdf
DACHNUG50 Domino REST API - Konzepte und Hintergruende.pdfDACHNUG50 Domino REST API - Konzepte und Hintergruende.pdf
DACHNUG50 Domino REST API - Konzepte und Hintergruende.pdf
 
Große Applikationen mit AngularJS
Große Applikationen mit AngularJSGroße Applikationen mit AngularJS
Große Applikationen mit AngularJS
 
2009 - DNC: Silverlight ohne UI - Nur als Cache
2009 - DNC: Silverlight ohne UI - Nur als Cache2009 - DNC: Silverlight ohne UI - Nur als Cache
2009 - DNC: Silverlight ohne UI - Nur als Cache
 
Ajax in domino web-anwendungen - der nächste schritt
Ajax in domino web-anwendungen - der nächste schrittAjax in domino web-anwendungen - der nächste schritt
Ajax in domino web-anwendungen - der nächste schritt
 

Go Fullstack: Webanwendungen mit Java EE 6 bauen (W-JAX 2011)

  • 1. Michael Kurz | IRIAN Go Fullstack Webanwendungen mit Java EE 6 bauen
  • 2. Agenda • Motivation • Architektur und Technologie-Stack • Details Architektur • MyFaces CODI: CDI trifft JSF • Demonstration anhand eines Beispiels • MyGourmet EE (http://jsfatwork.irian.at) • Keine Einführung in EJB, CDI, JSF...
  • 3. Motivation • Java EE 6 liegt im Trend • Leichtigkeit des (Entwickler-)Seins • Entwickler: Fokus auf Geschäftslogik • Container: Services, Integration • (Krasses) Beispiel aus der Praxis: – Alt: EJB 2.1 + Struts + MDA: 70000 loc – Neu: EJB 3.1 + CDI + JSF 2: 5500 loc Der Vortragende warnt: Dieser Vortrag kann zum Überdenken alter Muster und spontanen Neuimplementierungen führen!
  • 4. Die Leichtigkeit von Java EE 6 • Führt Ease-of-Development-Strategie von Java EE 5 konsequent weiter • EJB 3.1 auf Minimum reduziert: @javax.ejb.Stateless public class CustomerService { @javax.inject.Inject private CrudService crudService; ... } • CDI erhöht Flexibilität enorm
  • 5. Architektur und Technologie-Stack JSF, CDI, CODI Präsentation EJB, CDI Service EJB, JPA Datenzugriff
  • 6. Architektur kleine/mittlere Projekte @Entity JSF, CDI, CODI Präsentation Firma @Entity Person @Entity EJB, CDI Service @Entity Firma Kontakt @Entity Person EJB, JPA @Entity Datenzugriff Kontakt
  • 7. Architektur große Projekte JSF, CDI, CODI Präsentation FirmaDto PersonDto @Entity EJB, CDI Firma Service KontaktDto @Entity Person EJB, JPA @Entity Datenzugriff Kontakt
  • 8. Datenzugriffsschicht 1/2 • Kein DAO-Layer im klassischen Sinn • Auf einen CRUD-Service reduziert • Generischer Zugriff auf EntityManager – persist, merge, delete, find • Ausführen von Queries – Named Queries – JPA 2 Criteria Queries • Kann in komplexeren Applikationen Basis für weitere Services sein
  • 9. Datenzugriffsschicht 2/2 • Service setzt Transaktion voraus @javax.ejb.Stateless @javax.ejb.TransactionAttribute( TransactionAttributeType.MANDATORY) public class CrudService { @PersistenceContext private EntityManager em; } • In Serviceschicht eingeimpft (CDI) @javax.inject.Inject private CrudService crudService;
  • 10. Serviceschicht 1/2 • Kapselt Geschäftslogik • Service-Facade definiert Schnittstelle für Client • Charakteristik Service-Facade: – Stateless-Session-Beans – Methoden starten Transaktion – Benutzen andere Services (CDI) • Keine klassische Facade! • Optional @Remote auf Service-Facade
  • 11. Serviceschicht 2/2 • Beispiel einer Service-Facade: @javax.ejb.Stateless @javax.ejb.TransactionAttribute( TransactionAttributeType.REQUIRES_NEW) public class CustomerService { @javax.inject.Inject private CrudService crudService; } • Transaktionen durch Container (default) @javax.ejb.TransactionManagement( TransactionManagementType.CONTAINER)
  • 12. Demonstration Datenzugriffs- und Service-Layer • Datenzugriffsschicht mit CRUD-Service • Serviceschicht mit Service-Facades Beispiel unter: https://github.com/jsflive/mygourmet-ee
  • 13. Präsentationsschicht • Webapplikation mit JSF 2.0 • JSF 2.0 vereinfacht Entwicklung enorm • CDI verwaltet Managed-Beans @javax.inject.Named @javax.enterprise.context.RequestScoped public class CustomerPage { @javax.inject.Inject private CustomerService service; • Gut: JSF 2 + CDI • Besser: JSF 2 + CDI + MyFaces CODI
  • 14. 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
  • 15. CODI: JSF Modul • Erweitertes Konversationskonzept – @ConversationScoped (!= CDI) – @WindowScoped – @ViewAccessScoped • Ermöglicht CDI mit JSF-Annotationen • @Inject für folgende JSF-Artefakte: – Konverter, Validatoren, Phase-Listener • Typsichere View-Config, Page-Beans
  • 16. CODI: Konversationen • Mehrere Konversationen pro Ansicht • Konversation an Tab/Fenster gebunden • Konversation beginnt mit Bean-Zugriff • Manuell oder durch Timeout beendet @Named @ConversationScoped public class WizardBean { @Inject private Conversation conversation; public void finish() { this.conversation.close(); }
  • 17. CODI: Konversationen gruppieren • Standard: Eine Konversation pro Bean • @ConversationGroup um mehrere Beans in Konversation zu gruppieren public interface Wizard {} @Named @ConversationScoped @ConversationGroup(Wizard.class) public class Page1 {} @Named @ConversationScoped @ConversationGroup(Wizard.class) public class Page2 {}
  • 18. CODI: Konversationen (Varianten) • @ViewAccessScoped – Beginnt mit erstem Bean-Zugriff – Lebensdauer pro Ansicht erweitert – Bis Bean in Ansicht nicht benutzt wird • @WindowScoped – Konversation pro Fenster/Tab • Zugriff auf WindowContext möglich @Inject private WindowContext windowContext;
  • 19. Demonstration MyFaces CODI: Konversationen Beispiel unter: https://github.com/jsflive/mygourmet-ee
  • 20. CODI: @Inject für JSF-Artefakte • @Advanced ermöglicht @Inject für: – Konverter – Validatoren – Phase-Listener @Advanced @FacesConverter("categoryConverter") public class CategoryConverter { @Inject private FinderService finderService; ... }
  • 21. CODI: View-Konfiguration 1/2 • View-Konfiguration für /myPage.xhtml @Page @PageBean(MyPageBean.class) public final class MyPage implements ViewConfig {} • Metadaten wie Page-Beans • Typsichere Navigation public Class<? extends ViewConfig> next() { return MyPage.class; }
  • 22. CODI: View-Konfiguration 2/2 • Page-Beans als Event-Listener public class MyPageBean { @InitView protected void initView() {} @PrePageAction protected void prePageAction() {} @PreRenderView protected void preRenderView() {} @BeforePhase(PROCESS_VALIDATIONS) protected void preValidate() {} @AfterPhase(PROCESS_VALIDATIONS) protected void postValidate() {} }
  • 23. Demonstration MyFaces CODI im Einsatz • @Inject in JSF-Artefakten • View-Konfiguration und Page-Beans Beispiel unter: https://github.com/jsflive/mygourmet-ee
  • 24. EntityConverter via Producer • Producer-Methode pro Entität @ApplicationScoped public class ConverterProducer { @Produces @Named public EntityConverter<Category> getCategoryConverter(Finder f) { return new EntityConverter<Category>(f, Category.class); } @Produces @Named public EntityConverter<Provider> getProviderConverter(Finder f) { return new EntityConverter<Provider>(f, Provider.class); } } • Einsatz in Seite <h:selectManyListbox value="#{bean.categories}" converter="#{categoryConverter}">
  • 25. SelectItems via Producer • Producer für JSF-Select-Items @ApplicationScoped public class SelectItemProducer { @Produces @RequestScoped @CategoryItems @Named public List<SelectItem> getCategoryItems() {...} @Produces @RequestScoped @CreditCardItems @Named public List<SelectItem> getCreditCardItems() {...} } • Einsatz der Select-Items <h:selectManyListbox id="categories" value="#{bean.selectedCategories}"> <f:selectItems value="#{categoryItems}"/> </h:selectManyListbox>
  • 26. Demonstration CDI und JSF • SelectItems via Producer Beispiel unter: https://github.com/jsflive/mygourmet-ee
  • 27. Fazit • JavaEE 6 erlaubt schlanke Architektur • Starke Konkurrenz zu Spring • Alle Schichten „standardisiert“ • Portabilität von Code und Wissen • JSF 2.0 + CDI + MyFaces CODI hebt UI-Entwicklung auf neue Ebene
  • 28. 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