AdvancedJSF

100 %
0 %
Information about AdvancedJSF

Published on November 6, 2007

Author: mwessendorf

Source: slideshare.net

Advanced JavaServer Faces Matthias Weßendorf | matzew@apache.org

Matthias Weßendorf Oracle Corp. ADFv team (ADF Faces) Apache Software Foundation Apache MyFaces (Trinidad | Core) Apache Shale Autor Java- & Eclipse-Magazin Bücher zu Struts, J2ME&WebServices Speaker Oracle Open World JavaOne JAX, W-JAX ApacheCon

Oracle Corp.

ADFv team (ADF Faces)

Apache Software Foundation

Apache MyFaces (Trinidad | Core)

Apache Shale

Autor

Java- & Eclipse-Magazin

Bücher zu Struts, J2ME&WebServices

Speaker

Oracle Open World

JavaOne

JAX, W-JAX

ApacheCon

Advanced JSF - ToC JSF – Hintergrund JSF – Überblick JSF - Frameworks Die Framework Auswahl Framework Details Integration Code-Beispiele

JSF – Hintergrund

JSF – Überblick JSF - Frameworks

Die Framework Auswahl

Framework Details

Integration

Code-Beispiele

JSF – Background Zum Anfgang mit Servlets ... ... und JSPs ... ... und „Model 2“ Web frameworks Apache Struts Action-basiert ... und JSTL! Viele „Model 2“ Frameworks ... (fast) kein Komponenten-Ansatz (UI Framework) UI Tags mit JSTL JavaServer Faces Ein Standard für Java Web Apps

Zum Anfgang mit Servlets ...

... und JSPs ...

... und „Model 2“ Web frameworks

Apache Struts

Action-basiert

... und JSTL!

Viele „Model 2“ Frameworks ...

(fast) kein Komponenten-Ansatz (UI Framework)

UI Tags mit JSTL

JavaServer Faces

Ein Standard für Java Web Apps

JSF – Details Java Standard des JCP Leichtgewichtiges Web-Framework API für UI Komponenten Spezifikationen: JSR 127  JSF 1.1 (Mai 2004) JSR 252  JSF 1.2 [Java EE 5] (Mai 2006) JSR 314  JSF 2.0 [Java EE 6] (2008 ?) Ziele Vereinfachte Java-Web-Entwicklung Tooling (Jdev, Sun / Netbeans, Eclipse, ...) Implementierungen Apache MyFaces RI (Sun)

Java Standard des JCP

Leichtgewichtiges Web-Framework

API für UI Komponenten

Spezifikationen:

JSR 127  JSF 1.1 (Mai 2004)

JSR 252  JSF 1.2 [Java EE 5] (Mai 2006)

JSR 314  JSF 2.0 [Java EE 6] (2008 ?)

Ziele

Vereinfachte Java-Web-Entwicklung

Tooling (Jdev, Sun / Netbeans, Eclipse, ...)

Implementierungen

Apache MyFaces

RI (Sun)

JSF –Frameworks Echt ? Ein Standard ? JA ! ! ! Aber... Viele Optionen: View-Layer (JSP, Facelets, Shale-Clay, Tiles, ...) Dialog (Spring, Shale, Oracle ADFc) JSF-Frameworks (Seam / Web Beans) Custom JSF Lifecycle... (Mabon, ADF Faces) Komponenten (many, many ...)

Echt ? Ein Standard ?

JA ! ! !

Aber...

Viele Optionen:

View-Layer (JSP, Facelets, Shale-Clay, Tiles, ...)

Dialog (Spring, Shale, Oracle ADFc)

JSF-Frameworks (Seam / Web Beans)

Custom JSF Lifecycle... (Mabon, ADF Faces)

Komponenten (many, many ...)

Frameworks... Apache MyFaces Tomahawk 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 

Apache MyFaces Tomahawk

Houston, we have a problem !

JSF Frameworks Was man wirklich braucht : JSF – Runtime: Apache MyFaces Sun RI View-Layer: JSP / JSPX (default) Facelets Apache Shale Clay Komponenten: Standard Komponenten Sehr einfache Komponenten Oft braucht man mehr...

Was man wirklich braucht :

JSF – Runtime:

Apache MyFaces

Sun RI

View-Layer:

JSP / JSPX (default)

Facelets

Apache Shale Clay

Komponenten:

Standard Komponenten

Sehr einfache Komponenten

Oft braucht man mehr...

Frameworks Mehr nicht ? Für „VIEW“, ja... Was braucht der Business-Layer ? EJB 2.x EJB 3.x Spring Spring + JPA ORM (Toplink, Hibernate) JDBC / Spring + JDBC Datenbank...

Mehr nicht ?

Für „VIEW“, ja...

Was braucht der Business-Layer ?

EJB 2.x

EJB 3.x

Spring

Spring + JPA

ORM (Toplink, Hibernate)

JDBC / Spring + JDBC

Datenbank...

Frameworks Die Auswahl: Apache MyFaces (runtime) Facelets (view-layer) Trinidad (JSF-Komponenten Bibliothek) The mother of PPR  Spring + JPA + Derby/HSQL JPA = Java Persistence API: Apache OpenJPA Oracle‘s Toplink (Eclipse Link) Apache Cayenne ... MyFaces Orchestra (ViewController + conversation scope)

Die Auswahl:

Apache MyFaces (runtime)

Facelets (view-layer)

Trinidad (JSF-Komponenten Bibliothek)

The mother of PPR 

Spring + JPA + Derby/HSQL

JPA = Java Persistence API:

Apache OpenJPA

Oracle‘s Toplink (Eclipse Link)

Apache Cayenne

...

MyFaces Orchestra (ViewController + conversation scope)

Die Architektur JSF View DAO / Repository JSF Bean Service Spring Beans Java Persistence API Oracle 11g View Controller XHTML Seiten Faces Apache MyFaces Orchestra

Details der Frameworks

Apache MyFaces Erste OpenSource JSF Implementierung Bietet JSF 1.1 und JSF 1.2 (in 2007) Notes on the TCK ... Seit 2005 ein Apache Projekt Vorher: LGPL / Sourceforge Größte JSF „user community“ Viele Unterprojekte Tobago Tomahawk Trinidad Orchestra Fortsetzung folgt 

Erste OpenSource JSF Implementierung

Bietet JSF 1.1 und JSF 1.2 (in 2007)

Notes on the TCK ...

Seit 2005 ein Apache Projekt

Vorher: LGPL / Sourceforge

Größte JSF „user community“

Viele Unterprojekte

Tobago

Tomahawk

Trinidad

Orchestra

Fortsetzung folgt 

Facelets Alternative JSF-View-Technik JSP(X) ist „old school“ Leichtgewichtiges Templating Framwork XHTML-basierte Templates Designer-freundlich DEMO... Performance JSF 1.2 auch ohne JavaEE 5 Container Einfache Komponenten Entwicklung! JavaServer Faces - Version 2.x DEMO... Similar to Tapestry...

Alternative JSF-View-Technik

JSP(X) ist „old school“

Leichtgewichtiges Templating Framwork

XHTML-basierte Templates

Designer-freundlich

DEMO...

Performance

JSF 1.2 auch ohne JavaEE 5 Container

Einfache Komponenten Entwicklung!

JavaServer Faces - Version 2.x

DEMO...

Similar to Tapestry...

Facelets Hinzufügen des ViewHandler Mit Trinidad/IceFaces => web.xml Im Standard, Tomahawk, ... => faces-cfg Hinzufügen der JARs Unified EL (javax.el) => el-api, el-imp facelets.jar Benötigt Java 5

Hinzufügen des ViewHandler

Mit Trinidad/IceFaces => web.xml

Im Standard, Tomahawk, ... => faces-cfg

Hinzufügen der JARs

Unified EL (javax.el) => el-api, el-imp

facelets.jar

Benötigt Java 5

Einfaches Facelet <!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;> <html xmlns=&quot;http://www.w3.org/1999/xhtml xmlns:h=&quot;http://java.sun.com/jsf/html &quot;> <body> <input type=&quot;text&quot; jsfc=&quot; h:inputText „ value=&quot;#{bean.property}&quot; /> </body> </html>

<!DOCTYPE html PUBLIC &quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot; &quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;>

<html

xmlns=&quot;http://www.w3.org/1999/xhtml

xmlns:h=&quot;http://java.sun.com/jsf/html &quot;>

<body> <input type=&quot;text&quot; jsfc=&quot; h:inputText „ value=&quot;#{bean.property}&quot; />

</body>

</html>

Shale – Clay-Plugin Temaplating Framework für JSF Alternative zu Facelets und JSP(X) gewöhnliche HTML Datei als Template Tiles-ähnlicher als Facelets Mehr XML files, als Facelets Configuration overhead ?! web.xml 3 Context-param Einträge clay-config.xml Für Clay Komponenten clay-views-config.xmk Seiten, die auf der/den Komponenten basieren

Temaplating Framework für JSF

Alternative zu Facelets und JSP(X)

gewöhnliche HTML Datei als Template

Tiles-ähnlicher als Facelets

Mehr XML files, als Facelets

Configuration overhead ?!

web.xml

3 Context-param Einträge

clay-config.xml

Für Clay Komponenten

clay-views-config.xmk

Seiten, die auf der/den Komponenten basieren

Apache MyFaces Trinidad Unterprojekt von Apache MyFaces Über 100 JSF Komponenten Verschiedene Framework „goodies“ Test-Framework Maven Plugins Skinning (CSS basiert) (DEMO) Dialog-Support (DEMO) Ajax-API (DEMO) Client-seitig (JavaScript) Server-seitig (Java) Stabile JSF Komponenten Bibliothek JSF 1.1 und 1.2 Unterstützung „ Spende“ von Oracle (2006) (ADF Faces)

Unterprojekt von Apache MyFaces

Über 100 JSF Komponenten

Verschiedene Framework „goodies“

Test-Framework

Maven Plugins

Skinning (CSS basiert) (DEMO)

Dialog-Support (DEMO)

Ajax-API (DEMO)

Client-seitig (JavaScript)

Server-seitig (Java)

Stabile JSF Komponenten Bibliothek

JSF 1.1 und 1.2 Unterstützung

„ Spende“ von Oracle (2006) (ADF Faces)

Apache MyFaces Trinidad Demonstration von verschiedenen JSF Komponenten Trinidad Demo online: http://www.irian.at

Demonstration von verschiedenen JSF Komponenten

Trinidad Demo online:

http://www.irian.at

Spring Framework Bekanntes OpenSource Framework Apache 2.0 License „ Hilfe“ für Java EE (J2EE) Macht EJB / J2EE einfacher! POJOs sind „first class citizens“ Hat Java EE 5 bereichert Viele „goodies“ (AOP, Transaction, DI, JDBC, ...) Integration für etliche Frameworks und Techniken JSF, Struts, EJB, Hibernate, AspectJ,...

Bekanntes OpenSource Framework

Apache 2.0 License

„ Hilfe“ für Java EE (J2EE)

Macht EJB / J2EE einfacher!

POJOs sind „first class citizens“

Hat Java EE 5 bereichert

Viele „goodies“ (AOP, Transaction, DI, JDBC, ...)

Integration für etliche Frameworks und Techniken

JSF, Struts, EJB, Hibernate, AspectJ,...

Java Persistence API Standard für Java Persistenz Wichtiger Teil der EJB3 Spec. (JSR 220) Nutzung auch ohne EJB-Container möglich RI => Toplink Essentials (Glassfish) Lessons learned (Toplink, Hibernate, JDO) Vereinfacht EJB (2.x und 1.x) Java5 Annotations (oder XML...) ORM-Frameworks (mit JPA Support): Eclipse Link (Oracle Toplink) Hibernate (JBoss) OpenJPA & Cayenne (Apache)

Standard für Java Persistenz

Wichtiger Teil der EJB3 Spec. (JSR 220)

Nutzung auch ohne EJB-Container möglich

RI => Toplink Essentials (Glassfish)

Lessons learned (Toplink, Hibernate, JDO)

Vereinfacht EJB (2.x und 1.x)

Java5 Annotations (oder XML...)

ORM-Frameworks (mit JPA Support):

Eclipse Link (Oracle Toplink)

Hibernate (JBoss)

OpenJPA & Cayenne (Apache)

Java Persistence API @Entity public class Customer { @Id @GeneratedValue (strategy= GenerationType. AUTO ) private Long id ;

@Entity

public class Customer

{

@Id

@GeneratedValue (strategy= GenerationType. AUTO )

private Long id ;

Java Persistence API @Temporal (value = TemporalType. DATE ) private Date birthday ; @OneToOne (cascade= CascadeType. ALL ) private Address address ;

@Temporal (value = TemporalType. DATE ) private Date birthday ;

@OneToOne (cascade= CascadeType. ALL ) private Address address ;

Spring und JPA Nutzung von JPA ohne EJB-Container JPA-Nutzung als ORM-Framework Support für folgende JPA Implementierungen: JPA-Vendor-Adapter Hibernate OpenJPA (Apache) Toplink JPA Template Nur für die Migration zu JPA angedacht! Direkte Benutzung des PersistenceContext AbstractEntityManagerFactoryBean

Nutzung von JPA ohne EJB-Container

JPA-Nutzung als ORM-Framework

Support für folgende JPA Implementierungen:

JPA-Vendor-Adapter

Hibernate

OpenJPA (Apache)

Toplink

JPA Template

Nur für die Migration zu JPA angedacht!

Direkte Benutzung des PersistenceContext

AbstractEntityManagerFactoryBean

Spring und JPA EntityManagerFactory in Spring-Context Konfiguration als JNDI / Spring-Bean Transaktionen-Support JPA-TransactionManager JTA-TransactionManager DAO / Repositroy Implementierung des Interfaces kennt JPA @PersistenceUnit @PersistenceContext Einheitliches Exception-Handling Spring‘s DataAccessException @Repository

EntityManagerFactory in Spring-Context

Konfiguration als JNDI / Spring-Bean

Transaktionen-Support

JPA-TransactionManager

JTA-TransactionManager

DAO / Repositroy

Implementierung des Interfaces kennt JPA

@PersistenceUnit

@PersistenceContext

Einheitliches Exception-Handling

Spring‘s DataAccessException

@Repository

Spring und JPA (Config) <bean id=&quot;entityManagerFactory&quot; class=&quot; org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean &quot; p:dataSource-ref=&quot;dataSource&quot; p:persistenceUnitName=&quot;kickstart&quot; > <property name=&quot;jpaVendorAdapter&quot;> <bean class=&quot;org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter&quot;> <property name=&quot;showSql&quot; value=&quot;true&quot;/> <property name=&quot;generateDdl&quot; value=&quot;true&quot;/> </bean> </property> <!– Kopie von OPENJPA-40 --> <property name=&quot;loadTimeWeaver&quot;> <bean class=&quot;net.wessendorf.wjax.openjpa.OpenJpaLoadTimeWeaver&quot;/> </property> </bean>

<bean id=&quot;entityManagerFactory&quot; class=&quot; org.springframework.orm.jpa.LocalContainerEntityManagerFactoryBean &quot;

p:dataSource-ref=&quot;dataSource&quot;

p:persistenceUnitName=&quot;kickstart&quot; >

<property name=&quot;jpaVendorAdapter&quot;>

<bean class=&quot;org.springframework.orm.jpa.vendor.OpenJpaVendorAdapter&quot;>

<property name=&quot;showSql&quot; value=&quot;true&quot;/>

<property name=&quot;generateDdl&quot; value=&quot;true&quot;/>

</bean>

</property>

<!– Kopie von OPENJPA-40 -->

<property name=&quot;loadTimeWeaver&quot;>

<bean class=&quot;net.wessendorf.wjax.openjpa.OpenJpaLoadTimeWeaver&quot;/>

</property>

</bean>

Spring und JPA (Config) <bean id=&quot;transactionManager&quot; class=&quot;org.springframework.orm.jpa.JpaTransactionManager&quot; p:entityManagerFactory-ref=&quot;entityManagerFactory&quot; /> <bean class=„ org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor &quot;/> <bean class=„ org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor &quot;/>

<bean id=&quot;transactionManager&quot; class=&quot;org.springframework.orm.jpa.JpaTransactionManager&quot;

p:entityManagerFactory-ref=&quot;entityManagerFactory&quot;

/>

<bean class=„

org.springframework.dao.annotation.PersistenceExceptionTranslationPostProcessor

&quot;/>

<bean class=„

org.springframework.orm.jpa.support.PersistenceAnnotationBeanPostProcessor

&quot;/>

Spring und JPA (DAO) @Repository @Transactional (propagation = Propagation. SUPPORTS ) public class JpaCustomerDaoImpl implements CustomerDao { private final String QUERY_ALL = &quot;select c from Customer c&quot; ; private final String QUERY_BY_SECONDNAME = &quot;select c from Customer c where c.secondname LIKE :param&quot; ; private EntityManager em ; @PersistenceContext public void setEntityManager(EntityManager entityManager) { this . em = entityManager; } ...

@Repository

@Transactional (propagation = Propagation. SUPPORTS )

public class JpaCustomerDaoImpl implements CustomerDao

{

private final String QUERY_ALL = &quot;select c from Customer c&quot; ;

private final String QUERY_BY_SECONDNAME = &quot;select c from Customer c where c.secondname LIKE :param&quot; ;

private EntityManager em ;

@PersistenceContext

public void setEntityManager(EntityManager entityManager)

{

this . em = entityManager;

}

...

Spring und JPA (DAO) public void remove(Customer customer) { Customer toDel = findById(customer.getId()); em .remove(toDel); } public List queryBySecondname(String name) { Query q = em .createQuery( QUERY_BY_SECONDNAME ); q.setParameter( &quot;param&quot; , name+ &quot;%&quot; ); return q.getResultList(); }

public void remove(Customer customer)

{

Customer toDel = findById(customer.getId());

em .remove(toDel);

}

public List queryBySecondname(String name)

{

Query q = em .createQuery( QUERY_BY_SECONDNAME );

q.setParameter( &quot;param&quot; , name+ &quot;%&quot; );

return q.getResultList();

}

Services mit Spring Implementieren Geschäftslogik Interface Implementierung Greifen auf DAO / Repository zu Bereitstellung von Transaktionsregeln Auf Methoden-Ebene Client kennt nur Service-Interfaces JSF-Managed-Bean

Implementieren Geschäftslogik

Interface

Implementierung

Greifen auf DAO / Repository zu

Bereitstellung von Transaktionsregeln

Auf Methoden-Ebene

Client kennt nur Service-Interfaces

JSF-Managed-Bean

Services mit Spring private CustomerDao customerDao ; public void setCustomerDao(CustomerDao customerDao) { this . customerDao = customerDao; } @Transactional(propagation = Propagation.REQUIRED) public void removeCustomer(Customer customer) { customerDao .remove(customer); }

private CustomerDao customerDao ;

public void setCustomerDao(CustomerDao customerDao)

{

this . customerDao = customerDao;

}

@Transactional(propagation = Propagation.REQUIRED)

public void removeCustomer(Customer customer)

{

customerDao .remove(customer);

}

Spring: Service und DAO Konfiguration: < bean class = „ com.sessions.myfaces.daos. JpaCustomerDaoImpl &quot; id = &quot; customerDao &quot; /> < bean class = „ com.sessions.myfaces.services. CustomerServiceImpl &quot; id = &quot;customerService„ p:customerDao-ref = &quot;customerDao&quot; />

Konfiguration:

< bean class = „

com.sessions.myfaces.daos. JpaCustomerDaoImpl &quot; id = &quot; customerDao &quot; />

< bean class = „

com.sessions.myfaces.services. CustomerServiceImpl &quot; id = &quot;customerService„

p:customerDao-ref = &quot;customerDao&quot; />

MyFaces Orchestra Einfaches Applikations State Management Conversation-Scope (dialog / wizard) Bessere Integration von View- und Persistenz Layer Conversation-Scope persistance contexts JSF-Extension MyFaces-IMPL unabhängig Kern unabhängig von JSF API... Kein anderes Framework (derzeit!) JSF‘s „Managed Bean Facility“ ersetzt durch Spring‘s IoC Container Mit Spring 2.0 ViewController

Einfaches Applikations State Management

Conversation-Scope (dialog / wizard)

Bessere Integration von View- und Persistenz Layer

Conversation-Scope persistance contexts

JSF-Extension

MyFaces-IMPL unabhängig

Kern unabhängig von JSF API...

Kein anderes Framework (derzeit!)

JSF‘s „Managed Bean Facility“ ersetzt durch Spring‘s IoC Container

Mit Spring 2.0

ViewController

Session Application Conversation Flash Request Conversation Scopes

Conversation-Scope persistance contexts

Gewöhnliches Muster Bean name ähnlich wie View-Id (JSF) form.xhtml  form users/form.xhtml  usersForm Services initView (nach RESTORE_VIEW ) preProcess (vor INVOKE_APPLICATION ) preRender (vor PRE_RENDER ) Orchestra bietet Annotations Ebenfalls bekannt in: JDeveloper + ADFc Apache Shale ViewController

Gewöhnliches Muster

Bean name ähnlich wie View-Id (JSF)

form.xhtml  form

users/form.xhtml  usersForm

Services

initView (nach RESTORE_VIEW )

preProcess (vor INVOKE_APPLICATION )

preRender (vor PRE_RENDER )

Orchestra bietet Annotations

Ebenfalls bekannt in:

JDeveloper + ADFc

Apache Shale

Team-Bildung!

Generale Konfiguration Verschiedene XML Dateien... Servlet Container (web.xml) Alle Frameworks... Faces (faces-config.xml) Spring XML Datei(en) Trinidad: trinidad-config.xml trinidad-skin.xml Facelets: (custom) taglib...

Verschiedene XML Dateien...

Servlet Container (web.xml)

Alle Frameworks...

Faces (faces-config.xml)

Spring XML Datei(en)

Trinidad:

trinidad-config.xml

trinidad-skin.xml

Facelets:

(custom) taglib...

Wichtige Konfiguration JSF FacesServlet (web.xml) Facelets ViewHandler (web.xml wg. Trinidad) javax.faces.DEFAULT_SUFFIX (web.xml) Trinidad RenderKit (faces-config.xml) TrinidadFilter (web.xml) ResourceServlet (web.xml) Orchestra Verschiedene Dinge (spring-xml(s) & web.xml) Spring RequestContextListener (web.xml) ContextLoaderListener (web.xml) DelegatingVariableResolver (faces-config.xml)

JSF

FacesServlet (web.xml)

Facelets

ViewHandler (web.xml wg. Trinidad)

javax.faces.DEFAULT_SUFFIX (web.xml)

Trinidad

RenderKit (faces-config.xml)

TrinidadFilter (web.xml)

ResourceServlet (web.xml)

Orchestra

Verschiedene Dinge (spring-xml(s) & web.xml)

Spring

RequestContextListener (web.xml)

ContextLoaderListener (web.xml)

DelegatingVariableResolver (faces-config.xml)

JSF Managed Bean‘s Nutzung von Spring 2 Bietet Scopes (request / session) Konfiguration: < faces-config > < application > < variable-resolver > org.springframework.web.jsf.DelegatingVariableResolver </ variable-resolver > </ application > ...

Nutzung von Spring 2

Bietet Scopes (request / session)

Konfiguration:

< faces-config >

< application >

< variable-resolver >

org.springframework.web.jsf.DelegatingVariableResolver

</ variable-resolver >

</ application >

...

JSF Managed Bean‘s Einfache Bean Klasse: public class FooController { private CustomerService customerService ; public CustomerService getCustomerService() { return customerService ; } public void setCustomerService(CustomerService customerService) { this . customerService = customerService; } ... }

Einfache Bean Klasse:

public class FooController

{

private CustomerService customerService ;

public CustomerService getCustomerService()

{

return customerService ;

}

public void setCustomerService(CustomerService customerService)

{

this . customerService = customerService;

}

...

}

JSF Managed Bean‘s Konfiguration (in Spring !): Spring hat viele Feature... Für Orchestra ein MUSS! Keine Beans in faces-config.xml < bean id = &quot;create„ class = „....FooController„ scope = &quot;request&quot; p:userService-ref = &quot; userServiceImpl “ / >

Konfiguration (in Spring !):

Spring hat viele Feature...

Für Orchestra ein MUSS!

Keine Beans in faces-config.xml

< bean

id = &quot;create„ class = „....FooController„ scope = &quot;request&quot;

p:userService-ref = &quot; userServiceImpl “ / >

Faces Servlet Mapping http://server:8080/app/page.faces Mit Facelets „ Open Source“ http://server:8080/app/page.xhtml Servlet-Mapping: < servlet-mapping > < servlet-name > faces </ servlet-name > < url-pattern > *.xhtml </ url-pattern > </ servlet-mapping > http://server:8080/app/page.xhtml

http://server:8080/app/page.faces

Mit Facelets

„ Open Source“

http://server:8080/app/page.xhtml

Servlet-Mapping:

< servlet-mapping >

< servlet-name > faces </ servlet-name >

< url-pattern > *.xhtml </ url-pattern >

</ servlet-mapping >

http://server:8080/app/page.xhtml

Let‘s code! Praktische Anwendung der verschiedenen Frameworks

Praktische Anwendung der verschiedenen Frameworks

Facelets Template Engine, XHTML basiert Layout mit CSS Bestimmen von Bereichen (content, footer, ...) <tr:document xmlns:ui=&quot;http://java.sun.com/jsf/facelets&quot; xmlns:tr=&quot;http://myfaces.apache.org/trinidad&quot; ...> ... <div class=„content&quot;> <ui:insert name=&quot;content&quot;>My default Content</ui:insert> </div> ...</tr:document>

Template Engine, XHTML basiert

Layout mit CSS

Bestimmen von Bereichen

(content, footer, ...)

<tr:document

xmlns:ui=&quot;http://java.sun.com/jsf/facelets&quot;

xmlns:tr=&quot;http://myfaces.apache.org/trinidad&quot;

...>

...

<div class=„content&quot;>

<ui:insert name=&quot;content&quot;>My default Content</ui:insert>

</div>

...</tr:document>

Facelets Template Client Gewöhnliche Webseite <ui:composition xmlns=&quot;http://www.w3.org/1999/xhtml&quot; xmlns:tr=&quot;http://myfaces.apache.org/trinidad&quot; xmlns:mw=&quot;http://wessendorf.net/kickstart&quot; ... template=&quot;WEB-INF/facelets/layout/template.xhtml&quot; > <!-- content --> <ui:define name=&quot;content&quot;> Mein JSF-Content !!! </ui:define> </ui:composition>

Template Client

Gewöhnliche Webseite

<ui:composition xmlns=&quot;http://www.w3.org/1999/xhtml&quot;

xmlns:tr=&quot;http://myfaces.apache.org/trinidad&quot;

xmlns:mw=&quot;http://wessendorf.net/kickstart&quot;

...

template=&quot;WEB-INF/facelets/layout/template.xhtml&quot; >

<!-- content -->

<ui:define name=&quot;content&quot;>

Mein JSF-Content !!!

</ui:define>

</ui:composition>

Facelets JSF ist nicht „DRY“ ? <h:dataTable ...> ... <h:colum> <f:facet name=„header“> <h:outputText value=„Name“ /> </f:facet> <h:outputText value=„#{bean.name}“ /> </column> ... <h:colum> <f:facet name=„header“> <h:outputText value=„some other value“ /> </f:facet> <h:outputText value=„#{bean.foo}“ /> </column> ... </h:dataTable>

JSF ist nicht „DRY“ ?

<h:dataTable ...>

...

<h:colum>

<f:facet name=„header“>

<h:outputText value=„Name“ />

</f:facet>

<h:outputText value=„#{bean.name}“ />

</column>

...

<h:colum>

<f:facet name=„header“>

<h:outputText value=„some other value“ />

</f:facet>

<h:outputText value=„#{bean.foo}“ />

</column>

...

</h:dataTable>

Facelets Das wäre doch nett ! <h:dataTable ...> ... <x:smartColumn header=„Name“ value=„#{bean.name}“/> <x:smartColumn header=„ some other value“ value=„#{bean.foo}“/> ... </h:dataTable ... aber...

Das wäre doch nett !

<h:dataTable ...>

...

<x:smartColumn header=„Name“ value=„#{bean.name}“/>

<x:smartColumn header=„ some other value“ value=„#{bean.foo}“/>

...

</h:dataTable

... aber...

Facelets Komponenten-Entwicklung aufwändig Java: UIComponent (JavaBean) Renderer (Erzeugt das HTML) Tag-Klasse (Verbindet Comp. mit Renderer) XML Faces-config.xml (Registrieren von Type) TLD Datei (Registrieren des Tags)

Komponenten-Entwicklung aufwändig

Java:

UIComponent (JavaBean)

Renderer (Erzeugt das HTML)

Tag-Klasse (Verbindet Comp. mit Renderer)

XML

Faces-config.xml (Registrieren von Type)

TLD Datei (Registrieren des Tags)

Facelets Mit Facelets... einfache Entwicklung von Komponenten „ Rendering“ via XHTML Datei Kein! Java-Code notwendig Lediglich: XHTML Datei Facelet‘s Taglib XML Datei Taglib in web.xml registrieren

Mit Facelets...

einfache Entwicklung von Komponenten

„ Rendering“ via XHTML Datei

Kein! Java-Code notwendig

Lediglich:

XHTML Datei

Facelet‘s Taglib XML Datei

Taglib in web.xml registrieren

Facelets Meine JSF Komponente: <tr:column xmlns:ui=&quot;http://java.sun.com/jsf/facelets&quot; xmlns:f=&quot;http://java.sun.com/jsf/core&quot; xmlns:tr=&quot;http://myfaces.apache.org/trinidad &quot;> <f:facet name=&quot;header&quot;> <tr:outputText value=&quot;#{header}&quot; /> </f:facet> <tr:outputText value=&quot;#{value}&quot; /> </tr:column>

Meine JSF Komponente:

<tr:column

xmlns:ui=&quot;http://java.sun.com/jsf/facelets&quot;

xmlns:f=&quot;http://java.sun.com/jsf/core&quot;

xmlns:tr=&quot;http://myfaces.apache.org/trinidad &quot;>

<f:facet name=&quot;header&quot;>

<tr:outputText value=&quot;#{header}&quot; />

</f:facet>

<tr:outputText value=&quot;#{value}&quot; />

</tr:column>

Facelets Die Taglib.xml: <facelet-taglib> <namespace>http://corp.com/smart</namespace> <tag> <tag-name>smartColumn</tag-name> <source>facelets/components/column.xhtml</source> </tag> </facelet-taglib> Registration in web.xml: <context-param> <param-name>facelets.LIBRARIES</param-name> <param-value>/WEB-INF/mw.taglib.xml</param-value> </context-param>

Die Taglib.xml:

<facelet-taglib>

<namespace>http://corp.com/smart</namespace>

<tag>

<tag-name>smartColumn</tag-name>

<source>facelets/components/column.xhtml</source>

</tag>

</facelet-taglib>

Registration in web.xml:

<context-param>

<param-name>facelets.LIBRARIES</param-name>

<param-value>/WEB-INF/mw.taglib.xml</param-value>

</context-param>

Facelets Benutzung: Namespace hinzufügen: <tr:document xmlns:ui=&quot;http://java.sun.com/jsf/facelets&quot; xmlns:x=&quot; http://corp.com/smart&quot; xmlns:f=&quot;http://java.sun.com/jsf/core&quot;> Nutzung in XHTML-Datei: <x:smartColumn header=„Name“ value=„#{bean.name}“/>

Benutzung:

Namespace hinzufügen:

<tr:document

xmlns:ui=&quot;http://java.sun.com/jsf/facelets&quot;

xmlns:x=&quot; http://corp.com/smart&quot;

xmlns:f=&quot;http://java.sun.com/jsf/core&quot;>

Nutzung in XHTML-Datei:

<x:smartColumn header=„Name“ value=„#{bean.name}“/>

Trinidad Bietet Ajax (aka PPR) Erstellt „vor“ Ajax... XHR + IFrame (für Uploads) Komponenten beinhalten Ajax: autoSubmit partialSubmit partialTriggers Ajax-API server client Dialog-Framework CSS Skinning

Bietet Ajax (aka PPR)

Erstellt „vor“ Ajax...

XHR + IFrame (für Uploads)

Komponenten beinhalten Ajax:

autoSubmit

partialSubmit

partialTriggers

Ajax-API

server

client

Dialog-Framework

CSS Skinning

Trinidad PPR in Action <tr:selectOneRadio value=&quot;#{partialBean.selectOne}&quot; autoSubmit=&quot;true&quot; id=&quot;select1&quot; > <tr:selectItem label=&quot;First&quot; value=&quot;Beer&quot;/> <tr:selectItem label=&quot;Second&quot; value=&quot;more beer&quot;/> <tr:selectItem label=&quot;Third&quot; value=&quot;sold out!&quot;/> </tr:selectOneRadio> <tr:outputText value=&quot;#{partialBean.selectOne}&quot; partialTriggers=&quot;select1&quot; />

PPR in Action

<tr:selectOneRadio value=&quot;#{partialBean.selectOne}&quot; autoSubmit=&quot;true&quot; id=&quot;select1&quot; >

<tr:selectItem label=&quot;First&quot; value=&quot;Beer&quot;/>

<tr:selectItem label=&quot;Second&quot; value=&quot;more beer&quot;/>

<tr:selectItem label=&quot;Third&quot; value=&quot;sold out!&quot;/>

</tr:selectOneRadio>

<tr:outputText value=&quot;#{partialBean.selectOne}&quot;

partialTriggers=&quot;select1&quot; />

Trinidad Aufruf von JavaScript vom Server... ExternalRenderKitService.addScript(): public String doTheWork() { ... FacesContext context = FacesContext.getCurrentInstance(); ExtendedRenderKitService erks = Service.getRenderKitService(context, ExtendedRenderKitService.class); erks.addScript(context, &quot;hello();&quot;);  JS-function return (&quot;success&quot;); }

Aufruf von JavaScript vom Server...

ExternalRenderKitService.addScript():

public String doTheWork()

{

...

FacesContext context = FacesContext.getCurrentInstance();

ExtendedRenderKitService erks =

Service.getRenderKitService(context,

ExtendedRenderKitService.class);

erks.addScript(context,

&quot;hello();&quot;);  JS-function

return (&quot;success&quot;);

}

Trinidad Client-side API Senden von PPR request TrPage.sendPartialFormPost(...) Senden von Ajax request TrRequestQueue.sendRequest(...) Monitoring von PPR/Ajax Requests StatusIndicator component JS API

Client-side API

Senden von PPR request

TrPage.sendPartialFormPost(...)

Senden von Ajax request

TrRequestQueue.sendRequest(...)

Monitoring von PPR/Ajax Requests

StatusIndicator component

JS API

Trinidad: Monitoring PPR function addListener() { var requestQueue = TrPage.getInstance().getRequestQueue(); requestQueue.addStateChangeListener(myCallback); } function myCallback(state) { var busy = state == TrRequestQueue.STATE_BUSY; var div = document.getElementById(&quot;load&quot;); div.style.display = busy ? &quot;inline&quot; : &quot;none&quot;; } In XHTML: <tr:commandLink onclick=&quot;addListener(); &quot; ...>

function addListener()

{

var requestQueue = TrPage.getInstance().getRequestQueue();

requestQueue.addStateChangeListener(myCallback);

}

function myCallback(state)

{

var busy = state == TrRequestQueue.STATE_BUSY;

var div = document.getElementById(&quot;load&quot;);

div.style.display = busy ? &quot;inline&quot; : &quot;none&quot;;

}

In XHTML:

<tr:commandLink onclick=&quot;addListener(); &quot; ...>

Trinidad Dialog Framework „ new Window“ oder lightweight Dialogs... Navigation rules innerhalb des Dialog <tr:commandLink text=&quot;Google Maps&quot; useWindow=&quot;true&quot; action=&quot;dialog:map&quot; returnListener=&quot;#{bean.returnListener}&quot; /> CSS Skinning Erstellen von trinidad-skins.xml „ skin-family“ in trinidad-config.xml eintragen Programmieren einer CSS Datei

Dialog Framework

„ new Window“ oder lightweight Dialogs...

Navigation rules innerhalb des Dialog

<tr:commandLink text=&quot;Google Maps&quot; useWindow=&quot;true&quot; action=&quot;dialog:map&quot; returnListener=&quot;#{bean.returnListener}&quot; />

CSS Skinning

Erstellen von trinidad-skins.xml

„ skin-family“ in trinidad-config.xml eintragen

Programmieren einer CSS Datei

Trinidad CSS Skinning : .AFRequiredIconStyle { color: #CC0000; -tr-rule-ref: selector(&quot;.AFDefaultFont:alias&quot;); } af|inputDate::launch-icon { content: url(/images/calendar_icon.gif); }

CSS Skinning :

.AFRequiredIconStyle {

color: #CC0000;

-tr-rule-ref: selector(&quot;.AFDefaultFont:alias&quot;);

}

af|inputDate::launch-icon

{

content: url(/images/calendar_icon.gif);

}

Orchestra - ViewController Drei Möglichkeiten Reflection (initView(),...) Interface (Implementieren von ViewController ) Annotations (@ViewController, @InitView,...) „ Multi-ViewController“ @ViewController(viewIds={&quot;/all.xhtml&quot;, ...)

Drei Möglichkeiten

Reflection (initView(),...)

Interface (Implementieren von ViewController )

Annotations (@ViewController, @InitView,...)

„ Multi-ViewController“

@ViewController(viewIds={&quot;/all.xhtml&quot;, ...)

Orchestra - ViewController Orchestra ViewController @ConversationRequire( conversationNames = &quot;editor&quot;, entryPointViewIds = {&quot;/all.xhtml&quot;}, redirect=&quot;/all.xhtml&quot;) @ViewController(viewIds={&quot;/edit1.xhtml&quot;, &quot;/edit2.xhtml&quot;}) public class Editor ... { ... @PreRenderView public void loader() { ... } ... }

Orchestra ViewController

@ConversationRequire(

conversationNames = &quot;editor&quot;,

entryPointViewIds = {&quot;/all.xhtml&quot;},

redirect=&quot;/all.xhtml&quot;)

@ViewController(viewIds={&quot;/edit1.xhtml&quot;, &quot;/edit2.xhtml&quot;})

public class Editor ...

{

...

@PreRenderView public void loader()

{

...

}

...

}

Orchestra - Scope Manuel-Scope <bean id=&quot; googleMapBean &quot; class=&quot;net.wessendorf.faces.starter.view.controller.GoogleMapBean&quot; scope=&quot;conversation.manual&quot; orchestra:conversationName=&quot; googleMap &quot; p:userService-ref=&quot;userServiceImpl&quot;> <aop:scoped-proxy /> </bean> Beenden der Konversation Conversation currentConv = ConversationManager.getInstance().getConversation(&quot; googleMap &quot;); currentConv.invalidate();

Manuel-Scope

<bean id=&quot; googleMapBean &quot; class=&quot;net.wessendorf.faces.starter.view.controller.GoogleMapBean&quot; scope=&quot;conversation.manual&quot;

orchestra:conversationName=&quot; googleMap &quot;

p:userService-ref=&quot;userServiceImpl&quot;>

<aop:scoped-proxy />

</bean>

Beenden der Konversation

Conversation currentConv = ConversationManager.getInstance().getConversation(&quot; googleMap &quot;);

currentConv.invalidate();

Orchestra - Scopes ConversationBindingListener Interface valueBound() valueUnbound() Gilt für beide Scope‘s Flash manual Conversation hat „timeout“ 30 Minuten

ConversationBindingListener Interface

valueBound()

valueUnbound()

Gilt für beide Scope‘s

Flash

manual

Conversation hat „timeout“

30 Minuten

Ausblick JBoss Seam, „a Java EE framework“ JSF EJB 3 Basis für „Web Beans“ (JSR 299) Dependency-Injection... Google Guice Ein (web) Framework für Java EE JavaServer Faces 2.0 Bessere Integration für Komponenten Ajax-Layer ? Aufnahme von guten Ideen Facelets Trinidad ... „ Modern Web Frameworks“ ... ?

JBoss Seam, „a Java EE framework“

JSF

EJB 3

Basis für „Web Beans“ (JSR 299)

Dependency-Injection...

Google Guice

Ein (web) Framework für Java EE

JavaServer Faces 2.0

Bessere Integration für Komponenten

Ajax-Layer ?

Aufnahme von guten Ideen

Facelets

Trinidad

...

„ Modern Web Frameworks“ ... ?

Dokumentation http://myfaces.apache.org http://myfaces.apache.org/trinidad http://springframework.org https://facelets.dev.jav.net Schulung / Support: Irian (http://www.irian.at) MyFaces User / Dev List Slides  http://slideshare.net/mwessendorf/ Demo-Anwendung: http://code.google.com/p/facesgoodies/

http://myfaces.apache.org

http://myfaces.apache.org/trinidad

http://springframework.org

https://facelets.dev.jav.net

Schulung / Support:

Irian (http://www.irian.at)

MyFaces User / Dev List

Slides  http://slideshare.net/mwessendorf/

Demo-Anwendung:

http://code.google.com/p/facesgoodies/

Frage ? Danke !

Frage ?

Danke !

Add a comment

Related presentations

Related pages

4 Advanced JSF - JSFAtWork, JSF 2.0 und Apache MyFaces

4 Advanced JSF Nachdem in den vorangegangenen Kapiteln die Grundlagen von JSF im Mittelpunkt standen, wollen wir uns in diesem Kapitel den etwas ...
Read more

4AdvancedJSF

149 4AdvancedJSF Nachdem in den vorangegangenen Kapiteln die Grundlagen von JSF im Mittelpunkt standen, wollen wir uns in diesem Kapitel den etwas
Read more

4 Advanced JSF - JSFAtWork, JSF 2.0 und Apache MyFaces

JavaServer Faces 2.0 Grundlagen, Tutorial, JSF2, JSF, Trinidad, Author: Martin Marinschek
Read more

Advanced JavaServer Faces (JSF) - Corporate Training ...

Advanced JSF Configurations Configure application factory of your own Configure lifecycle factory of your own Using your own default event handler ...
Read more

Advanced JSF Training Course | DevelopIntelligence

Advanced JSF course customized for you and your team. Personally relevant training. Let us customize a dedicated version of the Advanced JSF course.
Read more

Advanced JSF Tutorial: The single page interface (SPI ...

Advanced JSF Tutorial: The single page interface (SPI) with Facelets, Ajax and HTML5. By Cameron McKenzie (@potemcam) TheServerSide.com
Read more

Java Server Faces (Advanced) | AMA CONEC

Advanced JSF training teaches attendees how to build custom JSF components and Ajax applications. Course Pre-requisite: Participants taking this course ...
Read more

JavaServer Faces (JSF) Tutorial - Tutorials for Google ...

JSF Tutorial - Learn Java Server Faces (JSF) in simple and easy steps starting from Environment setup, Architecture, Managed Beans, Page Navigation, Event ...
Read more