JSF-Klassen: typischer GUI-Aufbaumit...

40
Komponentenbasierte Software- Entwicklung Prof. Dr. Stephan Kleuker 316 JSF-Klassen: typischer GUI-Aufbau mit Events • Hierarchische Baumstruktur der Komponenten, z. B. – Intern: Wurzel des Komponentenbaums, Container – <h:form> Formular, benötigt zum Daten verschicken – <h:panelGrid> Container mit Tabellendarstellung public abstract class public abstract class public abstract class public abstract class UIComponent UIComponent UIComponent UIComponent extends Object implements extends Object implements extends Object implements extends Object implements StateHolder StateHolder StateHolder StateHolder: UIComponent is the base class for all user interface components in JavaServer Faces. The set of UIComponent instances associated with a particular request and response are organized into a component tree under a UIViewRootthat represents the entire content of the request or response. (Sun Klassendoku) public public public public abstract abstract abstract abstract class class class class UIComponentBase UIComponentBase UIComponentBase UIComponentBase extends extends extends extends UIComponent UIComponent UIComponent UIComponent public public public public class class class class UICommand UICommand UICommand UICommand extends extends extends extends UIComponentBase UIComponentBase UIComponentBase UIComponentBase implements implements implements implements ActionSource2 ActionSource2 ActionSource2 ActionSource2 public class public class public class public class UIOutput UIOutput UIOutput UIOutput extends extends extends extends UIComponentBase UIComponentBase UIComponentBase UIComponentBase implements implements implements implements ValueHolder ValueHolder ValueHolder ValueHolder

Transcript of JSF-Klassen: typischer GUI-Aufbaumit...

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

316

JSF-Klassen: typischer GUI-Aufbau mit Events

• Hierarchische Baumstruktur der Komponenten, z. B.

– Intern: Wurzel des Komponentenbaums, Container

– <h:form> Formular, benötigt zum Daten verschicken

– <h:panelGrid> Container mit Tabellendarstellung

• public abstract class public abstract class public abstract class public abstract class UIComponentUIComponentUIComponentUIComponent extends Object implements extends Object implements extends Object implements extends Object implements StateHolderStateHolderStateHolderStateHolder: UIComponent is the base class for all user interface components in JavaServer Faces. The set of UIComponent instances associated with a particular request and response are organized into a component tree under a UIViewRoot that represents the entire content of the request or response. (Sun Klassendoku)

• publicpublicpublicpublic abstractabstractabstractabstract classclassclassclass UIComponentBaseUIComponentBaseUIComponentBaseUIComponentBase extendsextendsextendsextends UIComponentUIComponentUIComponentUIComponent

• publicpublicpublicpublic classclassclassclass UICommandUICommandUICommandUICommand extendsextendsextendsextends UIComponentBaseUIComponentBaseUIComponentBaseUIComponentBase implementsimplementsimplementsimplementsActionSource2ActionSource2ActionSource2ActionSource2

• public class public class public class public class UIOutputUIOutputUIOutputUIOutput extends extends extends extends UIComponentBaseUIComponentBaseUIComponentBaseUIComponentBase implements implements implements implements ValueHolderValueHolderValueHolderValueHolder

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

317

Analyse von FacesContext (1/4)

<<<<h:formh:formh:formh:form id="f1">id="f1">id="f1">id="f1"><<<<h:messagesh:messagesh:messagesh:messages id="m1" id="m1" id="m1" id="m1" globalOnly="trueglobalOnly="trueglobalOnly="trueglobalOnly="true"/>"/>"/>"/><<<<h:panelGridh:panelGridh:panelGridh:panelGrid id="p1" columns="3" >id="p1" columns="3" >id="p1" columns="3" >id="p1" columns="3" ><<<<h:outputLabelh:outputLabelh:outputLabelh:outputLabel id="o1" id="o1" id="o1" id="o1" for="mnamefor="mnamefor="mnamefor="mname" " " " value="Modulnamevalue="Modulnamevalue="Modulnamevalue="Modulname "/>"/>"/>"/><<<<h:inputTexth:inputTexth:inputTexth:inputText id="mnameid="mnameid="mnameid="mname" " " " value="#{module.modul.namevalue="#{module.modul.namevalue="#{module.modul.namevalue="#{module.modul.name}"/>}"/>}"/>}"/><<<<h:messageh:messageh:messageh:message id="m2" id="m2" id="m2" id="m2" for="mnamefor="mnamefor="mnamefor="mname" />" />" />" /><<<<h:outputLabelh:outputLabelh:outputLabelh:outputLabel id="o2" id="o2" id="o2" id="o2" for="mnrfor="mnrfor="mnrfor="mnr" " " " value="Modulnummervalue="Modulnummervalue="Modulnummervalue="Modulnummer "/>"/>"/>"/><<<<h:inputTexth:inputTexth:inputTexth:inputText id="mnrid="mnrid="mnrid="mnr" " " " value="#{module.modul.nrvalue="#{module.modul.nrvalue="#{module.modul.nrvalue="#{module.modul.nr}"/>}"/>}"/>}"/><<<<h:messageh:messageh:messageh:message id="m3" id="m3" id="m3" id="m3" for="mnrfor="mnrfor="mnrfor="mnr"/>"/>"/>"/><<<<h:commandButtonh:commandButtonh:commandButtonh:commandButton id="c1" id="c1" id="c1" id="c1" value="Abschickenvalue="Abschickenvalue="Abschickenvalue="Abschicken" " " "

action="#{module.uebernehmenaction="#{module.uebernehmenaction="#{module.uebernehmenaction="#{module.uebernehmen}"/>}"/>}"/>}"/></</</</h:panelGridh:panelGridh:panelGridh:panelGrid>>>><<<<h:commandLinkh:commandLinkh:commandLinkh:commandLink id="anzid="anzid="anzid="anz" " " " action="#{module.anzeigenaction="#{module.anzeigenaction="#{module.anzeigenaction="#{module.anzeigen}" >}" >}" >}" ><<<<h:outputTexth:outputTexth:outputTexth:outputText value="Zurvalue="Zurvalue="Zurvalue="Zur ModulModulModulModulüüüübersicht"/>bersicht"/>bersicht"/>bersicht"/>

</</</</h:commandLink><brh:commandLink><brh:commandLink><brh:commandLink><br/>/>/>/><<<<h:commandLinkh:commandLinkh:commandLinkh:commandLink id="internid="internid="internid="intern" " " "

action="#{module.internaction="#{module.internaction="#{module.internaction="#{module.intern}" >}" >}" >}" ><<<<h:outputTexth:outputTexth:outputTexth:outputText value="JSFAufbauinfosvalue="JSFAufbauinfosvalue="JSFAufbauinfosvalue="JSFAufbauinfos"/>"/>"/>"/>

</</</</h:commandLinkh:commandLinkh:commandLinkh:commandLink>>>></</</</h:formh:formh:formh:form>>>>

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

318

Analyse von FacesContext (2/4)

private private private private voidvoidvoidvoid baum(UIComponentbaum(UIComponentbaum(UIComponentbaum(UIComponent ui, String leer) {ui, String leer) {ui, String leer) {ui, String leer) {System.out.println(leerSystem.out.println(leerSystem.out.println(leerSystem.out.println(leer + + + + ui.getIdui.getIdui.getIdui.getId() + ": " () + ": " () + ": " () + ": "

+ + + + ui.getRendererTypeui.getRendererTypeui.getRendererTypeui.getRendererType() +" : "() +" : "() +" : "() +" : "+ + + + ui.getClassui.getClassui.getClassui.getClass());());());());

List<UIComponentList<UIComponentList<UIComponentList<UIComponent> > > > comcomcomcom = = = = ui.getChildrenui.getChildrenui.getChildrenui.getChildren();();();();forforforfor ((((UIComponentUIComponentUIComponentUIComponent u : u : u : u : comcomcomcom) {) {) {) {baum(ubaum(ubaum(ubaum(u, leer + " ");, leer + " ");, leer + " ");, leer + " ");

}}}}}}}}

publicpublicpublicpublic String intern() {String intern() {String intern() {String intern() {FacesContextFacesContextFacesContextFacesContext ctxtctxtctxtctxt = = = = FacesContext.getCurrentInstanceFacesContext.getCurrentInstanceFacesContext.getCurrentInstanceFacesContext.getCurrentInstance();();();();UIViewRootUIViewRootUIViewRootUIViewRoot vrvrvrvr = = = = ctxt.getViewRootctxt.getViewRootctxt.getViewRootctxt.getViewRoot();();();();ifififif ((((vrvrvrvr != null) {!= null) {!= null) {!= null) {System.out.println("RootSystem.out.println("RootSystem.out.println("RootSystem.out.println("Root:" + :" + :" + :" + vr.getViewIdvr.getViewIdvr.getViewIdvr.getViewId());());());());baum(vrbaum(vrbaum(vrbaum(vr, " ");, " ");, " ");, " ");

} } } } elseelseelseelseSystem.out.println("keineSystem.out.println("keineSystem.out.println("keineSystem.out.println("keine RootRootRootRoot");");");");

returnreturnreturnreturn ANZEIGEN;ANZEIGEN;ANZEIGEN;ANZEIGEN;}}}}

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

319

Analyse von FacesContext (3/4)

INFO: Root:/index.xhtmlINFO: j_id1: null : class javax.faces.component.UIViewRootINFO: j_idt2: null : class com.sun.faces.facelets.compiler.UIInstructionsINFO: j_idt3: null : class com.sun.faces.facelets.compiler.UIInstructionsINFO: j_idt4: javax.faces.Head : class javax.faces.component.UIOutputINFO: j_idt5: null : class com.sun.faces.facelets.compiler.UIInstructionsINFO: j_idt6: javax.faces.Body : class javax.faces.component.UIOutputINFO: f1: javax.faces.Form : class javax.faces.component.html.HtmlFormINFO: j_idt7: javax.faces.Messages : class javax.faces.component.html.HtmlMessagesINFO: j_idt8: javax.faces.Grid : class javax.faces.component.html.HtmlPanelGridINFO: j_idt9: javax.faces.Label : class javax.faces.component.html.HtmlOutputLabelINFO: mname: javax.faces.Text : class javax.faces.component.html.HtmlInputTextINFO: j_idt10: javax.faces.Message : class javax.faces.component.html.HtmlMessageINFO: j_idt11: javax.faces.Label : class javax.faces.component.html.HtmlOutputLabelINFO: mnr: javax.faces.Text : class javax.faces.component.html.HtmlInputTextINFO: j_idt12: javax.faces.Message : class javax.faces.component.html.HtmlMessageINFO: j_idt13: javax.faces.Button : class javax.faces.component.html.HtmlCommandButtonINFO: j_idt14: javax.faces.Link : class javax.faces.component.html.HtmlCommandLinkINFO: j_idt15: javax.faces.Text : class javax.faces.component.html.HtmlOutputTextINFO: j_idt16: null : class com.sun.faces.facelets.compiler.UIInstructionsINFO: intern: javax.faces.Link : class javax.faces.component.html.HtmlCommandLinkINFO: j_idt17: javax.faces.Text : class javax.faces.component.html.HtmlOutputTextINFO: j_idt18: null : class com.sun.faces.facelets.compiler.UIInstructionsGrundregel: Layout bleibt statisch; Ein- und Ausblenden durch Attribut rendered

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

320

Analyse von FacesContext (4/4) - Komponentenbaum

UIViewRoot

HtmlMessages

HtmlForm

HtmlPanelGrid

HtmlOutputLabel

HtmlInputText

HtmlMessage

HtmlOutputLabel

HtmlInputText

HtmlMessage

HtmlCommandButton

HtmlCommandLink

HtmlOutputText

HtmlCommandLink

HtmlOutputText

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

321

Speichern der Zustandsinformationen (1/2)

• Klassische GUI-Komponenten (und Event-Listener) sind

zustandsbasiert; HTTP nicht

• Zustand muss gesichert werden (wie wird in Deployment

Descriptor beschrieben)

– Variante A: auf dem Server (Zuordnung z. B. über Cookies)

• empfohlen; nicht default bei Netbeans

• hohe Speicheranforderung

– Variante B: beim Client

<<<<contextcontextcontextcontext----paramparamparamparam>>>>

<<<<paramparamparamparam----name>javax.faces.STATE_SAVING_METHOD</paramname>javax.faces.STATE_SAVING_METHOD</paramname>javax.faces.STATE_SAVING_METHOD</paramname>javax.faces.STATE_SAVING_METHOD</param----namenamenamename>>>>

<<<<paramparamparamparam----value>client</paramvalue>client</paramvalue>client</paramvalue>client</param----valuevaluevaluevalue>>>>

</</</</contextcontextcontextcontext----paramparamparamparam>>>>

• anzuzeigende Seite enthält Zustand in hidden Field

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

322

Speichern der Zustandsinformationen (2/2)

Seitenende in generiertem HTML (Ausschnitt):<a id="f1:intern" <a id="f1:intern" <a id="f1:intern" <a id="f1:intern" hrefhrefhrefhref="#" ="#" ="#" ="#" onclick="if(typeofonclick="if(typeofonclick="if(typeofonclick="if(typeof jsfcljsjsfcljsjsfcljsjsfcljs == == == == 'function'){jsfcljs(document.forms['f1'],'f1:intern,'function'){jsfcljs(document.forms['f1'],'f1:intern,'function'){jsfcljs(document.forms['f1'],'f1:intern,'function'){jsfcljs(document.forms['f1'],'f1:intern,f1:intern','');}return f1:intern','');}return f1:intern','');}return f1:intern','');}return false">JSFAufbauinfos</afalse">JSFAufbauinfos</afalse">JSFAufbauinfos</afalse">JSFAufbauinfos</a>>>>

<<<<inputinputinputinput type="hiddentype="hiddentype="hiddentype="hidden" " " " name="javax.faces.ViewStatename="javax.faces.ViewStatename="javax.faces.ViewStatename="javax.faces.ViewState" " " " id="javax.faces.ViewStateid="javax.faces.ViewStateid="javax.faces.ViewStateid="javax.faces.ViewState" " " " value="H4sIAAAAAAAAANVXW2wUVRg+O9s7FXrhGlNaAiIYu2W7i0HQSIFvalue="H4sIAAAAAAAAANVXW2wUVRg+O9s7FXrhGlNaAiIYu2W7i0HQSIFvalue="H4sIAAAAAAAAANVXW2wUVRg+O9s7FXrhGlNaAiIYu2W7i0HQSIFvalue="H4sIAAAAAAAAANVXW2wUVRg+O9s7FXrhGlNaAiIYu2W7i0HQSIFeFndb0i1F4KGcnT3bnTI3Z850BogEHtREEqNBEk0wavDBB3hRn4jxEh6MeFndb0i1F4KGcnT3bnTI3Z850BogEHtREEqNBEk0wavDBB3hRn4jxEh6MeFndb0i1F4KGcnT3bnTI3Z850BogEHtREEqNBEk0wavDBB3hRn4jxEh6MeFndb0i1F4KGcnT3bnTI3Z850BogEHtREEqNBEk0wavDBB3hRn4jxEh6MJJhI4ouJCTEmxsRLYkxQH9Tzn9mZnd2dbSliopNmembm/875/tt3zl7+EJJhI4ouJCTEmxsRLYkxQH9Tzn9mZnd2dbSliopNmembm/875/tt3zl7+EJJhI4ouJCTEmxsRLYkxQH9Tzn9mZnd2dbSliopNmembm/875/tt3zl7+EJJhI4ouJCTEmxsRLYkxQH9Tzn9mZnd2dbSliopNmembm/875/tt3zl7+EVaBuo+mp7D8zgmY3U2NpGbIyLd9dLnT73RYW6VBYQcHSG0wjRQQtSUmGmVaBuo+mp7D8zgmY3U2NpGbIyLd9dLnT73RYW6VBYQcHSG0wjRQQtSUmGmVaBuo+mp7D8zgmY3U2NpGbIyLd9dLnT73RYW6VBYQcHSG0wjRQQtSUmGmVaBuo+mp7D8zgmY3U2NpGbIyLd9dLnT73RYW6VBYQcHSG0wjRQQtSUmGmsQIWiRnDui5LIqaSpsayFFOSwSqeJUZK0eVNUwYh41qe/Fq4+uGVbaMftsQIWiRnDui5LIqaSpsayFFOSwSqeJUZK0eVNUwYh41qe/Fq4+uGVbaMftsQIWiRnDui5LIqaSpsayFFOSwSqeJUZK0eVNUwYh41qe/Fq4+uGVbaMftsQIWiRnDui5LIqaSpsayFFOSwSqeJUZK0eVNUwYh41qe/Fq4+uGVbaMftcM8dhzB1QerOaVZ2Jy6phKVxg6mpiViT2oaRa1zM1Ke/cWTjvk0Oo0Eu5cM8dhzB1QerOaVZ2Jy6phKVxg6mpiViT2oaRa1zM1Ke/cWTjvk0Oo0Eu5cM8dhzB1QerOaVZ2Jy6phKVxg6mpiViT2oaRa1zM1Ke/cWTjvk0Oo0Eu5cM8dhzB1QerOaVZ2Jy6phKVxg6mpiViT2oaRa1zM1Ke/cWTjvk0Oo0Eu5crjvbjgkk44FU8Al+KOW8oi1eicXBItKbBZsFjNYz+6pNrq499EU=" />crjvbjgkk44FU8Al+KOW8oi1eicXBItKbBZsFjNYz+6pNrq499EU=" />crjvbjgkk44FU8Al+KOW8oi1eicXBItKbBZsFjNYz+6pNrq499EU=" />crjvbjgkk44FU8Al+KOW8oi1eicXBItKbBZsFjNYz+6pNrq499EU=" /></form></form></form></form>

</</</</bodybodybodybody>>>></</</</htmlhtmlhtmlhtml>>>>

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

323

Hintergrund: Abarbeitung von JSF-Anfragen

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

324

Restore View

Komponentenbaum (wieder-)herstellen

• basiert auf nicht sichtbarer Wurzelkomponente

• Komponentenbaum in FacesContext gespeichert

• erster Aufruf:

– JSF-Seite rendern, nicht anzeigen

– ID-Vergabe und damit Aufbau der internen Struktur

– Registrieren von Event-Listenern und Validatoren

– Werte in Komponenten eintragen

• sonst: zugehörigen Komponentenbaum suchen, bzw. wieder

aufbauen (beinhaltet auch Eventlistener, Konvertierer und

Backing-Beans)

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

325

Apply Request Values

UI-Komponenten mit Anfrageparameten aktualisieren

• Request-Parameter auslesen (einschließlich JSF 1.2 nur

POST)

• POST-String parsen und filtern

• Werte dann UI-Komponenten zuordnen (noch nicht prüfen)

• nutzt Methode processDecodes() für alle Komponenten

• falls Attribut immediate=„true“, dann (gleich genauer)

– für Aktionselemente (Command): konvertieren und

validieren überspringen

– für Eingabeelemente (Imput): sofort konvertieren und

validieren

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

326

Process Validations

Werte konvertieren und validieren

• Jede UI-Komponente validiert und konvertiert den

zugeordneten Wert

• nutzt Methode processValidators() der Komponenten

• automatische Konvertierung für viele Typen; Konvertierer

selbst erstellbar (ähnlich zu Validierer)

• bei Fehler Fehlermeldung in Fehlerliste eintragen und

Modellaktualisierung überspringen; zur Ausgabe

• bei Wertänderung: ValueChangeEvent

• Anmerkung: Werte noch nicht in Beans

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

327

Update Model Values

Werte im Modell (Beans) aktualisieren

• Typsicherheit durch vorherige Schritte garantiert

• nutzte Methode processUpdates() der Komponenten

• Werte aktualisieren, durch set-Methoden

• Abbruch bei Fehler

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

328

Invoke Applications

Anwendung ausführen

• an das Ereignis gebundene Aktion ausführen, z. B. Action-

Methode

• nutzt Methode processApplication() der Komponenten

• arbeitet mit vorher aktualisierten Werten

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

329

Render Response

• Rendern durch Spezifikation nicht festgelegt

• Antwort generieren

• aktuellen Stand des zugehörigen Komponentenbaums

ausgeben

• rekursiver Baumdurchlauf; jeweils Renderer aufrufen

(HTML, XTHML, XUL, ...)

• jede Komponente hat Methode der Form encodeXXX()

• Abspeichern des Komponentenbaums

• generierte Seite an Server übergeben, der sie

typischerweise an den Browser schickt

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

330

JSF-Lifecycle verfolgen (1/8)

• Man kann PhaseListener schreiben, die über

Phasenänderungen informiert werden

• wird in faces-config.xml festgehalten

<?<?<?<?xmlxmlxmlxml version='1.0' encoding='UTFversion='1.0' encoding='UTFversion='1.0' encoding='UTFversion='1.0' encoding='UTF----8'?>8'?>8'?>8'?>

<<<<facesfacesfacesfaces----configconfigconfigconfig version="2.0"version="2.0"version="2.0"version="2.0"

xmlns="http://java.sun.com/xml/ns/javaeexmlns="http://java.sun.com/xml/ns/javaeexmlns="http://java.sun.com/xml/ns/javaeexmlns="http://java.sun.com/xml/ns/javaee" " " "

xmlns:xsi="http://www.w3.org/2001/XMLSchemaxmlns:xsi="http://www.w3.org/2001/XMLSchemaxmlns:xsi="http://www.w3.org/2001/XMLSchemaxmlns:xsi="http://www.w3.org/2001/XMLSchema----instance" instance" instance" instance"

xsi:schemaLocation="http://java.sun.com/xml/ns/javaeexsi:schemaLocation="http://java.sun.com/xml/ns/javaeexsi:schemaLocation="http://java.sun.com/xml/ns/javaeexsi:schemaLocation="http://java.sun.com/xml/ns/javaee

http://java.sun.com/xml/ns/javaee/webhttp://java.sun.com/xml/ns/javaee/webhttp://java.sun.com/xml/ns/javaee/webhttp://java.sun.com/xml/ns/javaee/web----facesconfig_2_0.xsd">facesconfig_2_0.xsd">facesconfig_2_0.xsd">facesconfig_2_0.xsd">

<<<<lifecyclelifecyclelifecyclelifecycle>>>>

<<<<phasephasephasephase----listener>controller.ZeichPhasen</phaselistener>controller.ZeichPhasen</phaselistener>controller.ZeichPhasen</phaselistener>controller.ZeichPhasen</phase----listenerlistenerlistenerlistener>>>>

</</</</lifecyclelifecyclelifecyclelifecycle>>>>

</</</</facesfacesfacesfaces----configconfigconfigconfig>>>>

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

331

JSF-Lifecycle verfolgen (2/8) - index.xhtml

<<<<h:formh:formh:formh:form id="form1">id="form1">id="form1">id="form1"><<<<h:panelGridh:panelGridh:panelGridh:panelGrid id="panel1" columns="3" id="panel1" columns="3" id="panel1" columns="3" id="panel1" columns="3" rules="allrules="allrules="allrules="all">">">">

<<<<h:outputTexth:outputTexth:outputTexth:outputText id="o1" id="o1" id="o1" id="o1" value="neuervalue="neuervalue="neuervalue="neuer Text"/>Text"/>Text"/>Text"/><<<<h:inputTexth:inputTexth:inputTexth:inputText id="i1" id="i1" id="i1" id="i1" value="#{analyse.einvalue="#{analyse.einvalue="#{analyse.einvalue="#{analyse.ein}" }" }" }"

required="truerequired="truerequired="truerequired="true"/>"/>"/>"/><<<<h:messageh:messageh:messageh:message id="m1" for="i1"/>id="m1" for="i1"/>id="m1" for="i1"/>id="m1" for="i1"/><<<<h:outputTexth:outputTexth:outputTexth:outputText id="ow1" id="ow1" id="ow1" id="ow1" value="neuevalue="neuevalue="neuevalue="neue Zahl"/>Zahl"/>Zahl"/>Zahl"/><<<<h:inputTexth:inputTexth:inputTexth:inputText id="iw1" id="iw1" id="iw1" id="iw1" value="#{analyse.zahlvalue="#{analyse.zahlvalue="#{analyse.zahlvalue="#{analyse.zahl}"/>}"/>}"/>}"/><<<<h:messageh:messageh:messageh:message id="m1w" for="iw1"/>id="m1w" for="iw1"/>id="m1w" for="iw1"/>id="m1w" for="iw1"/><<<<h:outputTexth:outputTexth:outputTexth:outputText id="o2" id="o2" id="o2" id="o2" value="altervalue="altervalue="altervalue="alter Text/Zahl"/>Text/Zahl"/>Text/Zahl"/>Text/Zahl"/><<<<h:outputTexth:outputTexth:outputTexth:outputText id="o3" id="o3" id="o3" id="o3" escape="falseescape="falseescape="falseescape="false" " " "

value="#{analyse.einvalue="#{analyse.einvalue="#{analyse.einvalue="#{analyse.ein}"/>}"/>}"/>}"/><<<<h:outputLabelh:outputLabelh:outputLabelh:outputLabel id="ow3" id="ow3" id="ow3" id="ow3" value="#{analyse.zahlvalue="#{analyse.zahlvalue="#{analyse.zahlvalue="#{analyse.zahl}"/>}"/>}"/>}"/><<<<h:commandButtonh:commandButtonh:commandButtonh:commandButton id="c1" id="c1" id="c1" id="c1" value="value="value="value="ÜÜÜÜbernehmenbernehmenbernehmenbernehmen" " " "

action="#{analyse.uebernehmenaction="#{analyse.uebernehmenaction="#{analyse.uebernehmenaction="#{analyse.uebernehmen}"/>}"/>}"/>}"/></</</</h:panelGridh:panelGridh:panelGridh:panelGrid>>>>

</</</</h:formh:formh:formh:form>>>>

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

332

JSF-Lifecycle verfolgen (3/8) - Bean

@@@@ManagedBeanManagedBeanManagedBeanManagedBean@@@@SessionScopedSessionScopedSessionScopedSessionScopedpublicpublicpublicpublic classclassclassclass Analyse Analyse Analyse Analyse implementsimplementsimplementsimplements SerializableSerializableSerializableSerializable{{{{private String ein;private String ein;private String ein;private String ein;private private private private intintintint zahl;zahl;zahl;zahl;

publicpublicpublicpublic Analyse(){}Analyse(){}Analyse(){}Analyse(){}

publicpublicpublicpublic String String String String uebernehmenuebernehmenuebernehmenuebernehmen(){(){(){(){returnreturnreturnreturn "./"./"./"./index.xhtmlindex.xhtmlindex.xhtmlindex.xhtml";";";";

}}}}

publicpublicpublicpublic String String String String getEingetEingetEingetEin() {() {() {() {returnreturnreturnreturn ein;}ein;}ein;}ein;}publicpublicpublicpublic voidvoidvoidvoid setEin(StringsetEin(StringsetEin(StringsetEin(String ein) {ein) {ein) {ein) {this.einthis.einthis.einthis.ein = ein;}= ein;}= ein;}= ein;}publicpublicpublicpublic intintintint getZahlgetZahlgetZahlgetZahl() {() {() {() {returnreturnreturnreturn zahl;}zahl;}zahl;}zahl;}publicpublicpublicpublic voidvoidvoidvoid setZahl(intsetZahl(intsetZahl(intsetZahl(int zahl) {zahl) {zahl) {zahl) {this.zahlthis.zahlthis.zahlthis.zahl = zahl;}= zahl;}= zahl;}= zahl;}

}}}}

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

333

JSF-Lifecycle verfolgen (4/8) - PhaseListener [1/2]

publicpublicpublicpublic classclassclassclass ZeichPhasenZeichPhasenZeichPhasenZeichPhasen implementsimplementsimplementsimplements PhaseListenerPhaseListenerPhaseListenerPhaseListener {{{{

// Hier angeben, in welchen Phasen dieser // Hier angeben, in welchen Phasen dieser // Hier angeben, in welchen Phasen dieser // Hier angeben, in welchen Phasen dieser ListenerListenerListenerListener genutztgenutztgenutztgenutzt// werden soll, im Beispiel in allen// werden soll, im Beispiel in allen// werden soll, im Beispiel in allen// werden soll, im Beispiel in allen@@@@OverrideOverrideOverrideOverridepublicpublicpublicpublic PhaseIdPhaseIdPhaseIdPhaseId getPhaseIdgetPhaseIdgetPhaseIdgetPhaseId() {() {() {() {returnreturnreturnreturn PhaseId.ANY_PHASEPhaseId.ANY_PHASEPhaseId.ANY_PHASEPhaseId.ANY_PHASE;;;;

}}}}

@@@@OverrideOverrideOverrideOverridepublicpublicpublicpublic voidvoidvoidvoid beforePhase(PhaseEventbeforePhase(PhaseEventbeforePhase(PhaseEventbeforePhase(PhaseEvent e) {e) {e) {e) {ifififif ((((e.getPhaseIde.getPhaseIde.getPhaseIde.getPhaseId() == () == () == () == PhaseId.RESTORE_VIEWPhaseId.RESTORE_VIEWPhaseId.RESTORE_VIEWPhaseId.RESTORE_VIEW) ) ) ) System.out.println("===gehtSystem.out.println("===gehtSystem.out.println("===gehtSystem.out.println("===geht los");los");los");los");

System.out.println("beforeSystem.out.println("beforeSystem.out.println("beforeSystem.out.println("before: " + : " + : " + : " + e.getPhaseIde.getPhaseIde.getPhaseIde.getPhaseId());());());());zeichAnalysezeichAnalysezeichAnalysezeichAnalyse();();();();

}}}}

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

334

JSF-Lifecycle verfolgen (5/8) - PhaseListener [1/2]

@@@@OverrideOverrideOverrideOverridepublicpublicpublicpublic voidvoidvoidvoid afterPhase(PhaseEventafterPhase(PhaseEventafterPhase(PhaseEventafterPhase(PhaseEvent e) {e) {e) {e) {System.out.println("afterSystem.out.println("afterSystem.out.println("afterSystem.out.println("after: " + : " + : " + : " + e.getPhaseIde.getPhaseIde.getPhaseIde.getPhaseId());());());());zeichAnalysezeichAnalysezeichAnalysezeichAnalyse();();();();ifififif ((((e.getPhaseIde.getPhaseIde.getPhaseIde.getPhaseId() == () == () == () == PhaseId.RENDER_RESPONSEPhaseId.RENDER_RESPONSEPhaseId.RENDER_RESPONSEPhaseId.RENDER_RESPONSE))))System.out.println("===isSystem.out.println("===isSystem.out.println("===isSystem.out.println("===is Schicht");Schicht");Schicht");Schicht");

}}}}

private private private private voidvoidvoidvoid zeichAnalysezeichAnalysezeichAnalysezeichAnalyse() {() {() {() {FacesContextFacesContextFacesContextFacesContext fcfcfcfc = = = = FacesContext.getCurrentInstanceFacesContext.getCurrentInstanceFacesContext.getCurrentInstanceFacesContext.getCurrentInstance();();();();Analyse a = Analyse a = Analyse a = Analyse a = fc.getApplicationfc.getApplicationfc.getApplicationfc.getApplication()()()()

....evaluateExpressionGet(fcevaluateExpressionGet(fcevaluateExpressionGet(fcevaluateExpressionGet(fc, "#{, "#{, "#{, "#{analyseanalyseanalyseanalyse}", }", }", }", Analyse.classAnalyse.classAnalyse.classAnalyse.class););););

System.out.println("ASystem.out.println("ASystem.out.println("ASystem.out.println("A: "+: "+: "+: "+a.getEina.getEina.getEina.getEin() +" :: "+ () +" :: "+ () +" :: "+ () +" :: "+ a.getZahla.getZahla.getZahla.getZahl());());());());}}}}

}}}}

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

335

JSF-Lifecycle verfolgen (6/8) - Applikationsstart

INFO: ===geht losINFO: ===geht losINFO: ===geht losINFO: ===geht los

INFO: INFO: INFO: INFO: beforebeforebeforebefore: RESTORE_VIEW 1: RESTORE_VIEW 1: RESTORE_VIEW 1: RESTORE_VIEW 1

INFO: A: null :: 0INFO: A: null :: 0INFO: A: null :: 0INFO: A: null :: 0

INFO: INFO: INFO: INFO: afterafterafterafter: RESTORE_VIEW 1: RESTORE_VIEW 1: RESTORE_VIEW 1: RESTORE_VIEW 1

INFO: A: null :: 0INFO: A: null :: 0INFO: A: null :: 0INFO: A: null :: 0

INFO: INFO: INFO: INFO: beforebeforebeforebefore: RENDER_RESPONSE 6: RENDER_RESPONSE 6: RENDER_RESPONSE 6: RENDER_RESPONSE 6

INFO: A: null :: 0INFO: A: null :: 0INFO: A: null :: 0INFO: A: null :: 0

INFO: INFO: INFO: INFO: afterafterafterafter: RENDER_RESPONSE 6: RENDER_RESPONSE 6: RENDER_RESPONSE 6: RENDER_RESPONSE 6

INFO: A: null :: 0INFO: A: null :: 0INFO: A: null :: 0INFO: A: null :: 0

INFO: ===INFO: ===INFO: ===INFO: ===isisisis SchichtSchichtSchichtSchicht

Nutzer macht EingabenNutzer macht EingabenNutzer macht EingabenNutzer macht Eingaben

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

336

JSF-Lifecycle verfolgen (7/8) - erfolgreiche ÜbernahmeINFO: ===geht losINFO: ===geht losINFO: ===geht losINFO: ===geht losINFO: INFO: INFO: INFO: beforebeforebeforebefore: RESTORE_VIEW 1: RESTORE_VIEW 1: RESTORE_VIEW 1: RESTORE_VIEW 1INFO: A: null :: 0INFO: A: null :: 0INFO: A: null :: 0INFO: A: null :: 0INFO: INFO: INFO: INFO: afterafterafterafter: RESTORE_VIEW 1: RESTORE_VIEW 1: RESTORE_VIEW 1: RESTORE_VIEW 1INFO: A: null :: 0INFO: A: null :: 0INFO: A: null :: 0INFO: A: null :: 0INFO: INFO: INFO: INFO: beforebeforebeforebefore: APPLY_REQUEST_VALUES 2: APPLY_REQUEST_VALUES 2: APPLY_REQUEST_VALUES 2: APPLY_REQUEST_VALUES 2INFO: A: null :: 0INFO: A: null :: 0INFO: A: null :: 0INFO: A: null :: 0INFO: INFO: INFO: INFO: afterafterafterafter: APPLY_REQUEST_VALUES 2: APPLY_REQUEST_VALUES 2: APPLY_REQUEST_VALUES 2: APPLY_REQUEST_VALUES 2INFO: A: null :: 0INFO: A: null :: 0INFO: A: null :: 0INFO: A: null :: 0INFO: INFO: INFO: INFO: beforebeforebeforebefore: PROCESS_VALIDATIONS 3: PROCESS_VALIDATIONS 3: PROCESS_VALIDATIONS 3: PROCESS_VALIDATIONS 3INFO: A: null :: 0INFO: A: null :: 0INFO: A: null :: 0INFO: A: null :: 0INFO: INFO: INFO: INFO: afterafterafterafter: PROCESS_VALIDATIONS 3: PROCESS_VALIDATIONS 3: PROCESS_VALIDATIONS 3: PROCESS_VALIDATIONS 3INFO: A: null :: 0INFO: A: null :: 0INFO: A: null :: 0INFO: A: null :: 0INFO: INFO: INFO: INFO: beforebeforebeforebefore: UPDATE_MODEL_VALUES 4: UPDATE_MODEL_VALUES 4: UPDATE_MODEL_VALUES 4: UPDATE_MODEL_VALUES 4INFO: A: null :: 0INFO: A: null :: 0INFO: A: null :: 0INFO: A: null :: 0INFO: INFO: INFO: INFO: afterafterafterafter: UPDATE_MODEL_VALUES 4: UPDATE_MODEL_VALUES 4: UPDATE_MODEL_VALUES 4: UPDATE_MODEL_VALUES 4INFO: A: INFO: A: INFO: A: INFO: A: ZaphodZaphodZaphodZaphod :: 42:: 42:: 42:: 42INFO: INFO: INFO: INFO: beforebeforebeforebefore: INVOKE_APPLICATION 5: INVOKE_APPLICATION 5: INVOKE_APPLICATION 5: INVOKE_APPLICATION 5INFO: A: INFO: A: INFO: A: INFO: A: ZaphodZaphodZaphodZaphod :: 42:: 42:: 42:: 42INFO: INFO: INFO: INFO: afterafterafterafter: INVOKE_APPLICATION 5: INVOKE_APPLICATION 5: INVOKE_APPLICATION 5: INVOKE_APPLICATION 5INFO: A: INFO: A: INFO: A: INFO: A: ZaphodZaphodZaphodZaphod :: 42:: 42:: 42:: 42INFO: INFO: INFO: INFO: beforebeforebeforebefore: RENDER_RESPONSE 6: RENDER_RESPONSE 6: RENDER_RESPONSE 6: RENDER_RESPONSE 6INFO: A: INFO: A: INFO: A: INFO: A: ZaphodZaphodZaphodZaphod :: 42:: 42:: 42:: 42INFO: INFO: INFO: INFO: afterafterafterafter: RENDER_RESPONSE 6: RENDER_RESPONSE 6: RENDER_RESPONSE 6: RENDER_RESPONSE 6INFO: A: INFO: A: INFO: A: INFO: A: ZaphodZaphodZaphodZaphod :: 42:: 42:: 42:: 42INFO: ===INFO: ===INFO: ===INFO: ===isisisis SchichtSchichtSchichtSchicht

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

337

JSF-Lifecycle verfolgen (8/8) - falsche EingabeINFO: ===geht losINFO: ===geht losINFO: ===geht losINFO: ===geht losINFO: INFO: INFO: INFO: beforebeforebeforebefore: RESTORE_VIEW 1: RESTORE_VIEW 1: RESTORE_VIEW 1: RESTORE_VIEW 1INFO: A: INFO: A: INFO: A: INFO: A: ZaphodZaphodZaphodZaphod :: 42:: 42:: 42:: 42INFO: INFO: INFO: INFO: afterafterafterafter: RESTORE_VIEW 1: RESTORE_VIEW 1: RESTORE_VIEW 1: RESTORE_VIEW 1INFO: A: INFO: A: INFO: A: INFO: A: ZaphodZaphodZaphodZaphod :: 42:: 42:: 42:: 42INFO: INFO: INFO: INFO: beforebeforebeforebefore: APPLY_REQUEST_VALUES 2: APPLY_REQUEST_VALUES 2: APPLY_REQUEST_VALUES 2: APPLY_REQUEST_VALUES 2INFO: A: INFO: A: INFO: A: INFO: A: ZaphodZaphodZaphodZaphod :: 42:: 42:: 42:: 42INFO: INFO: INFO: INFO: afterafterafterafter: APPLY_REQUEST_VALUES 2: APPLY_REQUEST_VALUES 2: APPLY_REQUEST_VALUES 2: APPLY_REQUEST_VALUES 2INFO: A: INFO: A: INFO: A: INFO: A: ZaphodZaphodZaphodZaphod :: 42:: 42:: 42:: 42INFO: INFO: INFO: INFO: beforebeforebeforebefore: PROCESS_VALIDATIONS 3: PROCESS_VALIDATIONS 3: PROCESS_VALIDATIONS 3: PROCESS_VALIDATIONS 3INFO: A: INFO: A: INFO: A: INFO: A: ZaphodZaphodZaphodZaphod :: 42:: 42:: 42:: 42INFO: INFO: INFO: INFO: afterafterafterafter: PROCESS_VALIDATIONS 3: PROCESS_VALIDATIONS 3: PROCESS_VALIDATIONS 3: PROCESS_VALIDATIONS 3INFO: A: INFO: A: INFO: A: INFO: A: ZaphodZaphodZaphodZaphod :: 42:: 42:: 42:: 42INFO: INFO: INFO: INFO: beforebeforebeforebefore: RENDER_RESPONSE 6: RENDER_RESPONSE 6: RENDER_RESPONSE 6: RENDER_RESPONSE 6INFO: A: INFO: A: INFO: A: INFO: A: ZaphodZaphodZaphodZaphod :: 42:: 42:: 42:: 42INFO: INFO: INFO: INFO: afterafterafterafter: RENDER_RESPONSE 6: RENDER_RESPONSE 6: RENDER_RESPONSE 6: RENDER_RESPONSE 6INFO: A: INFO: A: INFO: A: INFO: A: ZaphodZaphodZaphodZaphod :: 42:: 42:: 42:: 42INFO: ===INFO: ===INFO: ===INFO: ===isisisis SchichtSchichtSchichtSchicht

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

338

Problem: Abbrüche (1/2)in Analyse :

publicpublicpublicpublic String String String String zuruecksetzenzuruecksetzenzuruecksetzenzuruecksetzen(){(){(){(){ein="";ein="";ein="";ein="";zahl=0;zahl=0;zahl=0;zahl=0;returnreturnreturnreturn "./"./"./"./index.xhtmlindex.xhtmlindex.xhtmlindex.xhtml";";";";

}}}}

• in index.xhtml

<<<<h:commandButtonh:commandButtonh:commandButtonh:commandButton id="c2" id="c2" id="c2" id="c2" value="Zurvalue="Zurvalue="Zurvalue="Zurüüüücksetzencksetzencksetzencksetzen" " " " action="#{analyse.zuruecksetzenaction="#{analyse.zuruecksetzenaction="#{analyse.zuruecksetzenaction="#{analyse.zuruecksetzen}"/>}"/>}"/>}"/>

• Problem: Validierung läuft trotzdem

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

339

Problem: Abbrüche (2/2)

• immediate=„true“ erlaubt Validierung zu überspringen

<<<<h:commandButtonh:commandButtonh:commandButtonh:commandButton id="c2" id="c2" id="c2" id="c2" value="Zurvalue="Zurvalue="Zurvalue="Zurüüüücksetzencksetzencksetzencksetzen" " " " immediate="trueimmediate="trueimmediate="trueimmediate="true" " " " action="#{analyse.zuruecksetzenaction="#{analyse.zuruecksetzenaction="#{analyse.zuruecksetzenaction="#{analyse.zuruecksetzen}"/>}"/>}"/>}"/>

===geht los===geht los===geht los===geht losbeforebeforebeforebefore: RESTORE_VIEW 1: RESTORE_VIEW 1: RESTORE_VIEW 1: RESTORE_VIEW 1A: A: A: A: ZaphodZaphodZaphodZaphod :: 42:: 42:: 42:: 42afterafterafterafter: RESTORE_VIEW 1: RESTORE_VIEW 1: RESTORE_VIEW 1: RESTORE_VIEW 1A: A: A: A: ZaphodZaphodZaphodZaphod :: 42:: 42:: 42:: 42beforebeforebeforebefore: APPLY_REQUEST_VALUES 2: APPLY_REQUEST_VALUES 2: APPLY_REQUEST_VALUES 2: APPLY_REQUEST_VALUES 2A: A: A: A: ZaphodZaphodZaphodZaphod :: 42:: 42:: 42:: 42afterafterafterafter: APPLY_REQUEST_VALUES 2: APPLY_REQUEST_VALUES 2: APPLY_REQUEST_VALUES 2: APPLY_REQUEST_VALUES 2A: :: 0A: :: 0A: :: 0A: :: 0beforebeforebeforebefore: RENDER_RESPONSE 6: RENDER_RESPONSE 6: RENDER_RESPONSE 6: RENDER_RESPONSE 6A: :: 0A: :: 0A: :: 0A: :: 0afterafterafterafter: RENDER_RESPONSE 6: RENDER_RESPONSE 6: RENDER_RESPONSE 6: RENDER_RESPONSE 6A: :: 0A: :: 0A: :: 0A: :: 0============isisisis SchichtSchichtSchichtSchicht

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

340

Nutzung von immediate für Eingabefelder

• immediate=true fordert sofortige Validierung und Konvertierung für diese Komponente

<<<<h:inputTexth:inputTexth:inputTexth:inputText id="i1" id="i1" id="i1" id="i1" value="#{analyse.einvalue="#{analyse.einvalue="#{analyse.einvalue="#{analyse.ein}" }" }" }" immediate="trueimmediate="trueimmediate="trueimmediate="true" " " " validatorMessage="nurvalidatorMessage="nurvalidatorMessage="nurvalidatorMessage="nur 3">3">3">3">

<<<<f:validateLengthf:validateLengthf:validateLengthf:validateLength maximum="3"/>maximum="3"/>maximum="3"/>maximum="3"/></</</</h:inputTexth:inputTexth:inputTexth:inputText>>>>

===geht los===geht los===geht los===geht losbeforebeforebeforebefore: RESTORE_VIEW 1: RESTORE_VIEW 1: RESTORE_VIEW 1: RESTORE_VIEW 1A: null :: 0A: null :: 0A: null :: 0A: null :: 0afterafterafterafter: RESTORE_VIEW 1: RESTORE_VIEW 1: RESTORE_VIEW 1: RESTORE_VIEW 1A: null :: 0A: null :: 0A: null :: 0A: null :: 0beforebeforebeforebefore: APPLY_REQUEST_VALUES 2: APPLY_REQUEST_VALUES 2: APPLY_REQUEST_VALUES 2: APPLY_REQUEST_VALUES 2A: null :: 0A: null :: 0A: null :: 0A: null :: 0afterafterafterafter: APPLY_REQUEST_VALUES 2: APPLY_REQUEST_VALUES 2: APPLY_REQUEST_VALUES 2: APPLY_REQUEST_VALUES 2A: null :: 0A: null :: 0A: null :: 0A: null :: 0beforebeforebeforebefore: RENDER_RESPONSE 6: RENDER_RESPONSE 6: RENDER_RESPONSE 6: RENDER_RESPONSE 6A: null :: 0A: null :: 0A: null :: 0A: null :: 0afterafterafterafter: RENDER_RESPONSE 6: RENDER_RESPONSE 6: RENDER_RESPONSE 6: RENDER_RESPONSE 6A: null :: 0A: null :: 0A: null :: 0A: null :: 0============isisisis SchichtSchichtSchichtSchicht

<Return> im Eingabefeld drücken

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

341

Eineinhalb Schleifen

public String public String public String public String uebernehmenuebernehmenuebernehmenuebernehmen(){(){(){(){return "./return "./return "./return "./index.xhtml?facesindex.xhtml?facesindex.xhtml?facesindex.xhtml?faces----redirect=true";redirect=true";redirect=true";redirect=true";

}}}}

// wie vorher// wie vorher// wie vorher// wie vorherINFO: INFO: INFO: INFO: beforebeforebeforebefore: INVOKE_APPLICATION 5: INVOKE_APPLICATION 5: INVOKE_APPLICATION 5: INVOKE_APPLICATION 5INFO: A: INFO: A: INFO: A: INFO: A: ZaphodZaphodZaphodZaphod :: 42:: 42:: 42:: 42INFO: INFO: INFO: INFO: afterafterafterafter: INVOKE_APPLICATION 5: INVOKE_APPLICATION 5: INVOKE_APPLICATION 5: INVOKE_APPLICATION 5INFO: A: INFO: A: INFO: A: INFO: A: ZaphodZaphodZaphodZaphod :: 42:: 42:: 42:: 42INFO: ===geht losINFO: ===geht losINFO: ===geht losINFO: ===geht losINFO: INFO: INFO: INFO: beforebeforebeforebefore: RESTORE_VIEW 1: RESTORE_VIEW 1: RESTORE_VIEW 1: RESTORE_VIEW 1INFO: A: INFO: A: INFO: A: INFO: A: ZaphodZaphodZaphodZaphod :: 42:: 42:: 42:: 42INFO: INFO: INFO: INFO: afterafterafterafter: RESTORE_VIEW 1: RESTORE_VIEW 1: RESTORE_VIEW 1: RESTORE_VIEW 1INFO: A: INFO: A: INFO: A: INFO: A: ZaphodZaphodZaphodZaphod :: 42:: 42:: 42:: 42INFO: INFO: INFO: INFO: beforebeforebeforebefore: RENDER_RESPONSE 6: RENDER_RESPONSE 6: RENDER_RESPONSE 6: RENDER_RESPONSE 6INFO: A: INFO: A: INFO: A: INFO: A: ZaphodZaphodZaphodZaphod :: 42:: 42:: 42:: 42INFO: INFO: INFO: INFO: afterafterafterafter: RENDER_RESPONSE 6: RENDER_RESPONSE 6: RENDER_RESPONSE 6: RENDER_RESPONSE 6INFO: A: INFO: A: INFO: A: INFO: A: ZaphodZaphodZaphodZaphod :: 42:: 42:: 42:: 42INFO: ===INFO: ===INFO: ===INFO: ===isisisis SchichtSchichtSchichtSchicht

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

342

JSF und CSS (1/3)

• CSS-Dateiengrundsätzlich nutzbar

• keine einfache Einstellung einmal für alles, da CSS keine Vererbung bzw. kontextabhängige Nutzung ermöglicht

• fast allen JSF-Elementenkönnen Style-Klassen(genauer Stylespezifikationen) und konkrete Styleszugeordnet werden

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

343

JSF und CSS (2/3) – Ausschnitt aus Anwendung

<<<<htmlhtmlhtmlhtml>>>><<<<headheadheadhead>>>><<<<metametametameta httphttphttphttp----equiv="Contentequiv="Contentequiv="Contentequiv="Content----TypeTypeTypeType" " " " content="text/htmlcontent="text/htmlcontent="text/htmlcontent="text/html; ; ; ;

charset=UTFcharset=UTFcharset=UTFcharset=UTF----8"/>8"/>8"/>8"/><<<<title>Module</titletitle>Module</titletitle>Module</titletitle>Module</title>>>><link <link <link <link rel="stylesheetrel="stylesheetrel="stylesheetrel="stylesheet" " " " type="text/csstype="text/csstype="text/csstype="text/css" " " "

href="/JSFCSS/css/stil.csshref="/JSFCSS/css/stil.csshref="/JSFCSS/css/stil.csshref="/JSFCSS/css/stil.css" />" />" />" /></</</</headheadheadhead> <> <> <> <bodybodybodybody> <> <> <> <f:viewf:viewf:viewf:view>>>>

<<<<h:formh:formh:formh:form id="f2">id="f2">id="f2">id="f2"><<<<h:messagesh:messagesh:messagesh:messages styleClass="infoClassstyleClass="infoClassstyleClass="infoClassstyleClass="infoClass" " " " globalOnly="trueglobalOnly="trueglobalOnly="trueglobalOnly="true"/>"/>"/>"/><<<<h:panelGridh:panelGridh:panelGridh:panelGrid rendered="#{!emptyrendered="#{!emptyrendered="#{!emptyrendered="#{!empty module.modulemodule.modulemodule.modulemodule.module}">}">}">}"><<<<h:dataTableh:dataTableh:dataTableh:dataTable value="#{module.modulevalue="#{module.modulevalue="#{module.modulevalue="#{module.module}" }" }" }" var="mvar="mvar="mvar="m""""

styleClass="resultGridstyleClass="resultGridstyleClass="resultGridstyleClass="resultGrid" " " " rowClasses="oddRow,evenRowrowClasses="oddRow,evenRowrowClasses="oddRow,evenRowrowClasses="oddRow,evenRow">">">">

............

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

344

JSF und CSS (3/3) - Beispielausgabe

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

345

Facelets - Motivation

• entwickelt, um JSP als View Declaration Language zu

ersetzen

• Template-Ansatz um Wiederverwendung zu ermöglichen

und Redundanzen zu vermeiden

• ein Ziel: Zusammensetzung eine logischen Seite aus

verschiedenen Dateien unter Nutzung von Parametern

• JSF-View in XHTML-Syntax [nutzen wir immer]

• Erweiterungsmöglichkeit mit tag-Libraries (vgl. JSTL für JSP)

• MVC-Ansatz, kein Java-Code in XHTML möglich

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

346

Erstes Template-Beispiel (1/5) - Template rahmen.xhtml

<?<?<?<?xmlxmlxmlxml version='1.0' encoding='UTFversion='1.0' encoding='UTFversion='1.0' encoding='UTFversion='1.0' encoding='UTF----8' ?>8' ?>8' ?>8' ?><!DOCTYPE <!DOCTYPE <!DOCTYPE <!DOCTYPE htmlhtmlhtmlhtml PUBLIC "PUBLIC "PUBLIC "PUBLIC "----//W3C//DTD XHTML 1.0 //W3C//DTD XHTML 1.0 //W3C//DTD XHTML 1.0 //W3C//DTD XHTML 1.0 Transitional//ENTransitional//ENTransitional//ENTransitional//EN" " " "

"http://www.w3.org/TR/xhtml1/DTD/xhtml1"http://www.w3.org/TR/xhtml1/DTD/xhtml1"http://www.w3.org/TR/xhtml1/DTD/xhtml1"http://www.w3.org/TR/xhtml1/DTD/xhtml1----transitional.dtd">transitional.dtd">transitional.dtd">transitional.dtd"><<<<htmlhtmlhtmlhtml xmlns="http://www.w3.org/1999/xhtml"xmlns="http://www.w3.org/1999/xhtml"xmlns="http://www.w3.org/1999/xhtml"xmlns="http://www.w3.org/1999/xhtml"

xmlns:h="http://java.sun.com/jsf/htmlxmlns:h="http://java.sun.com/jsf/htmlxmlns:h="http://java.sun.com/jsf/htmlxmlns:h="http://java.sun.com/jsf/html""""xmlns:ui="http://java.sun.com/jsf/faceletsxmlns:ui="http://java.sun.com/jsf/faceletsxmlns:ui="http://java.sun.com/jsf/faceletsxmlns:ui="http://java.sun.com/jsf/facelets">">">">

<<<<h:headh:headh:headh:head>>>><<<<imgimgimgimg src="./bilder/boah.jpgsrc="./bilder/boah.jpgsrc="./bilder/boah.jpgsrc="./bilder/boah.jpg" width="200" height="40" " width="200" height="40" " width="200" height="40" " width="200" height="40" alt="boahalt="boahalt="boahalt="boah"/>"/>"/>"/><title><title><title><title><<<<ui:insertui:insertui:insertui:insert name="titelname="titelname="titelname="titel"/>"/>"/>"/>

</title></title></title></title></</</</h:headh:headh:headh:head>>>><<<<h:bodyh:bodyh:bodyh:body>>>><<<<h:formh:formh:formh:form>>>><<<<ui:insertui:insertui:insertui:insert name="rumpfname="rumpfname="rumpfname="rumpf"/>"/>"/>"/><<<<brbrbrbr/> </> </> </> <brbrbrbr/>/>/>/><<<<h:commandLinkh:commandLinkh:commandLinkh:commandLink value="Zurvalue="Zurvalue="Zurvalue="Zurüüüückckckck" " " " action="#{bsp.zurueckaction="#{bsp.zurueckaction="#{bsp.zurueckaction="#{bsp.zurueck}"/>}"/>}"/>}"/>

</</</</h:formh:formh:formh:form>>>></</</</h:bodyh:bodyh:bodyh:body>>>>

</</</</htmlhtmlhtmlhtml>>>>

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

347

Erstes Template-Beispiel (2/5) - Bean

@@@@ManagedBeanManagedBeanManagedBeanManagedBean@@@@RequestScopedRequestScopedRequestScopedRequestScopedpublicpublicpublicpublic classclassclassclass BspBspBspBsp {{{{publicpublicpublicpublic String String String String getErgebnisgetErgebnisgetErgebnisgetErgebnis(){(){(){(){returnreturnreturnreturn "Du solltest Dich "Du solltest Dich "Du solltest Dich "Du solltest Dich äääändern";ndern";ndern";ndern";

}}}}

publicpublicpublicpublic String bad(){String bad(){String bad(){String bad(){returnreturnreturnreturn "./"./"./"./analyse.xhtmlanalyse.xhtmlanalyse.xhtmlanalyse.xhtml";";";";

}}}}

publicpublicpublicpublic String good(){String good(){String good(){String good(){returnreturnreturnreturn "./"./"./"./analyse.xhtmlanalyse.xhtmlanalyse.xhtmlanalyse.xhtml";";";";

}}}}

publicpublicpublicpublic String String String String zurueckzurueckzurueckzurueck(){(){(){(){returnreturnreturnreturn "./"./"./"./index.xhtmlindex.xhtmlindex.xhtmlindex.xhtml";";";";

}}}}}}}}

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

348

Erstes Template-Beispiel (3/5) - index.xhtml

<?<?<?<?xmlxmlxmlxml version='1.0' encoding='UTFversion='1.0' encoding='UTFversion='1.0' encoding='UTFversion='1.0' encoding='UTF----8' ?>8' ?>8' ?>8' ?><!DOCTYPE <!DOCTYPE <!DOCTYPE <!DOCTYPE htmlhtmlhtmlhtml PUBLIC "PUBLIC "PUBLIC "PUBLIC "----//W3C//DTD XHTML 1.0 //W3C//DTD XHTML 1.0 //W3C//DTD XHTML 1.0 //W3C//DTD XHTML 1.0 Transitional//ENTransitional//ENTransitional//ENTransitional//EN" " " "

"http://www.w3.org/TR/xhtml1/DTD/xhtml1"http://www.w3.org/TR/xhtml1/DTD/xhtml1"http://www.w3.org/TR/xhtml1/DTD/xhtml1"http://www.w3.org/TR/xhtml1/DTD/xhtml1----transitional.dtd">transitional.dtd">transitional.dtd">transitional.dtd"><<<<htmlhtmlhtmlhtml xmlns="http://www.w3.org/1999/xhtml"xmlns="http://www.w3.org/1999/xhtml"xmlns="http://www.w3.org/1999/xhtml"xmlns="http://www.w3.org/1999/xhtml"

xmlns:h="http://java.sun.com/jsf/htmlxmlns:h="http://java.sun.com/jsf/htmlxmlns:h="http://java.sun.com/jsf/htmlxmlns:h="http://java.sun.com/jsf/html""""xmlns:ui="http://java.sun.com/jsf/faceletsxmlns:ui="http://java.sun.com/jsf/faceletsxmlns:ui="http://java.sun.com/jsf/faceletsxmlns:ui="http://java.sun.com/jsf/facelets">">">">

<<<<h:bodyh:bodyh:bodyh:body>>>><<<<ui:compositionui:compositionui:compositionui:composition template="//templates/rahmen.xhtmltemplate="//templates/rahmen.xhtmltemplate="//templates/rahmen.xhtmltemplate="//templates/rahmen.xhtml">">">"><<<<ui:defineui:defineui:defineui:define name="titelname="titelname="titelname="titel">">">">WesenstestWesenstestWesenstestWesenstest

</</</</ui:defineui:defineui:defineui:define>>>><<<<ui:defineui:defineui:defineui:define name="rumpfname="rumpfname="rumpfname="rumpf">">">"><<<<h:outputTexth:outputTexth:outputTexth:outputText value="Wasvalue="Wasvalue="Wasvalue="Was bist Du?"/>bist Du?"/>bist Du?"/>bist Du?"/><<<<brbrbrbr/>/>/>/><<<<h:commandButtonh:commandButtonh:commandButtonh:commandButton value="Badvalue="Badvalue="Badvalue="Bad Guy" Guy" Guy" Guy" action="#{bsp.badaction="#{bsp.badaction="#{bsp.badaction="#{bsp.bad}"/>}"/>}"/>}"/><<<<h:commandButtonh:commandButtonh:commandButtonh:commandButton value="Goodvalue="Goodvalue="Goodvalue="Good Boy" Boy" Boy" Boy" action="#{bsp.goodaction="#{bsp.goodaction="#{bsp.goodaction="#{bsp.good}"/>}"/>}"/>}"/>

</</</</ui:defineui:defineui:defineui:define>>>></</</</ui:compositionui:compositionui:compositionui:composition>>>>

</</</</h:bodyh:bodyh:bodyh:body>>>></</</</htmlhtmlhtmlhtml>>>>

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

349

Erstes Template-Beispiel (4/5) - analyse.xhtml

<?<?<?<?xmlxmlxmlxml version='1.0' encoding='UTFversion='1.0' encoding='UTFversion='1.0' encoding='UTFversion='1.0' encoding='UTF----8' ?>8' ?>8' ?>8' ?><!DOCTYPE <!DOCTYPE <!DOCTYPE <!DOCTYPE htmlhtmlhtmlhtml PUBLIC "PUBLIC "PUBLIC "PUBLIC "----//W3C//DTD XHTML 1.0 //W3C//DTD XHTML 1.0 //W3C//DTD XHTML 1.0 //W3C//DTD XHTML 1.0

Transitional//ENTransitional//ENTransitional//ENTransitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1" "http://www.w3.org/TR/xhtml1/DTD/xhtml1" "http://www.w3.org/TR/xhtml1/DTD/xhtml1" "http://www.w3.org/TR/xhtml1/DTD/xhtml1----transitional.dtd">transitional.dtd">transitional.dtd">transitional.dtd">

<<<<htmlhtmlhtmlhtml xmlns="http://www.w3.org/1999/xhtml"xmlns="http://www.w3.org/1999/xhtml"xmlns="http://www.w3.org/1999/xhtml"xmlns="http://www.w3.org/1999/xhtml"xmlns:h="http://java.sun.com/jsf/htmlxmlns:h="http://java.sun.com/jsf/htmlxmlns:h="http://java.sun.com/jsf/htmlxmlns:h="http://java.sun.com/jsf/html""""xmlns:ui="http://java.sun.com/jsf/faceletsxmlns:ui="http://java.sun.com/jsf/faceletsxmlns:ui="http://java.sun.com/jsf/faceletsxmlns:ui="http://java.sun.com/jsf/facelets">">">">

<<<<h:bodyh:bodyh:bodyh:body>>>><<<<ui:compositionui:compositionui:compositionui:composition template="//templates/rahmen.xhtmltemplate="//templates/rahmen.xhtmltemplate="//templates/rahmen.xhtmltemplate="//templates/rahmen.xhtml">">">"><<<<ui:defineui:defineui:defineui:define name="titelname="titelname="titelname="titel">">">">ErgebnisErgebnisErgebnisErgebnis

</</</</ui:defineui:defineui:defineui:define>>>><<<<ui:defineui:defineui:defineui:define name="rumpfname="rumpfname="rumpfname="rumpf">">">"><<<<h:outputTexth:outputTexth:outputTexth:outputText value="#{bsp.ergebnisvalue="#{bsp.ergebnisvalue="#{bsp.ergebnisvalue="#{bsp.ergebnis}"/>}"/>}"/>}"/>

</</</</ui:defineui:defineui:defineui:define>>>></</</</ui:compositionui:compositionui:compositionui:composition>>>>

</</</</h:bodyh:bodyh:bodyh:body>>>></</</</htmlhtmlhtmlhtml>>>>

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

350

Erstes Template-Beispiel (5/5) - Nutzung

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

351

Aufbau genauer analysiert

• in index.xhtml<<<<h:bodyh:bodyh:bodyh:body>>>>

<<<<ui:compositionui:compositionui:compositionui:composition template="//templates/rahmen.xhtmltemplate="//templates/rahmen.xhtmltemplate="//templates/rahmen.xhtmltemplate="//templates/rahmen.xhtml">">">">• im Template wird <h:head> gesetzt

• generell werden mit ui:composition Kinder des

Wurzelknotens UIViewRoot erzeugt

• soll umgebender Text und Struktur berücksichtigt werden,

ist ui:decorate zu nutzen; immer bei mehreren Templates

• Beispiel: folgender Text nur bei ui:decorate sichtbar

<<<<h:bodyh:bodyh:bodyh:body>>>>

<<<<h:outputTexth:outputTexth:outputTexth:outputText value="Hallo"/>value="Hallo"/>value="Hallo"/>value="Hallo"/>

<<<<ui:decorateui:decorateui:decorateui:decorate template="//templates/template="//templates/template="//templates/template="//templates/rahmen.xhtmlrahmen.xhtmlrahmen.xhtmlrahmen.xhtml">">">">

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

352

Nutzung von Parametern

• in rahmen.xhtml

<<<<h:commandLinkh:commandLinkh:commandLinkh:commandLink value="Zurvalue="Zurvalue="Zurvalue="Zurüüüückckckck" " " " action="#{bsp.zurueckaction="#{bsp.zurueckaction="#{bsp.zurueckaction="#{bsp.zurueck}" }" }" }"

rendered="#{!startrendered="#{!startrendered="#{!startrendered="#{!start}"/>}"/>}"/>}"/>

• in index.xhtml

<<<<ui:compositionui:compositionui:compositionui:composition template="//templates/rahmen.xhtmltemplate="//templates/rahmen.xhtmltemplate="//templates/rahmen.xhtmltemplate="//templates/rahmen.xhtml">">">">

<<<<ui:paramui:paramui:paramui:param name="startname="startname="startname="start" " " " value="truevalue="truevalue="truevalue="true"/>"/>"/>"/>

<<<<ui:defineui:defineui:defineui:define name="titelname="titelname="titelname="titel">">">">

• in analyse.xhtml

<<<<ui:compositionui:compositionui:compositionui:composition template="//templates/rahmen.xhtmltemplate="//templates/rahmen.xhtmltemplate="//templates/rahmen.xhtmltemplate="//templates/rahmen.xhtml">">">">

<<<<ui:paramui:paramui:paramui:param name="startname="startname="startname="start" " " " value="falsevalue="falsevalue="falsevalue="false"/>"/>"/>"/>

• Parameter auch bei anderen Elementen nutzbar

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

353

Nutzung von ui:include (1/2) - index.xhtml

<?<?<?<?xmlxmlxmlxml version='1.0' encoding='UTFversion='1.0' encoding='UTFversion='1.0' encoding='UTFversion='1.0' encoding='UTF----8' ?>8' ?>8' ?>8' ?><!DOCTYPE <!DOCTYPE <!DOCTYPE <!DOCTYPE htmlhtmlhtmlhtml PUBLIC "PUBLIC "PUBLIC "PUBLIC "----//W3C//DTD XHTML 1.0 //W3C//DTD XHTML 1.0 //W3C//DTD XHTML 1.0 //W3C//DTD XHTML 1.0 Transitional//ENTransitional//ENTransitional//ENTransitional//EN" " " "

"http://www.w3.org/TR/xhtml1/DTD/xhtml1"http://www.w3.org/TR/xhtml1/DTD/xhtml1"http://www.w3.org/TR/xhtml1/DTD/xhtml1"http://www.w3.org/TR/xhtml1/DTD/xhtml1----transitional.dtd">transitional.dtd">transitional.dtd">transitional.dtd"><<<<htmlhtmlhtmlhtml xmlns="http://www.w3.org/1999/xhtml"xmlns="http://www.w3.org/1999/xhtml"xmlns="http://www.w3.org/1999/xhtml"xmlns="http://www.w3.org/1999/xhtml"

xmlns:ui="http://java.sun.com/jsf/faceletsxmlns:ui="http://java.sun.com/jsf/faceletsxmlns:ui="http://java.sun.com/jsf/faceletsxmlns:ui="http://java.sun.com/jsf/facelets">">">"><<<<ui:includeui:includeui:includeui:include src="./templates/head.xhtmlsrc="./templates/head.xhtmlsrc="./templates/head.xhtmlsrc="./templates/head.xhtml">">">"><<<<ui:paramui:paramui:paramui:param name="titelname="titelname="titelname="titel" " " " value="Hallodelevalue="Hallodelevalue="Hallodelevalue="Hallodele"/>"/>"/>"/>

</</</</ui:includeui:includeui:includeui:include>>>><<<<ui:includeui:includeui:includeui:include src="./templates/body.xhtmlsrc="./templates/body.xhtmlsrc="./templates/body.xhtmlsrc="./templates/body.xhtml">">">"><<<<ui:paramui:paramui:paramui:param name="textname="textname="textname="text" " " " value="rischtischvalue="rischtischvalue="rischtischvalue="rischtisch"/>"/>"/>"/><<<<ui:paramui:paramui:paramui:param name="objname="objname="objname="obj" " " " value="#{bspvalue="#{bspvalue="#{bspvalue="#{bsp}"/>}"/>}"/>}"/>

</</</</ui:includeui:includeui:includeui:include>>>></</</</htmlhtmlhtmlhtml>>>>

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

354

Nutzung von ui:include (2/2) - head/body.xhtml

<?<?<?<?xmlxmlxmlxml version='1.0' encoding='UTFversion='1.0' encoding='UTFversion='1.0' encoding='UTFversion='1.0' encoding='UTF----8' ?>8' ?>8' ?>8' ?><!DOCTYPE <!DOCTYPE <!DOCTYPE <!DOCTYPE htmlhtmlhtmlhtml PUBLIC "PUBLIC "PUBLIC "PUBLIC "----//W3C//DTD XHTML 1.0 //W3C//DTD XHTML 1.0 //W3C//DTD XHTML 1.0 //W3C//DTD XHTML 1.0 Transitional//ENTransitional//ENTransitional//ENTransitional//EN" " " "

"http://www.w3.org/TR/xhtml1/DTD/xhtml1"http://www.w3.org/TR/xhtml1/DTD/xhtml1"http://www.w3.org/TR/xhtml1/DTD/xhtml1"http://www.w3.org/TR/xhtml1/DTD/xhtml1----transitional.dtd">transitional.dtd">transitional.dtd">transitional.dtd"><<<<htmlhtmlhtmlhtml xmlns="http://www.w3.org/1999/xhtml"xmlns="http://www.w3.org/1999/xhtml"xmlns="http://www.w3.org/1999/xhtml"xmlns="http://www.w3.org/1999/xhtml"

xmlns:h="http://java.sun.com/jsf/htmlxmlns:h="http://java.sun.com/jsf/htmlxmlns:h="http://java.sun.com/jsf/htmlxmlns:h="http://java.sun.com/jsf/html">">">"><<<<h:headh:headh:headh:head>>>><title> <<title> <<title> <<title> <h:outputTexth:outputTexth:outputTexth:outputText value="#{titelvalue="#{titelvalue="#{titelvalue="#{titel}"/> </title>}"/> </title>}"/> </title>}"/> </title>

</</</</h:headh:headh:headh:head>>>></</</</htmlhtmlhtmlhtml>>>>

<?<?<?<?xmlxmlxmlxml version='1.0' encoding='UTFversion='1.0' encoding='UTFversion='1.0' encoding='UTFversion='1.0' encoding='UTF----8' ?>8' ?>8' ?>8' ?><!DOCTYPE <!DOCTYPE <!DOCTYPE <!DOCTYPE htmlhtmlhtmlhtml PUBLIC "PUBLIC "PUBLIC "PUBLIC "----//W3C//DTD XHTML 1.0 //W3C//DTD XHTML 1.0 //W3C//DTD XHTML 1.0 //W3C//DTD XHTML 1.0 Transitional//ENTransitional//ENTransitional//ENTransitional//EN" " " "

"http://www.w3.org/TR/xhtml1/DTD/xhtml1"http://www.w3.org/TR/xhtml1/DTD/xhtml1"http://www.w3.org/TR/xhtml1/DTD/xhtml1"http://www.w3.org/TR/xhtml1/DTD/xhtml1----transitional.dtd">transitional.dtd">transitional.dtd">transitional.dtd"><<<<htmlhtmlhtmlhtml xmlns="http://www.w3.org/1999/xhtml"xmlns="http://www.w3.org/1999/xhtml"xmlns="http://www.w3.org/1999/xhtml"xmlns="http://www.w3.org/1999/xhtml"

xmlns:h="http://java.sun.com/jsf/htmlxmlns:h="http://java.sun.com/jsf/htmlxmlns:h="http://java.sun.com/jsf/htmlxmlns:h="http://java.sun.com/jsf/html">">">"><<<<h:bodyh:bodyh:bodyh:body>>>><h3> <<h3> <<h3> <<h3> <h:outputTexth:outputTexth:outputTexth:outputText value="#{textvalue="#{textvalue="#{textvalue="#{text}"/> </h3>}"/> </h3>}"/> </h3>}"/> </h3><<<<h:outputTexth:outputTexth:outputTexth:outputText value="#{obj.ergebnisvalue="#{obj.ergebnisvalue="#{obj.ergebnisvalue="#{obj.ergebnis}"/>}"/>}"/>}"/>

</</</</h:bodyh:bodyh:bodyh:body>>>></</</</htmlhtmlhtmlhtml>>>>

Komponentenbasierte Software-

Entwicklung

Prof. Dr.

Stephan Kleuker

355

Nutzung vo ui:debug

• Im Development- oder Debug-Modus erhält man durch

Drücken von CTRL+SHIFT+d Komponentenbaum angezeigt<<<<htmlhtmlhtmlhtml xmlns="http://www.w3.org/1999/xhtml"xmlns="http://www.w3.org/1999/xhtml"xmlns="http://www.w3.org/1999/xhtml"xmlns="http://www.w3.org/1999/xhtml"

xmlns:ui="http://java.sun.com/jsf/faceletsxmlns:ui="http://java.sun.com/jsf/faceletsxmlns:ui="http://java.sun.com/jsf/faceletsxmlns:ui="http://java.sun.com/jsf/facelets">">">"><<<<ui:debugui:debugui:debugui:debug/>/>/>/><<<<ui:includeui:includeui:includeui:include src="./templates/head.xhtmlsrc="./templates/head.xhtmlsrc="./templates/head.xhtmlsrc="./templates/head.xhtml">">">">