AdvancedJSF

6,748
-1

Published on

Published in: Technology
0 Comments
4 Likes
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
6,748
On Slideshare
0
From Embeds
0
Number of Embeds
0
Actions
Shares
0
Downloads
0
Comments
0
Likes
4
Embeds 0
No embeds

No notes for slide

AdvancedJSF

  1. 1. Advanced JavaServer Faces Matthias Weßendorf | matzew@apache.org
  2. 2. Matthias Weßendorf <ul><li>Oracle Corp. </li></ul><ul><ul><li>ADFv team (ADF Faces) </li></ul></ul><ul><li>Apache Software Foundation </li></ul><ul><ul><li>Apache MyFaces (Trinidad | Core) </li></ul></ul><ul><ul><li>Apache Shale </li></ul></ul><ul><li>Autor </li></ul><ul><ul><li>Java- & Eclipse-Magazin </li></ul></ul><ul><ul><li>Bücher zu Struts, J2ME&WebServices </li></ul></ul><ul><li>Speaker </li></ul><ul><ul><li>Oracle Open World </li></ul></ul><ul><ul><li>JavaOne </li></ul></ul><ul><ul><li>JAX, W-JAX </li></ul></ul><ul><ul><li>ApacheCon </li></ul></ul>
  3. 3. Advanced JSF - ToC <ul><li>JSF – Hintergrund </li></ul><ul><li>JSF – Überblick JSF - Frameworks </li></ul><ul><li>Die Framework Auswahl </li></ul><ul><li>Framework Details </li></ul><ul><li>Integration </li></ul><ul><li>Code-Beispiele </li></ul>
  4. 4. JSF – Background <ul><li>Zum Anfgang mit Servlets ... </li></ul><ul><li>... und JSPs ... </li></ul><ul><li>... und „Model 2“ Web frameworks </li></ul><ul><ul><li>Apache Struts </li></ul></ul><ul><ul><li>Action-basiert </li></ul></ul><ul><li>... und JSTL! </li></ul><ul><li>Viele „Model 2“ Frameworks ... </li></ul><ul><ul><li>(fast) kein Komponenten-Ansatz (UI Framework) </li></ul></ul><ul><ul><ul><li>UI Tags mit JSTL </li></ul></ul></ul><ul><li>JavaServer Faces </li></ul><ul><ul><li>Ein Standard für Java Web Apps </li></ul></ul>
  5. 5. JSF – Details <ul><li>Java Standard des JCP </li></ul><ul><ul><li>Leichtgewichtiges Web-Framework </li></ul></ul><ul><ul><li>API für UI Komponenten </li></ul></ul><ul><li>Spezifikationen: </li></ul><ul><ul><li>JSR 127  JSF 1.1 (Mai 2004) </li></ul></ul><ul><ul><li>JSR 252  JSF 1.2 [Java EE 5] (Mai 2006) </li></ul></ul><ul><ul><li>JSR 314  JSF 2.0 [Java EE 6] (2008 ?) </li></ul></ul><ul><li>Ziele </li></ul><ul><ul><li>Vereinfachte Java-Web-Entwicklung </li></ul></ul><ul><ul><li>Tooling (Jdev, Sun / Netbeans, Eclipse, ...) </li></ul></ul><ul><li>Implementierungen </li></ul><ul><ul><li>Apache MyFaces </li></ul></ul><ul><ul><li>RI (Sun) </li></ul></ul>
  6. 6. JSF –Frameworks <ul><li>Echt ? Ein Standard ? </li></ul><ul><li>JA ! ! ! </li></ul><ul><li>Aber... </li></ul><ul><li>Viele Optionen: </li></ul><ul><ul><li>View-Layer (JSP, Facelets, Shale-Clay, Tiles, ...) </li></ul></ul><ul><ul><li>Dialog (Spring, Shale, Oracle ADFc) </li></ul></ul><ul><ul><li>JSF-Frameworks (Seam / Web Beans) </li></ul></ul><ul><ul><li>Custom JSF Lifecycle... (Mabon, ADF Faces) </li></ul></ul><ul><ul><li>Komponenten (many, many ...) </li></ul></ul>
  7. 7. Frameworks... <ul><li>Apache MyFaces Tomahawk </li></ul>Apache MyFaces Sun RI IceFaces Oracle ADF Faces Apache MyFaces Tobago Apache MyFaces Trinidad Facelets Seam JSR 299 / Web Beans Rich Client Faces Jenia Yahoo UI 4 JSF  http://www.jsfmatrix.net 
  8. 8. Houston, we have a problem !
  9. 9. JSF Frameworks <ul><li>Was man wirklich braucht : </li></ul><ul><li>JSF – Runtime: </li></ul><ul><ul><li>Apache MyFaces </li></ul></ul><ul><ul><li>Sun RI </li></ul></ul><ul><li>View-Layer: </li></ul><ul><ul><li>JSP / JSPX (default) </li></ul></ul><ul><ul><li>Facelets </li></ul></ul><ul><ul><li>Apache Shale Clay </li></ul></ul><ul><li>Komponenten: </li></ul><ul><ul><li>Standard Komponenten </li></ul></ul><ul><ul><ul><li>Sehr einfache Komponenten </li></ul></ul></ul><ul><ul><li>Oft braucht man mehr... </li></ul></ul>
  10. 10. Frameworks <ul><li>Mehr nicht ? </li></ul><ul><li>Für „VIEW“, ja... </li></ul><ul><li>Was braucht der Business-Layer ? </li></ul><ul><ul><li>EJB 2.x </li></ul></ul><ul><ul><li>EJB 3.x </li></ul></ul><ul><ul><li>Spring </li></ul></ul><ul><ul><li>Spring + JPA </li></ul></ul><ul><ul><li>ORM (Toplink, Hibernate) </li></ul></ul><ul><ul><li>JDBC / Spring + JDBC </li></ul></ul><ul><ul><li>Datenbank... </li></ul></ul>
  11. 11. Frameworks <ul><li>Die Auswahl: </li></ul><ul><ul><li>Apache MyFaces (runtime) </li></ul></ul><ul><ul><li>Facelets (view-layer) </li></ul></ul><ul><ul><li>Trinidad (JSF-Komponenten Bibliothek) </li></ul></ul><ul><ul><ul><li>The mother of PPR  </li></ul></ul></ul><ul><ul><li>Spring + JPA + Derby/HSQL </li></ul></ul><ul><ul><ul><li>JPA = Java Persistence API: </li></ul></ul></ul><ul><ul><ul><ul><li>Apache OpenJPA </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Oracle‘s Toplink (Eclipse Link) </li></ul></ul></ul></ul><ul><ul><ul><ul><li>Apache Cayenne </li></ul></ul></ul></ul><ul><ul><ul><ul><li>... </li></ul></ul></ul></ul><ul><ul><li>MyFaces Orchestra (ViewController + conversation scope) </li></ul></ul>
  12. 12. Die Architektur JSF View DAO / Repository JSF Bean Service Spring Beans Java Persistence API Oracle 11g View Controller XHTML Seiten Faces Apache MyFaces Orchestra
  13. 13. Details der Frameworks
  14. 14. Apache MyFaces <ul><li>Erste OpenSource JSF Implementierung </li></ul><ul><ul><li>Bietet JSF 1.1 und JSF 1.2 (in 2007) </li></ul></ul><ul><ul><li>Notes on the TCK ... </li></ul></ul><ul><li>Seit 2005 ein Apache Projekt </li></ul><ul><ul><li>Vorher: LGPL / Sourceforge </li></ul></ul><ul><li>Größte JSF „user community“ </li></ul><ul><li>Viele Unterprojekte </li></ul><ul><ul><li>Tobago </li></ul></ul><ul><ul><li>Tomahawk </li></ul></ul><ul><ul><li>Trinidad </li></ul></ul><ul><ul><li>Orchestra </li></ul></ul><ul><ul><li>Fortsetzung folgt  </li></ul></ul>
  15. 15. Facelets <ul><li>Alternative JSF-View-Technik </li></ul><ul><ul><li>JSP(X) ist „old school“ </li></ul></ul><ul><li>Leichtgewichtiges Templating Framwork </li></ul><ul><ul><li>XHTML-basierte Templates </li></ul></ul><ul><ul><li>Designer-freundlich </li></ul></ul><ul><ul><li>DEMO... </li></ul></ul><ul><li>Performance </li></ul><ul><li>JSF 1.2 auch ohne JavaEE 5 Container </li></ul><ul><li>Einfache Komponenten Entwicklung! </li></ul><ul><ul><li>JavaServer Faces - Version 2.x </li></ul></ul><ul><ul><li>DEMO... </li></ul></ul><ul><li>Similar to Tapestry... </li></ul>
  16. 16. Facelets <ul><li>Hinzufügen des ViewHandler </li></ul><ul><ul><li>Mit Trinidad/IceFaces => web.xml </li></ul></ul><ul><ul><li>Im Standard, Tomahawk, ... => faces-cfg </li></ul></ul><ul><li>Hinzufügen der JARs </li></ul><ul><ul><li>Unified EL (javax.el) => el-api, el-imp </li></ul></ul><ul><ul><li>facelets.jar </li></ul></ul><ul><li>Benötigt Java 5 </li></ul>
  17. 17. Einfaches Facelet <ul><li><!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;> </li></ul><ul><li><html </li></ul><ul><li>xmlns=&quot;http://www.w3.org/1999/xhtml </li></ul><ul><li>xmlns:h=&quot;http://java.sun.com/jsf/html &quot;> </li></ul><ul><li><body> <input type=&quot;text&quot; jsfc=&quot; h:inputText „ value=&quot;#{bean.property}&quot; /> </li></ul><ul><li></body> </li></ul><ul><li></html> </li></ul>
  18. 18. Shale – Clay-Plugin <ul><li>Temaplating Framework für JSF </li></ul><ul><ul><li>Alternative zu Facelets und JSP(X) </li></ul></ul><ul><ul><li>gewöhnliche HTML Datei als Template </li></ul></ul><ul><li>Tiles-ähnlicher als Facelets </li></ul><ul><li>Mehr XML files, als Facelets </li></ul><ul><ul><li>Configuration overhead ?! </li></ul></ul><ul><ul><li>web.xml </li></ul></ul><ul><ul><ul><li>3 Context-param Einträge </li></ul></ul></ul><ul><ul><li>clay-config.xml </li></ul></ul><ul><ul><ul><li>Für Clay Komponenten </li></ul></ul></ul><ul><ul><li>clay-views-config.xmk </li></ul></ul><ul><ul><ul><li>Seiten, die auf der/den Komponenten basieren </li></ul></ul></ul>
  19. 19. Apache MyFaces Trinidad <ul><li>Unterprojekt von Apache MyFaces </li></ul><ul><li>Über 100 JSF Komponenten </li></ul><ul><li>Verschiedene Framework „goodies“ </li></ul><ul><ul><li>Test-Framework </li></ul></ul><ul><ul><li>Maven Plugins </li></ul></ul><ul><ul><li>Skinning (CSS basiert) (DEMO) </li></ul></ul><ul><ul><li>Dialog-Support (DEMO) </li></ul></ul><ul><ul><li>Ajax-API (DEMO) </li></ul></ul><ul><ul><ul><li>Client-seitig (JavaScript) </li></ul></ul></ul><ul><ul><ul><li>Server-seitig (Java) </li></ul></ul></ul><ul><li>Stabile JSF Komponenten Bibliothek </li></ul><ul><ul><li>JSF 1.1 und 1.2 Unterstützung </li></ul></ul><ul><li>„ Spende“ von Oracle (2006) (ADF Faces) </li></ul>
  20. 20. Apache MyFaces Trinidad <ul><li>Demonstration von verschiedenen JSF Komponenten </li></ul><ul><li>Trinidad Demo online: </li></ul><ul><li>http://www.irian.at </li></ul>
  21. 21. Spring Framework <ul><li>Bekanntes OpenSource Framework </li></ul><ul><ul><li>Apache 2.0 License </li></ul></ul><ul><li>„ Hilfe“ für Java EE (J2EE) </li></ul><ul><ul><li>Macht EJB / J2EE einfacher! </li></ul></ul><ul><ul><li>POJOs sind „first class citizens“ </li></ul></ul><ul><ul><li>Hat Java EE 5 bereichert </li></ul></ul><ul><li>Viele „goodies“ (AOP, Transaction, DI, JDBC, ...) </li></ul><ul><li>Integration für etliche Frameworks und Techniken </li></ul><ul><ul><li>JSF, Struts, EJB, Hibernate, AspectJ,... </li></ul></ul>
  22. 22. Java Persistence API <ul><li>Standard für Java Persistenz </li></ul><ul><ul><li>Wichtiger Teil der EJB3 Spec. (JSR 220) </li></ul></ul><ul><ul><ul><li>Nutzung auch ohne EJB-Container möglich </li></ul></ul></ul><ul><ul><li>RI => Toplink Essentials (Glassfish) </li></ul></ul><ul><ul><li>Lessons learned (Toplink, Hibernate, JDO) </li></ul></ul><ul><li>Vereinfacht EJB (2.x und 1.x) </li></ul><ul><li>Java5 Annotations (oder XML...) </li></ul><ul><li>ORM-Frameworks (mit JPA Support): </li></ul><ul><ul><li>Eclipse Link (Oracle Toplink) </li></ul></ul><ul><ul><li>Hibernate (JBoss) </li></ul></ul><ul><ul><li>OpenJPA & Cayenne (Apache) </li></ul></ul>
  23. 23. Java Persistence API <ul><li>@Entity </li></ul><ul><li>public class Customer </li></ul><ul><li>{ </li></ul><ul><li>@Id </li></ul><ul><li>@GeneratedValue (strategy= GenerationType. AUTO ) </li></ul><ul><li>private Long id ; </li></ul>
  24. 24. Java Persistence API <ul><li>@Temporal (value = TemporalType. DATE ) private Date birthday ; </li></ul><ul><li>@OneToOne (cascade= CascadeType. ALL ) private Address address ; </li></ul>
  25. 25. Spring und JPA <ul><li>Nutzung von JPA ohne EJB-Container </li></ul><ul><ul><li>JPA-Nutzung als ORM-Framework </li></ul></ul><ul><li>Support für folgende JPA Implementierungen: </li></ul><ul><ul><li>JPA-Vendor-Adapter </li></ul></ul><ul><ul><ul><li>Hibernate </li></ul></ul></ul><ul><ul><ul><li>OpenJPA (Apache) </li></ul></ul></ul><ul><ul><ul><li>Toplink </li></ul></ul></ul><ul><li>JPA Template </li></ul><ul><ul><li>Nur für die Migration zu JPA angedacht! </li></ul></ul><ul><li>Direkte Benutzung des PersistenceContext </li></ul><ul><ul><li>AbstractEntityManagerFactoryBean </li></ul></ul>
  26. 26. Spring und JPA <ul><li>EntityManagerFactory in Spring-Context </li></ul><ul><ul><li>Konfiguration als JNDI / Spring-Bean </li></ul></ul><ul><li>Transaktionen-Support </li></ul><ul><ul><li>JPA-TransactionManager </li></ul></ul><ul><ul><li>JTA-TransactionManager </li></ul></ul><ul><li>DAO / Repositroy </li></ul><ul><ul><li>Implementierung des Interfaces kennt JPA </li></ul></ul><ul><ul><li>@PersistenceUnit </li></ul></ul><ul><ul><li>@PersistenceContext </li></ul></ul><ul><li>Einheitliches Exception-Handling </li></ul><ul><ul><li>Spring‘s DataAccessException </li></ul></ul><ul><ul><li>@Repository </li></ul></ul>
  27. 27. Spring und JPA (Config) <ul><li><bean id=&quot;entityManagerFactory&quot; class=&quot; org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean &quot; </li></ul><ul><li>p:dataSource-ref=&quot;dataSource&quot; </li></ul><ul><li>p:persistenceUnitName=&quot;kickstart&quot; > </li></ul><ul><li><property name=&quot;jpaVendorAdapter&quot;> </li></ul><ul><li><bean class=&quot;org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter&quot;> </li></ul><ul><li><property name=&quot;showSql&quot; value=&quot;true&quot;/> </li></ul><ul><li><property name=&quot;generateDdl&quot; value=&quot;true&quot;/> </li></ul><ul><li></bean> </li></ul><ul><li></property> </li></ul><ul><li><!– Kopie von OPENJPA-40 --> </li></ul><ul><li><property name=&quot;loadTimeWeaver&quot;> </li></ul><ul><li><bean class=&quot;net.wessendorf.wjax.openjpa.OpenJpaLoadTimeWeaver&quot;/> </li></ul><ul><li></property> </li></ul><ul><li></bean> </li></ul>
  28. 28. Spring und JPA (Config) <ul><li><bean id=&quot;transactionManager&quot; class=&quot;org.springframework.orm.jpa.JpaTransactionManager&quot; </li></ul><ul><li>p:entityManagerFactory-ref=&quot;entityManagerFactory&quot; </li></ul><ul><li>/> </li></ul><ul><li><bean class=„ </li></ul><ul><li>org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor </li></ul><ul><li>&quot;/> </li></ul><ul><li><bean class=„ </li></ul><ul><li>org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor </li></ul><ul><li>&quot;/> </li></ul>
  29. 29. Spring und JPA (DAO) <ul><li>@Repository </li></ul><ul><li>@Transactional (propagation = Propagation. SUPPORTS ) </li></ul><ul><li>public class JpaCustomerDaoImpl implements CustomerDao </li></ul><ul><li>{ </li></ul><ul><li>private final String QUERY_ALL = &quot;select c from Customer c&quot; ; </li></ul><ul><li>private final String QUERY_BY_SECONDNAME = &quot;select c from Customer c where c.secondname LIKE :param&quot; ; </li></ul><ul><li>private EntityManager em ; </li></ul><ul><li>@PersistenceContext </li></ul><ul><li>public void setEntityManager(EntityManager entityManager) </li></ul><ul><li>{ </li></ul><ul><li>this . em = entityManager; </li></ul><ul><li>} </li></ul><ul><li>... </li></ul>
  30. 30. Spring und JPA (DAO) <ul><li>public void remove(Customer customer) </li></ul><ul><li>{ </li></ul><ul><li>Customer toDel = findById(customer.getId()); </li></ul><ul><li>em .remove(toDel); </li></ul><ul><li>} </li></ul><ul><li>public List queryBySecondname(String name) </li></ul><ul><li>{ </li></ul><ul><li>Query q = em .createQuery( QUERY_BY_SECONDNAME ); </li></ul><ul><li>q.setParameter( &quot;param&quot; , name+ &quot;%&quot; ); </li></ul><ul><li>return q.getResultList(); </li></ul><ul><li>} </li></ul>
  31. 31. Services mit Spring <ul><li>Implementieren Geschäftslogik </li></ul><ul><ul><li>Interface </li></ul></ul><ul><ul><li>Implementierung </li></ul></ul><ul><li>Greifen auf DAO / Repository zu </li></ul><ul><li>Bereitstellung von Transaktionsregeln </li></ul><ul><ul><li>Auf Methoden-Ebene </li></ul></ul><ul><li>Client kennt nur Service-Interfaces </li></ul><ul><ul><li>JSF-Managed-Bean </li></ul></ul>
  32. 32. Services mit Spring <ul><li>private CustomerDao customerDao ; </li></ul><ul><li>public void setCustomerDao(CustomerDao customerDao) </li></ul><ul><li>{ </li></ul><ul><li>this . customerDao = customerDao; </li></ul><ul><li>} </li></ul><ul><li>@Transactional(propagation = Propagation.REQUIRED) </li></ul><ul><li>public void removeCustomer(Customer customer) </li></ul><ul><li>{ </li></ul><ul><li>customerDao .remove(customer); </li></ul><ul><li>} </li></ul>
  33. 33. Spring: Service und DAO <ul><li>Konfiguration: </li></ul><ul><li>< bean class = „ </li></ul><ul><li>com.sessions.myfaces.daos. JpaCustomerDaoImpl &quot; id = &quot; customerDao &quot; /> </li></ul><ul><li>< bean class = „ </li></ul><ul><li>com.sessions.myfaces.services. CustomerServiceImpl &quot; id = &quot;customerService„ </li></ul><ul><li>p:customerDao-ref = &quot;customerDao&quot; /> </li></ul>
  34. 34. MyFaces Orchestra <ul><li>Einfaches Applikations State Management </li></ul><ul><ul><li>Conversation-Scope (dialog / wizard) </li></ul></ul><ul><li>Bessere Integration von View- und Persistenz Layer </li></ul><ul><ul><li>Conversation-Scope persistance contexts </li></ul></ul><ul><li>JSF-Extension </li></ul><ul><ul><li>MyFaces-IMPL unabhängig </li></ul></ul><ul><ul><li>Kern unabhängig von JSF API... </li></ul></ul><ul><ul><ul><li>Kein anderes Framework (derzeit!) </li></ul></ul></ul><ul><li>JSF‘s „Managed Bean Facility“ ersetzt durch Spring‘s IoC Container </li></ul><ul><ul><li>Mit Spring 2.0 </li></ul></ul><ul><li>ViewController </li></ul>
  35. 35. Session Application Conversation Flash Request Conversation Scopes
  36. 36. Conversation-Scope persistance contexts
  37. 37. <ul><li>Gewöhnliches Muster </li></ul><ul><ul><li>Bean name ähnlich wie View-Id (JSF) </li></ul></ul><ul><ul><li>form.xhtml  form </li></ul></ul><ul><ul><li>users/form.xhtml  usersForm </li></ul></ul><ul><li>Services </li></ul><ul><ul><li>initView (nach RESTORE_VIEW ) </li></ul></ul><ul><ul><li>preProcess (vor INVOKE_APPLICATION ) </li></ul></ul><ul><ul><li>preRender (vor PRE_RENDER ) </li></ul></ul><ul><li>Orchestra bietet Annotations </li></ul><ul><li>Ebenfalls bekannt in: </li></ul><ul><ul><li>JDeveloper + ADFc </li></ul></ul><ul><ul><li>Apache Shale </li></ul></ul>ViewController
  38. 38. Team-Bildung!
  39. 39. Generale Konfiguration <ul><li>Verschiedene XML Dateien... </li></ul><ul><ul><li>Servlet Container (web.xml) </li></ul></ul><ul><ul><ul><li>Alle Frameworks... </li></ul></ul></ul><ul><ul><li>Faces (faces-config.xml) </li></ul></ul><ul><ul><li>Spring XML Datei(en) </li></ul></ul><ul><ul><li>Trinidad: </li></ul></ul><ul><ul><ul><li>trinidad-config.xml </li></ul></ul></ul><ul><ul><ul><li>trinidad-skin.xml </li></ul></ul></ul><ul><ul><li>Facelets: </li></ul></ul><ul><ul><ul><li>(custom) taglib... </li></ul></ul></ul>
  40. 40. Wichtige Konfiguration <ul><li>JSF </li></ul><ul><ul><li>FacesServlet (web.xml) </li></ul></ul><ul><li>Facelets </li></ul><ul><ul><li>ViewHandler (web.xml wg. Trinidad) </li></ul></ul><ul><ul><li>javax.faces.DEFAULT_SUFFIX (web.xml) </li></ul></ul><ul><li>Trinidad </li></ul><ul><ul><li>RenderKit (faces-config.xml) </li></ul></ul><ul><ul><li>TrinidadFilter (web.xml) </li></ul></ul><ul><ul><li>ResourceServlet (web.xml) </li></ul></ul><ul><li>Orchestra </li></ul><ul><ul><li>Verschiedene Dinge (spring-xml(s) & web.xml) </li></ul></ul><ul><li>Spring </li></ul><ul><ul><li>RequestContextListener (web.xml) </li></ul></ul><ul><ul><li>ContextLoaderListener (web.xml) </li></ul></ul><ul><ul><li>DelegatingVariableResolver (faces-config.xml) </li></ul></ul>
  41. 41. JSF Managed Bean‘s <ul><li>Nutzung von Spring 2 </li></ul><ul><ul><li>Bietet Scopes (request / session) </li></ul></ul><ul><li>Konfiguration: </li></ul><ul><li>< faces-config > </li></ul><ul><li>< application > </li></ul><ul><li>< variable-resolver > </li></ul><ul><li>org.springframework.web.jsf.DelegatingVariableResolver </li></ul><ul><li></ variable-resolver > </li></ul><ul><li></ application > </li></ul><ul><li>... </li></ul>
  42. 42. JSF Managed Bean‘s <ul><li>Einfache Bean Klasse: </li></ul><ul><li>public class FooController </li></ul><ul><li>{ </li></ul><ul><li>private CustomerService customerService ; </li></ul><ul><li>public CustomerService getCustomerService() </li></ul><ul><li>{ </li></ul><ul><li>return customerService ; </li></ul><ul><li>} </li></ul><ul><li>public void setCustomerService(CustomerService customerService) </li></ul><ul><li>{ </li></ul><ul><li>this . customerService = customerService; </li></ul><ul><li>} </li></ul><ul><li>... </li></ul><ul><li>} </li></ul>
  43. 43. JSF Managed Bean‘s <ul><li>Konfiguration (in Spring !): </li></ul><ul><ul><li>Spring hat viele Feature... </li></ul></ul><ul><ul><li>Für Orchestra ein MUSS! </li></ul></ul><ul><li>Keine Beans in faces-config.xml </li></ul><ul><li>< bean </li></ul><ul><li>id = &quot;create„ class = „....FooController„ scope = &quot;request&quot; </li></ul><ul><li>p:userService-ref = &quot; userServiceImpl “ / > </li></ul>
  44. 44. Faces Servlet Mapping <ul><li>http://server:8080/app/page.faces </li></ul><ul><li>Mit Facelets </li></ul><ul><ul><li>„ Open Source“ </li></ul></ul><ul><ul><ul><li>http://server:8080/app/page.xhtml </li></ul></ul></ul><ul><li>Servlet-Mapping: </li></ul><ul><li>< servlet-mapping > </li></ul><ul><li>< servlet-name > faces </ servlet-name > </li></ul><ul><li>< url-pattern > *.xhtml </ url-pattern > </li></ul><ul><li></ servlet-mapping > </li></ul><ul><li>http://server:8080/app/page.xhtml </li></ul>
  45. 45. Let‘s code! <ul><li>Praktische Anwendung der verschiedenen Frameworks </li></ul>
  46. 46. Facelets <ul><li>Template Engine, XHTML basiert </li></ul><ul><ul><li>Layout mit CSS </li></ul></ul><ul><ul><li>Bestimmen von Bereichen </li></ul></ul><ul><ul><ul><li>(content, footer, ...) </li></ul></ul></ul><ul><li><tr:document </li></ul><ul><li>xmlns:ui=&quot;http://java.sun.com/jsf/facelets&quot; </li></ul><ul><li>xmlns:tr=&quot;http://myfaces.apache.org/trinidad&quot; </li></ul><ul><li>...> </li></ul><ul><li>... </li></ul><ul><li><div class=„content&quot;> </li></ul><ul><li><ui:insert name=&quot;content&quot;>My default Content</ui:insert> </li></ul><ul><li></div> </li></ul><ul><li>...</tr:document> </li></ul>
  47. 47. Facelets <ul><li>Template Client </li></ul><ul><ul><li>Gewöhnliche Webseite </li></ul></ul><ul><li><ui:composition xmlns=&quot;http://www.w3.org/1999/xhtml&quot; </li></ul><ul><li>xmlns:tr=&quot;http://myfaces.apache.org/trinidad&quot; </li></ul><ul><li>xmlns:mw=&quot;http://wessendorf.net/kickstart&quot; </li></ul><ul><li>... </li></ul><ul><li>template=&quot;WEB-INF/facelets/layout/template.xhtml&quot; > </li></ul><ul><li><!-- content --> </li></ul><ul><li><ui:define name=&quot;content&quot;> </li></ul><ul><li>Mein JSF-Content !!! </li></ul><ul><li></ui:define> </li></ul><ul><li></ui:composition> </li></ul>
  48. 48. Facelets <ul><li>JSF ist nicht „DRY“ ? </li></ul><ul><li><h:dataTable ...> </li></ul><ul><li>... </li></ul><ul><li><h:colum> </li></ul><ul><li><f:facet name=„header“> </li></ul><ul><li><h:outputText value=„Name“ /> </li></ul><ul><li></f:facet> </li></ul><ul><li><h:outputText value=„#{bean.name}“ /> </li></ul><ul><li></column> </li></ul><ul><li>... </li></ul><ul><li><h:colum> </li></ul><ul><li><f:facet name=„header“> </li></ul><ul><li><h:outputText value=„some other value“ /> </li></ul><ul><li></f:facet> </li></ul><ul><li><h:outputText value=„#{bean.foo}“ /> </li></ul><ul><li></column> </li></ul><ul><li>... </li></ul><ul><li></h:dataTable> </li></ul>
  49. 49. Facelets <ul><li>Das wäre doch nett ! </li></ul><ul><li><h:dataTable ...> </li></ul><ul><li>... </li></ul><ul><li><x:smartColumn header=„Name“ value=„#{bean.name}“/> </li></ul><ul><li><x:smartColumn header=„ some other value“ value=„#{bean.foo}“/> </li></ul><ul><li>... </li></ul><ul><li></h:dataTable </li></ul><ul><li>... aber... </li></ul>
  50. 50. Facelets <ul><li>Komponenten-Entwicklung aufwändig </li></ul><ul><ul><li>Java: </li></ul></ul><ul><ul><ul><li>UIComponent (JavaBean) </li></ul></ul></ul><ul><ul><ul><li>Renderer (Erzeugt das HTML) </li></ul></ul></ul><ul><ul><ul><li>Tag-Klasse (Verbindet Comp. mit Renderer) </li></ul></ul></ul><ul><ul><li>XML </li></ul></ul><ul><ul><ul><li>Faces-config.xml (Registrieren von Type) </li></ul></ul></ul><ul><ul><ul><li>TLD Datei (Registrieren des Tags) </li></ul></ul></ul>
  51. 51. Facelets <ul><li>Mit Facelets... </li></ul><ul><ul><li>einfache Entwicklung von Komponenten </li></ul></ul><ul><li>„ Rendering“ via XHTML Datei </li></ul><ul><li>Kein! Java-Code notwendig </li></ul><ul><li>Lediglich: </li></ul><ul><ul><li>XHTML Datei </li></ul></ul><ul><ul><li>Facelet‘s Taglib XML Datei </li></ul></ul><ul><ul><li>Taglib in web.xml registrieren </li></ul></ul>
  52. 52. Facelets <ul><li>Meine JSF Komponente: </li></ul><ul><li><tr:column </li></ul><ul><li>xmlns:ui=&quot;http://java.sun.com/jsf/facelets&quot; </li></ul><ul><li>xmlns:f=&quot;http://java.sun.com/jsf/core&quot; </li></ul><ul><li>xmlns:tr=&quot;http://myfaces.apache.org/trinidad &quot;> </li></ul><ul><li><f:facet name=&quot;header&quot;> </li></ul><ul><li><tr:outputText value=&quot;#{header}&quot; /> </li></ul><ul><li></f:facet> </li></ul><ul><li><tr:outputText value=&quot;#{value}&quot; /> </li></ul><ul><li></tr:column> </li></ul>
  53. 53. Facelets <ul><li>Die Taglib.xml: </li></ul><ul><li><facelet-taglib> </li></ul><ul><li><namespace>http://corp.com/smart</namespace> </li></ul><ul><li><tag> </li></ul><ul><li><tag-name>smartColumn</tag-name> </li></ul><ul><li><source>facelets/components/column.xhtml</source> </li></ul><ul><li></tag> </li></ul><ul><li></facelet-taglib> </li></ul><ul><li>Registration in web.xml: </li></ul><ul><li><context-param> </li></ul><ul><li><param-name>facelets.LIBRARIES</param-name> </li></ul><ul><li><param-value>/WEB-INF/mw.taglib.xml</param-value> </li></ul><ul><li></context-param> </li></ul>
  54. 54. Facelets <ul><li>Benutzung: </li></ul><ul><ul><li>Namespace hinzufügen: </li></ul></ul><ul><ul><li><tr:document </li></ul></ul><ul><ul><li>xmlns:ui=&quot;http://java.sun.com/jsf/facelets&quot; </li></ul></ul><ul><ul><li>xmlns:x=&quot; http://corp.com/smart&quot; </li></ul></ul><ul><ul><li>xmlns:f=&quot;http://java.sun.com/jsf/core&quot;> </li></ul></ul><ul><ul><li>Nutzung in XHTML-Datei: </li></ul></ul><ul><li><x:smartColumn header=„Name“ value=„#{bean.name}“/> </li></ul>
  55. 55. Trinidad <ul><li>Bietet Ajax (aka PPR) </li></ul><ul><ul><li>Erstellt „vor“ Ajax... </li></ul></ul><ul><ul><li>XHR + IFrame (für Uploads) </li></ul></ul><ul><ul><li>Komponenten beinhalten Ajax: </li></ul></ul><ul><ul><ul><li>autoSubmit </li></ul></ul></ul><ul><ul><ul><li>partialSubmit </li></ul></ul></ul><ul><ul><ul><li>partialTriggers </li></ul></ul></ul><ul><li>Ajax-API </li></ul><ul><ul><li>server </li></ul></ul><ul><ul><li>client </li></ul></ul><ul><li>Dialog-Framework </li></ul><ul><li>CSS Skinning </li></ul>
  56. 56. Trinidad <ul><li>PPR in Action </li></ul><ul><li><tr:selectOneRadio value=&quot;#{partialBean.selectOne}&quot; autoSubmit=&quot;true&quot; id=&quot;select1&quot; > </li></ul><ul><li><tr:selectItem label=&quot;First&quot; value=&quot;Beer&quot;/> </li></ul><ul><li><tr:selectItem label=&quot;Second&quot; value=&quot;more beer&quot;/> </li></ul><ul><li><tr:selectItem label=&quot;Third&quot; value=&quot;sold out!&quot;/> </li></ul><ul><li></tr:selectOneRadio> </li></ul><ul><li><tr:outputText value=&quot;#{partialBean.selectOne}&quot; </li></ul><ul><li>partialTriggers=&quot;select1&quot; /> </li></ul>
  57. 57. Trinidad <ul><li>Aufruf von JavaScript vom Server... </li></ul><ul><li>ExternalRenderKitService.addScript(): </li></ul><ul><li>public String doTheWork() </li></ul><ul><li>{ </li></ul><ul><li>... </li></ul><ul><li>FacesContext context = FacesContext.getCurrentInstance(); </li></ul><ul><li>ExtendedRenderKitService erks = </li></ul><ul><li>Service.getRenderKitService(context, </li></ul><ul><li>ExtendedRenderKitService.class); </li></ul><ul><li>erks.addScript(context, </li></ul><ul><li>&quot;hello();&quot;);  JS-function </li></ul><ul><li>return (&quot;success&quot;); </li></ul><ul><li>} </li></ul>
  58. 58. Trinidad <ul><li>Client-side API </li></ul><ul><ul><li>Senden von PPR request </li></ul></ul><ul><ul><ul><li>TrPage.sendPartialFormPost(...) </li></ul></ul></ul><ul><ul><li>Senden von Ajax request </li></ul></ul><ul><ul><ul><li>TrRequestQueue.sendRequest(...) </li></ul></ul></ul><ul><li>Monitoring von PPR/Ajax Requests </li></ul><ul><ul><li>StatusIndicator component </li></ul></ul><ul><ul><li>JS API </li></ul></ul>
  59. 59. Trinidad: Monitoring PPR <ul><li>function addListener() </li></ul><ul><li>{ </li></ul><ul><li>var requestQueue = TrPage.getInstance().getRequestQueue(); </li></ul><ul><li>requestQueue.addStateChangeListener(myCallback); </li></ul><ul><li>} </li></ul><ul><li>function myCallback(state) </li></ul><ul><li>{ </li></ul><ul><li>var busy = state == TrRequestQueue.STATE_BUSY; </li></ul><ul><li>var div = document.getElementById(&quot;load&quot;); </li></ul><ul><li>div.style.display = busy ? &quot;inline&quot; : &quot;none&quot;; </li></ul><ul><li>} </li></ul><ul><li>In XHTML: </li></ul><ul><li><tr:commandLink onclick=&quot;addListener(); &quot; ...> </li></ul>
  60. 60. Trinidad <ul><li>Dialog Framework </li></ul><ul><ul><li>„ new Window“ oder lightweight Dialogs... </li></ul></ul><ul><ul><li>Navigation rules innerhalb des Dialog </li></ul></ul><ul><ul><li><tr:commandLink text=&quot;Google Maps&quot; useWindow=&quot;true&quot; action=&quot;dialog:map&quot; returnListener=&quot;#{bean.returnListener}&quot; /> </li></ul></ul><ul><li>CSS Skinning </li></ul><ul><ul><li>Erstellen von trinidad-skins.xml </li></ul></ul><ul><ul><li>„ skin-family“ in trinidad-config.xml eintragen </li></ul></ul><ul><ul><li>Programmieren einer CSS Datei </li></ul></ul>
  61. 61. Trinidad <ul><li>CSS Skinning : </li></ul><ul><li>.AFRequiredIconStyle { </li></ul><ul><li>color: #CC0000; </li></ul><ul><li>-tr-rule-ref: selector(&quot;.AFDefaultFont:alias&quot;); </li></ul><ul><li>} </li></ul><ul><li>af|inputDate::launch-icon </li></ul><ul><li>{ </li></ul><ul><li>content: url(/images/calendar_icon.gif); </li></ul><ul><li>} </li></ul>
  62. 62. Orchestra - ViewController <ul><li>Drei Möglichkeiten </li></ul><ul><ul><li>Reflection (initView(),...) </li></ul></ul><ul><ul><li>Interface (Implementieren von ViewController ) </li></ul></ul><ul><ul><li>Annotations (@ViewController, @InitView,...) </li></ul></ul><ul><li>„ Multi-ViewController“ </li></ul><ul><ul><li>@ViewController(viewIds={&quot;/all.xhtml&quot;, ...) </li></ul></ul>
  63. 63. Orchestra - ViewController <ul><li>Orchestra ViewController </li></ul><ul><li>@ConversationRequire( </li></ul><ul><li>conversationNames = &quot;editor&quot;, </li></ul><ul><li>entryPointViewIds = {&quot;/all.xhtml&quot;}, </li></ul><ul><li>redirect=&quot;/all.xhtml&quot;) </li></ul><ul><li>@ViewController(viewIds={&quot;/edit1.xhtml&quot;, &quot;/edit2.xhtml&quot;}) </li></ul><ul><li>public class Editor ... </li></ul><ul><li>{ </li></ul><ul><li>... </li></ul><ul><li>@PreRenderView public void loader() </li></ul><ul><li>{ </li></ul><ul><li>... </li></ul><ul><li>} </li></ul><ul><li>... </li></ul><ul><li>} </li></ul>
  64. 64. Orchestra - Scope <ul><li>Manuel-Scope </li></ul><ul><li><bean id=&quot; googleMapBean &quot; class=&quot;net.wessendorf.faces.starter.view.controller.GoogleMapBean&quot; scope=&quot;conversation.manual&quot; </li></ul><ul><li>orchestra:conversationName=&quot; googleMap &quot; </li></ul><ul><li>p:userService-ref=&quot;userServiceImpl&quot;> </li></ul><ul><li><aop:scoped-proxy /> </li></ul><ul><li></bean> </li></ul><ul><li>Beenden der Konversation </li></ul><ul><li>Conversation currentConv = ConversationManager.getInstance().getConversation(&quot; googleMap &quot;); </li></ul><ul><li>currentConv.invalidate(); </li></ul>
  65. 65. Orchestra - Scopes <ul><li>ConversationBindingListener Interface </li></ul><ul><ul><li>valueBound() </li></ul></ul><ul><ul><li>valueUnbound() </li></ul></ul><ul><li>Gilt für beide Scope‘s </li></ul><ul><ul><li>Flash </li></ul></ul><ul><ul><li>manual </li></ul></ul><ul><li>Conversation hat „timeout“ </li></ul><ul><ul><li>30 Minuten </li></ul></ul>
  66. 66. Ausblick <ul><li>JBoss Seam, „a Java EE framework“ </li></ul><ul><ul><li>JSF </li></ul></ul><ul><ul><li>EJB 3 </li></ul></ul><ul><li>Basis für „Web Beans“ (JSR 299) </li></ul><ul><ul><li>Dependency-Injection... </li></ul></ul><ul><ul><li>Google Guice </li></ul></ul><ul><li>Ein (web) Framework für Java EE </li></ul><ul><li>JavaServer Faces 2.0 </li></ul><ul><ul><li>Bessere Integration für Komponenten </li></ul></ul><ul><ul><ul><li>Ajax-Layer ? </li></ul></ul></ul><ul><ul><li>Aufnahme von guten Ideen </li></ul></ul><ul><ul><ul><li>Facelets </li></ul></ul></ul><ul><ul><ul><li>Trinidad </li></ul></ul></ul><ul><ul><ul><li>... </li></ul></ul></ul><ul><li>„ Modern Web Frameworks“ ... ? </li></ul>
  67. 67. Dokumentation <ul><li>http://myfaces.apache.org </li></ul><ul><li>http://myfaces.apache.org/trinidad </li></ul><ul><li>http://springframework.org </li></ul><ul><li>https://facelets.dev.jav.net </li></ul><ul><li>Schulung / Support: </li></ul><ul><ul><li>Irian (http://www.irian.at) </li></ul></ul><ul><ul><li>MyFaces User / Dev List </li></ul></ul><ul><li>Slides  http://slideshare.net/mwessendorf/ </li></ul><ul><li>Demo-Anwendung: </li></ul><ul><ul><li>http://code.google.com/p/facesgoodies/ </li></ul></ul>
  68. 68. <ul><li>Frage ? </li></ul><ul><li>Danke ! </li></ul>

×