Java Server Faces

Transcription

Java Server Faces
JavaServer Faces,
Web-Entwicklung mit GUI-Komponenten
Markus Heinisch
markus.heinisch
@trivadis.com
DOAG Regio Stuttgart
Juli 2006
Why do I need it?
ƒ Ed Burns, 27.4.2004 „About Faces: The JavaServer™ Faces API
and how it relates to Struts“
© 2006
Agenda
ƒ Einleitung
ƒ JSF Architektur
ƒ JSF Implementierungen
ƒ Fazit
Daten sind
immer im Spiel.
ƒ Referenzen
© 2006
Was ist JavaServer Faces?
ƒ Bibliothek von wiederverwendbaren GUI Komponenten
ƒ Standard Java EE 5 Web UI Framework
ƒ Java Community Process JSR 127, JSR-252
(http://jcp.org/en/jsr/detail?id=127)
ƒ Version 1.2 im Mai 2006 (Version 1.0 im März 2004)
Grafik aus SUN‘s „Java EE 5 Tutorial“
© 2006
Vision von JSF
ƒ JSR-127 (http://www.jcp.org/en/jsr/detail?id=127):
"Basic Idea: Make Web Development Faster And Easier"
ƒ Fokus auf Komponenten statt Markup
à Komponentenmarkt
ƒ Management von Events und State
ƒ Für bestmögliche Toolunterstützung entwickelt
© 2006
Grundprinzip
ƒ Typische JSF Applikation besteht aus:
ƒ Webseiten als MVC View
à Webseiten referenzieren serverseitige Komponenten
ƒ JavaBeans Komponenten als MVC Model
à Management von Applikationsstatus und Verhalten
ƒ JSF Servlet als MVC Controller
à Deklaration der Seitennavigation
ƒ Events
à Vergleichbar mit Events-Listener Konzept in traditioneller GUI
Entwicklung
© 2006
Positionierung
Graphic taken from „JSF in Action“ by Kito D. Mann
© 2006
Beispiel Login-Formular
ƒ Einfaches Login-Formular mit JSF Komponenten und JSP
© 2006
Beispiel Login-Formular
ƒ Webseite als MVC View
ƒ Login JSP mit
JSF Komponenten
ƒ JSP und JSF Tags
gemischt
ƒ Alle
JSF Komponenten
innerhalb des JSF ViewElements
...
<f:view>
<html>
<body>
<h:form>
<table>
<tr>
<td><h:outputText value="Username"/></td>
<td><h:inputText/></td>
</tr>
<tr>
<td><h:outputText value="Password"/></td>
<td><h:inputSecret/></td>
</tr>
</table>
<h:commandButton value="Speichern"/>
<h:commandButton value="Abbrechen"/>
</h:form>
</body>
</html>
</f:view> ...
© 2006
Beispiel Login-Formular
ƒ Login-Formular als HTML im Browser
<html>
<body>
<form id="_id0" method="post"
action="/myApp/faces/simpleRegistration.jsp"
enctype="application/x-www-form-urlencoded">
<table cellspacing="2" cellpadding="3" border="0">
<tr>
<td>Username</td>
<td><input type="text" name="_id0:_id2" /></td>
</tr>
<tr>
<t>Password</td>
<td><input type="password" name="_id0:_id4" value="" /></td>
</tr>
</table>
<input type="submit" name="_id0:_id5" value="Speichern" />
<input type="submit" name="_id0:_id6" value="Abbrechen" />
<input type="hidden" name="com.sun.faces.VIEW"
value="H4sIAAAAAAAAAFvzloG1hIHRsAAA455JNwkAAAA=" />
<input type="hidden" name="_id0" value="_id0" />
</form>
</body>
© 2006
</html>
Agenda
ƒ Einleitung
ƒ JSF Architektur
ƒ JSF Implementierungen
ƒ Fazit
Daten sind
immer im Spiel.
ƒ Referenzen
© 2006
J2EE recommended architecture
Rich Client
SOAP
JDBC
RDBMS
JMS
MOM
(Queue)
MDB
JSF
JSF
Web Actions
Browser
View
Components
HTTP
JDBC
BMP
GUI
Java ME
Mobile Device
Consumed Service
CMP
Rich Client
Session Bean
Web Service
Servlet
GUI
.NET
Framework
Component
IF
SOAP
BL
DTO’s
Unit & IntegrationTesting
Presentation
Client Tier
Business Logic
Middle Tier
Integ.
WS IF
Präs.
Java Swing
Proxy
GUI
Remoting
Integration
Resource Tier
© 2006
MVC Architektur
ƒ JSF implementiert das Model 2 aus den J2EE Blueprints
JSF
JSFApplikation
Applikation
Controller
View
HTML
HTML
RenderKit
RenderKit
HTML
HTML
Browser
Browser
Page
Page
Description
Description
FacesServlet
FacesServlet
WAP
WAP
Browser
Browser
Model
WML
WML
RenderKit
RenderKit
Managed
Managed
Beans
Beans
Page
Page
Description
Description
© 2006
MVC Architektur
ƒ Architektur unabhängig Markup und spezifischen Protokollen
entworfen
ƒ JSF Applikation kann unterschiedliche Technologien zur
Darstellung verwenden
ƒ JSF RenderKit erzeugt aus den Komponenten das Markup zur
Laufzeit
ƒ Trennung von Seitenbeschreibung/Komponenten und Rendering
des Markup bringt
à Flexibilität von Komponenten mit verschiedenen RenderKits
à Einheitliches Programmiermodell, JSF und Java, für verschiedene
Clienttypen
© 2006
JSF Component
ƒ JSF Component besteht aus
à UIComponent, definiert das Verhalten des Elements und steuert den
Zugriff aus Datenmodell
à Renderer, generiert Markup für einen Clienttyp für eine Komponente
oder Komponentenfamilie
à JSP Custom Tag, zur Notation von JSF Components in JSP Views
ƒ Klare Trennung zwischen Verhalten und Darstellung
UIComponent
UIComponent
ManagedBean
ManagedBean
JSF EL
State
State
RenderKit
RenderKit
Renderer
Renderer
Renderer
Renderer
© 2006
MVC – Controller
ƒ JSF implementiert das Front Controller Pattern: FacesServlet
ƒ Aufgaben
à Gatekeeper – alle Requests gehen durch das Servlet
à Request Processing Lifecycle Management
à Navigation durch Auswahl einer View
ƒ Konfiguration des FacesServlet in /WEB-INF/web.xml
<servlet>
<servlet-name>Faces Servlet</servlet-name>
<servlet-class>javax.faces.webapp.FacesServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>Faces Servlet</servlet-name>
<url-pattern>/faces/*</url-pattern>
</servlet-mapping>
© 2006
Application Configuration Resource File
ƒ Konfigurationsdatei von JSF
à Ein oder mehrere Dateien
à Pfad kann in web.xml als <context-param> definiert werden
Default-Pfad: WEB-INF/faces-config.xml
à Runtime Access via Singleton javax.faces.Application
ƒ Definition und Konfiguration von Objekten, wie
à
à
à
à
à
à
à
Managed Beans
Navigationsregeln
Validators&Converters
Event-Listeners
MessageBundles
RenderKits
…
© 2006
MVC – View
ƒ View beschreibt Layout, Verhalten und Darstellung der
Applikation
ƒ User Interface besteht aus Hierarchie von Komponenten
à Root-Element <f:view>
ƒ Komponenten sind vorgefertigte Elemente, die Entwickler zu
komplexen Views zusammenstecken
à Layouting
à Menüs
à Einfache bis umfangreiche Werte Eingabe
ƒ Input Feld über DateSelector bis zum Shuffle-Dialog
à Validierung und Konvertierung
ƒ Nicht sichtbare Komponenten
© 2006
MVC – View
ƒ Basisklasse javax.faces.component.UIComponent
à Vergleichbar mit Swing Komponenten javax.swing.JComponent
à Server-seitig
<f:view>
<html>
<body>
<h:form>
<table>
<tr>
<td><h:outputText value="Username"/></td>
<td><h:inputText/></td>
</tr>
<tr>
<td><h:outputText value="Password"/></td>
<td><h:inputSecret/></td>
</tr>
</table>
<h:commandButton value="Speichern"/>
<h:commandButton value="Abbrechen"/>
</h:form>
</body>
</html>
</f:view>
UIViewRoot
UIViewRoot
UIForm
UIForm
UIOutput
UIOutput UIOutput
UIOutput
UIInput
UIInput
UICommand
UICommand
UIInput
UIInput
© 2006
UICommand
UICommand
MVC – Model
ƒ Modell wird durch Managed Beans repräsentiert
ƒ Managed Beans sind POJOs
keine Abhängigkeit von Basisklassen oder Interfaces
ƒ Managed Beans sind JSF Controller nicht bekannt
à Managed Beans können symbolischen Navigationsnamen einer
Navigationsregel liefern
à Ergebnis wird vom Controller zur Navigation verwendet
ƒ Konfiguration der Managed Beans in faces-config.xml
© 2006
MVC – Model
ƒ Verbindung zur Applikationslogik
ƒ Binding von Eingabefelder und Submits an ManagedBeans
ƒ <inputText>
ƒ <commandButton>
Æ Properties der Bean
Æ Methoden der Bean
ƒ Bindemittel: JSF Expression Language
à Syntax für Zugriff auf JavaBean Properties und Aufruf von Methoden
à Vergleichbar zu JSP Expression Language
à Verwendung in Views, Konfigdatei und Java Code
à Get und Set von Properties, Handling von Events
<h:inputText value="#{bbRegistration.username}" id="username"/>
<h:commandButton value="Speichern" action="registerConfirm"
actionListener="#{bbRegistration.onRegister}"/>
© 2006
Navigation
ƒ Deklarative Navigation
à
à
à
à
Ähnlich zu Struts
Lokale und globale Navigationsregeln in Datei faces-config.xml
Lokale Regel, wenn Ausgangsseite (from-view-id) angegeben ist
Globale Regel, wenn keine Ausgangsseite angegeben ist
<navigation-rule>
<from-view-id>/registration.jspx</from-view-id>
<navigation-case>
<from-outcome>back</from-outcome>
<to-view-id>/register.jspx</to-view-id>
</navigation-case>
<navigation-case>
<from-outcome>registerConfirm</from-outcome>
<to-view-id>/registerConfirm.jspx</to-view-id>
</navigation-case>
</navigation-rule>
Ausgangsseite
Ausgangsseite
Symbolische
SymbolischeNav.name
Nav.name
Zielsseite
Zielsseite
© 2006
Navigation
ƒ Verwendung der Navigationsregeln
ƒ Attribut action gibt Navigation-Case an
à Statische Navigation durch symbolischen Navigationsnamen
<h:commandButton value="Speichern" action="registerNav"
actionListener="#{bbRegistration.onRegister}"/>
statisch
statisch
à Dynamische Navigation durch JSF Expression Language
à Berechnung des Navigation Case in Managed Bean Methode
Methodensignatur: public String myAction()
<h:commandButton value="Speichern"
action=„#{saveSettings == true ? ´confirm´ : ´home´}"
actionListener="#{bbRegistration.onRegister}"/>
dynamisch
dynamisch
<h:commandButton value="Speichern"
action="#{bbRegistration.register}"
actionListener="#{bbRegistration.onRegister}"/>
© 2006
Request Processing Lifecycle
ƒ Lifecycle einer JSF Page
à JSF unterteilt den Lifecycle in 6 Phasen
à Unterscheidung zwischen initialen Request oder Postback Request
ƒ Initial Request
à Restore View Phase
ƒ Component-Tree wird aus der View erzeugt oder wieder hergestellt
ƒ Tree wird in Server-Cache verwaltet
JSF
JSFApplikation
Applikation
à Render Response Phase
ƒ Erzeugt Markup
aus Component-Tree
ƒ Schreibt Markup
in Response
ƒ Speichert Status des
Component-Trees
Restore
Restore
View
View
HTML
HTML
Browser
Browser
Apply
ApplyRequest
Request
Values
Values
Process
Process
Validations
Validations
Initial Request
Render
Render
Response
Response
Invoke
Invoke
Application
Application
© 2006
Update
UpdateModel
Model
Values
Values
Request Processing Lifecycle
ƒ Postback Request (zusätzlich zum Initial Request)
ƒ Apply Request Values
à Komponenten aus dem Component-Tree können ihren Status mit Werten aus
dem HTTP Post Request provisorisch aktualisieren
ƒ Process Validation
à Konverter und Validatoren der Komponenten prüfen den provisorischen Wert
ƒ Update Model Values
à Provisorische Wert wird als neuer Status in Komponente übernommen
ƒ Invoke Application
à Erzeugte Events werden an registrierte Listener weitergegeben,
Z.B. Submit eines Buttons wird als ActionEvent an ActionListener
ƒ Exceptions im Lifecycle
à Bei Exceptions wird in die Render Response Phase gesprungen
à Ausgangs-View wird angezeigt, keine Navigation
© 2006
UI Events und Listeners
ƒ Events werden durch HTTP Post server-seitig verbreitet
à
à
à
à
Alle Formulardaten werden gesendet
Event-Listener sind Managed Beans
Registrierung von ein oder mehreren Listeners möglich
Event-Source sind Komponenten (server-seitig)
ƒ ActionEvent
à UI Component wurde aktiviert
à Methoden in Bean public void onMyEvent(ActionEvent e)
ƒ ValueChangeEvent
à Wert eines UI Input Element validiert und geändert
à Methoden in Bean public void myChanged(ValueChangeEvent vce)
ƒ PhaseEvent
à kennzeichnet Beginn oder Ende einer Lifecycle Phase
à Konfiguration von PhaseEvent-Listeners in faces-config.xml
à Interface javax.faces.event.PhaseListener
© 2006
State von JSF Applikationen
ƒ Jede Komponente eines Component-Tree sichert State am Ende
der Render Response Phase
ƒ JSF verwaltet den State einer View zwischen Requests
ƒ Bei Postback auf eine View wird der State jeder Komponente in
Restore View Phase wiederhergestellt
ƒ State auf Server oder Client gespeichert
à Server: in HTTPSession,
à Client: abhängig von Markup Sprache;
bei HTML als hidden Form Field
© 2006
Agenda
ƒ Einleitung
ƒ JSF Architektur
ƒ JSF Implementierungen
ƒ Fazit
Daten sind
immer im Spiel.
ƒ Referenzen
© 2006
SUN Reference Implementation
ƒ JSF 1.1.02
à https://javaserverfaces.dev.java.net/
à Download enthält
ƒ Libs, Dokumentation, Samples und Sourcen
ƒ Basisimplementierung des JSR-127
ƒ Liefert JSF Infrastruktur
à Z.B. FacesServlet-Controller
à Komponentenimpl. der Spec.
ƒ ADF Faces nutzt SUN RI und implementiert „nur“ JSF Components selber
ƒ Nur wenige zusätzliche Features
à Z.B. com.sun.faces.NUMBER_OF_VIEWS_IN_SESSION
© 2006
SUN Reference Implementation
ƒ JSF Components:
à JSF Custom Tag HTML
à Sichtbare Komponenten
ƒ
ƒ
ƒ
ƒ
Formular
Eingabe
Ausgabe
Layout
© 2006
SUN Reference Implementation
ƒ JSF Components:
à JSF Custom Tag Core
à Nicht sichtbare Komponenten
ƒ Converter
ƒ Validator
ƒ EventListener
© 2006
SUN Reference Implementation
ƒ Positiv
à Solide Implementierung der JSF Infrastruktur
à Hersteller bauen auf SUN RI auf und bieten zusätzliches
Komponenten
à Komponenten liefern minimales vorgefertigtes Look&Feel
à Look mit CSS leicht änderbar
ƒ Negativ
à
à
à
à
Sehr wenige Komponenten
Nur einfache Komponenten (nahe am HTML)
Kein Client-Site Scripting vorgesehen
Look muss bei jeder Komponente eingestellt werden
© 2006
Oracle ADF Faces
ƒ Oracle JSF Component Framework
Library von JSF Komponenten
ƒ Basiert auf SUN RI 1.1
ƒ Optimaler Support mit Design-time Visual Tools in
JDeveloper 10.1.3
à
à
à
à
Visual Editing JSF Page
Faces-config.xml Editing Konsole
Visual Page flow design
Declarative data binding (JSR-227)
ƒ 100% JSF Standard complient
© 2006
ADF Faces
ƒ Ca. 100 JSF Komponenten
à Einfache bis umfangreiche Komponenten
à http://www.oracle.com/technology/products/jdev/htdocs/partners/addins/exchange/jsf/in
dex.html
ƒ Partial Page Rendering (AJAX-style)
ƒ Client-Side Validation (JavaScript)
ƒ Dialog-Framework
ƒ Support für Skining
à Zur Laufzeit umschaltbar
ƒ Verschiedene RenderKits: HTML, Mobile, Telnet
ƒ Weitere Features:
File upload support, data tables, hierarchical tables, color/date pickers, progress
indicators, menu tabs/buttons, wizards, internationalization und accessibility
© 2006
ADF Faces
ƒ ADF Faces auch ohne JDeveloper benutzbar
ƒ ADF Faces wurde dieses Jahr an Apache Org. übergeben
à Subprojekt von MyFaces
à Æ OpenSource (ASF Lizenz)
à Neuer Name: Trinidad
(http://wiki.apache.org/myfaces/ADF_Faces)
© 2006
ADF Faces
ƒ Positiv
à
à
à
à
à
Mächtigkeit und Umfang der Komponenten
Nutzen von JavaScript: PPT und Client-Side Validation
Verschiedene RenderKits
Vorhandenes Look der Komponenten und Skining-Support
Sourcecode über Apache MyFaces
ƒ Negativ
à Verwenden eigener Look oder Kunden CI schwierig
à Skining ungenügend beschrieben - Komplette Anpassung möglich?
© 2006
Agenda
ƒ Einleitung
ƒ JSF Architektur
ƒ JSF Implementierungen
ƒ Fazit
Daten sind
immer im Spiel.
ƒ Referenzen
© 2006
Fazit
ƒ Why do I need it?
à Ed Burns, 27.4.2004 „About Faces: The JavaServer™ Faces API and
how it relates to Struts“
Spekulativ
OK
Standpunktfrage
Request/Response <-> Componets/Events
OK
Toolkit abhängig
© 2006
Fazit
ƒ Positiv
à
à
à
à
à
MVC Architektur
Trennung von Verhalten und Darstellung
Protokoll und Markup unabhängig
Komponentenmarkt
Event-orientiertes Programmiermodell
ƒ Negativ
à
à
à
à
Zusätzliche Technologie im Webumfeld
Umsetzung von vorgegebenem Look&Feel wird erschwert (z.Z.)
Ergänzende Frameworks sinnvoll
Proof of Concept im Projekt fehlt
© 2006
Herzlichen Dank!
Daten sind
immer im Spiel.
Fragen?
© 2006
Agenda
ƒ Einleitung
ƒ JSF Architektur
ƒ JSF Implementierungen
ƒ JSF 1.2
Daten sind
immer im Spiel.
ƒ Fazit
ƒ Referenzen
© 2006
Referenzen
ƒ JavaServer Faces
à SDN JavaServer Faces Technology,
http://java.sun.com/javaee/javaserverfaces/
ƒ SUN RI JSF
à https://javaserverfaces.dev.java.net/
à https://javaserverfaces.dev.java.net/presentations/
ƒ Apache MyFaces, http://myfaces.apache.org/
ƒ JCP,
http://www.jcp.org/en/jsr/detail?id=127,
http://www.jcp.org/en/jsr/detail?id=252
ƒ Oracle ADF Faces,
http://www.oracle.com/technology/products/jdev/htdocs/partners/addins/
exchange/jsf/index.html
© 2006
Bücher
ƒ „Pro JSF and AJAX“, Jonas Jacobi und John R. Fallows
ISBN: 1590595807, Apress
ƒ „JSF in Action“, Kito Mann
ISBN: 1932394125, Manning Publications
ƒ „JavaServer Faces: The Complete Reference“,
Chris Schalk, Ed Burns, James Holmes
ISBN: 0072262400, Osborne McGraw-Hill,
Erscheinungsdatum: 1. August 2006
© 2006
Weblogs
ƒ Jonas Jacobi, Oracle Mitarbeiter
http://www.orablogs.com/jjacobi/
ƒ Chris Schalk, Oracle Mitarbeiter
http://www.jroller.com/page/cschalk
ƒ OTN JSF, http://www.oracle.com/technology/tech/java/jsf.html
ƒ JSFCentral, http://www.jsfcentral.com/
ƒ James Holmes, http://www.jamesholmes.com/JavaServerFaces/
ƒ Adam Winer, http://sfjsf.blogspot.com/
ƒ Craig McClanahan, http://blogs.sun.com/roller/page/craigmcc/
© 2006