5. JavaServer Faces (JSF)

Werbung
5. JavaServer Faces (JSF)
•
•
•
•
•
•
•
•
Grundlagen
Nutzung von JSF-Annotationen
Validierung von Eingaben
Ausgabe von Fehlermeldungen
Auswahl darzustellender Elemente
typische elementare Software-Architektur
JSF + JPA
Visualisierungskomponenten
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
207
Literatur
• M. Marinschek, M. Kurz, G. Müllan, JavaServer Faces 2.0,
dpunkt, Heidelberg, 2010 (im Wesentlich auch:
http://tutorials.irian.at/jsf/semistatic/introduction.html)
• K. Ka Iok Tong, Beginning JSF 2 APIs and JBoss Seam, Apress,
Berkeley, USA, 2009
• Standard: Sun, JSR 314: JavaServer Faces 2.0,
http://www.jcp.org/en/jsr/detail?id=314
• Sun, JEE6 Tutorial,
http://java.sun.com/javaee/6/docs/tutorial/doc
• Bücher fixieren teilweise auf Eclipse und JBoss; nicht
notwendig, funktioniert fast alles mit Netbeans und
Glassfish / Apache
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
208
Generelle Ziele
verschiedene Ziele
• Software, die Web als zusätzlichen Nutzen hat (z. B. WebPräsenz, Kataloge, Bestellmöglichkeiten)
• verteilte Softwaresysteme, die Netz als
Komponentenverbindung nutzen (z. B. B2B)
• Arbeitsplatzsoftware, die auch das Web nutzt (nahtlose
Integration, Web ist „unsichtbar“)
• letztes Ziel gewinnt immer mehr Bedeutung für andere Ziele
• Aber: Nicht immer ist Web-fähige Software gewünscht!
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
209
Technische Herausforderungen (1/2)
auf welchem Rechner läuft welche Software
• zentraler Server oder peer-to-peer
• Client-Server, wer ist thin, wer ist fat
Browser-fähig oder standalone
• welcher Browser, welche Sicherheitseinstellungen, welche
Plugins, welches HTML
• Wie bekommt Kunde Software zum Laufen, wie
funktionieren Updates
• darf man, muss man offline arbeiten können
• Usability
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
210
Technische Herausforderungen (2/2)
Sicherheit
• wie Daten sicher verschicken, wem gehört Internet, wer
muss zuhören dürfen
Performance und Stabilität
• schnelle Antworten auch bei Last
• saubere, reproduzierbare Transaktionen
• was passiert bei Netzausfall
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
211
Typische Entwicklungsplattformen (Ausschnitt)
.Net / Microsoft
• ASP.Net (Active Server Pages, gute Abstraktion, zunächst zu
wenig Web-Server (IIS))
• Silverlight (Browser-PlugIn) für RIA, mittlerweile auch lokal
• Oberflächen basierend auf WPF (Windows Presentation
Forum, vektorbasiert, anfänglich zu langsam)
Java
• Servlets, JSP, JSF [später genauer], angegeben mit
steigenden Abstraktionsgrad ser weit verbreitet
• verschiedene neue Frameworks (z. B. Apache Wicket)
• GWT (Google Widget Toolset), SW einmal in Java schreiben,
dann individuell für Browser in Javascript übersetzen
• JavaFX , eigene Sprache nutzt im Browser JRE
• Meinung: Silverlight und JavaFX gegenüber Flash(Nachfolger) immer im Nachteil
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
212
Konzept eines Seitenaufrufs
HTTPHTTP-Request
WebWeb-Server
Client
HTTPHTTP-Response
mit
HTMLHTML-Datei im Body
Server
• HTML (Hypertext Markup Language)
– Auszeichnungssprache mit festgelegten tags zum Aufbau
der Ausgabe
• Ebene 3/4 typisch TCP/IP, Session Ebene 5: HHTP,
Darstellungsebene 6: HTML, Programmebene 7: JVM
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
213
HTTP-Ablauf
• Client: Request
– get, post, head, put, ... URL HTTP1.x
– Header Info: Accept, Cookie, ...
– Body: Post-Parameter
• Server: Response
– Statusmeldung: HTTP1.x 200 OK, oder 404 Error
– Header Info: Content-type, set-cookie, ...
– Body: Dokument
• Verbindungsabbau
• Protokoll ist zustandslos/gedächtnislos; Client wird bei
erneutem Request ohne Trick nicht als Bekannter erkannt
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
214
Web-Server mit Container nutzen
• Servlet: Wortkreation aus
den Begriffen „Server“
und „Applet“,
(serverseitiges Applet)
• Web-Server leitet HTTPRequest an Servlet weiter
• Servlet kann Antwort
(HTML-Code) berechnen
• Servlet kann AnfrageInformationen und
Serverumgebung nutzen
• Servlet kann mit anderen
Servlets kommunizieren
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
Container
215
Motivation für JSF
• Die Widerverwendbarkeit von Servlets ist gering
• Innerhalb jeder JSP bzw. jedes Servlets müssen ähnliche
Schritte ausgeführt werden
• Nur ein Teil der Applikationslogik kann in Tag-Bibliotheken
gekapselt werden
• Workflow ist in der Applikationslogik versteckt, dadurch
schwer nachvollzierbar
• ab JSF 2.0 sehr flexible Gestaltungsmöglichkeiten, u. a. AJAXEinbettung
• Hinweis: wir betrachten nur Grundkonzepte (-> mehr evtl.
Semesteraufgabe)
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
216
Web-Server mit JSF- (und EJB-) Unterstützung
• Beispiele:
– Apache + Tomcat
– BEA WebLogic Server
– IBM WebSphere (Apache Geronimo)
– JBoss
– Oracle WebLogic
– Sun Glassfish Enterprise Server (Glassfish)
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
217
Konzeptübersicht
Web-Seite in XHTML
Input-Komponente
beschrieben in
XHTML
event
Web-Seite in XHTML
leitet auf
Folgeseite
Output-Komponente
beschrieben in
XHTML
liest
Modell
...
...
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
Java-Programm
im Container
im Server
218
XHTML
•
•
•
•
Idee: HTML nicht XML-konform und zu viele Freiheiten
XHTML in fast allen Elementen wie HTML
XHTML basierend auf XML-Schema leichter zu verarbeiten
Unterschiede zu HTML (Ausschnitt)
– Tags und Attribute müssen klein geschrieben werden
– Attributwerte immer in Anführungsstrichen boarder="7"
– korrekte XML-Syntax: <br/>
br/> nicht <br>
br>
– generell saubere Terminierung <input ... />
• XHTML2 wegen HTML5 zurückgestellt
http://www.w3.org/2009/06/xhtml-faq.html
• Standard: http://www.w3.org/TR/xhtml1/
• Literatur: U. Ogbuji, XHTML step-by-step,
http://www.ibm.com/developerworks/edu/x-dw-x-xhtml-i.html
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
219
Web-GUI-Komponenten
• JSF bietet alle klassischen GUI-Komponenten zur Darstellung
und Bearbeitung an
• Grundidee: Komponenten schicken bei Veränderungen Events
• Nutzung von MVC2
• Komponenten als XHTML eingebettet
<h:inputText id="imname
id="imname"
imname" value="#{modul.name
value="#{modul.name}
modul.name}“
required="true"/>
<h:outputText id=
id="omname"
omname" value="#{modul.name}"/>
value="#{modul.name}"/>
• Kontakt zum Java-Programm über Methodenaufrufe (lesend
und aufrufend, z. B. modul.setName(...),
modul.setName(...), modul.getName()
modul.getName()
• große Komponenten können aus kleineren komponiert
werden
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
220
Nulltes JSF-Beispiel (1/11)
• Aufgabe: Modul (Name + Nummer) eingeben und auf
zweiter Seite wieder ausgeben
• Beispiel zeigt:
– Konzept der XHTML-Nutzung
– erste JSF-Befehle
– Seitenmanövrierung durch JSF
• 0. Beispiel zeigt nicht:
– ordentliche Softwarearchitektur (Controller und Model
trennen)
– Validierungsmöglichkeiten für Eingaben
– Layoutgestaltung
– viele coole Dinge
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
221
Nulltes JSF-Beispiel (2/11) - Start index.xhtml
<?xml
<?xml version='1.0' encoding='UTFencoding='UTF-8' ?>
<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN"
Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html">
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
h:head>
<title>Moduleingabe</title>
title>Moduleingabe</title>
</h:head
</h:head>
h:head>
<h:body>
h:body>
<h:form>
h:form>
<h:outputText value="Modulname "/>
<h:inputText id="mname"
id="mname" value="#{modul.name}"
value="#{modul.name}"
required="true"/><br/>
required="true"/><br/>
<h:outputText value="Modulnummer "/>
<h:inputText id="mnr"
id="mnr" value="#{modul.nr}"
value="#{modul.nr}"
required="true"/><br/>
required="true"/><br/>
<h:commandButton value="Abschicken"
value="Abschicken"
action="#{modul.uebernehmen}"/>
action="#{modul.uebernehmen}"/>
</h:form
</h:form>
h:form>
</h:body
</h:body>
h:body>
</html
</html>
html>
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
222
Nulltes JSF-Beispiel (3/11) - Analyse der Startseite
• Einbinden der JSF-Bibliotheken
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f ="http://java.sun.com/jsf/core
="http://java.sun.com/jsf/core"
http://java.sun.com/jsf/core" >
• Nutzung von Standard XHTML (vereinfacht, da so als
Standardnamensraum gesetzt)
• enge Verwandtschaft HTML zu XHTML (<h:form>)
• für value="#{modul.name}"
value="#{modul.name}" offene Fragen:
– was ist modul? ( -> Managed Bean)
– warum #? (Trennung von ausführbaren Elementen)
– was passiert bei modul.name? (set/get abhängig von
in/out)
• Ausblick: action="#{modul.uebernehmen}"
action="#{modul.uebernehmen}", echtes EventHandling (Methodenaufruf)
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
223
Nulltes JSF-Beispiel (4/11) - Ausgabe ausgabe.xhtml
<?xml
<?xml version='1.0' encoding='UTFencoding='UTF-8' ?>
<!DOCTYPE html PUBLIC ""-//W3C//DTD XHTML 1.0 Transitional//EN"
Transitional//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1"http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html">
xmlns:h="http://java.sun.com/jsf/html">
<h:head>
h:head>
<title>Modulausgabe</title>
title>Modulausgabe</title>
</h:head
</h:head>
h:head>
<h:body>
h:body>
<h:form>
h:form>
<h:outputText value="Modulname:
value="Modulname: "/>
<h:outputText id="mname"
id="mname" value="#{modul.name}"/>
value="#{modul.name}"/> <br
<br/>
br/>
<h:outputText value="Modulnummer:
value="Modulnummer: "/>
<h:outputText id="mnr"
id="mnr" value="#{modul.nr}"/><br/>
value="#{modul.nr}"/><br/>
<h:commandButton value="Zur Eingabe"
action="#{modul.eingeben}"/>
action="#{modul.eingeben}"/>
</h:form
</h:form>
h:form>
</h:body
</h:body>
h:body>
</html
</html>
html>
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
224
Nulltes JSF-Beispiel (5/11) - Managed Bean [1/3]
package entities;
entities;
import java.io.Serializable
java.io.Serializable;
;
import javax.faces.bean.ManagedBean;
javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
javax.faces.bean.RequestScoped;
@ManagedBean(name="modul")
ManagedBean(name="modul")
@RequestScoped
public class Modul implements Serializable {
private static final long serialVersionUID = 1L;
private int nr;
nr;
private String name;
name;
public Modul(){}
public Modul(int nr,
nr, String name)
name) {
this.nr = nr;
nr;
this.name = name;
name;
}
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
225
Nulltes JSF-Beispiel (6/11) - Managed Bean [2/3]
public String uebernehmen(){
uebernehmen(){
return "./ausgabe.xhtml
"./ausgabe.xhtml";
ausgabe.xhtml";
}
public String eingeben(){
return "./index.xhtml
"./index.xhtml";
index.xhtml";
}
//Manö
//Manövrieren
public String getName()
getName() {
return name;
name;
}
public void setName(String name)
name) {
this.name = name;
name;
}
public int getNr()
getNr() {
return nr;
nr;
}
public void setNr(int nr)
nr) {
this.nr = nr;
nr;
}
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
226
Nulltes JSF-Beispiel (7/11) - Managed Bean [3/3]
@Override
public boolean equals(Object object)
object) {
if (object==null || !(object
!(object instanceof Modul))
return false;
false;
Modul other = (Modul) object;
object;
if (this.nr != other.nr || !this.name.equals(other.name
!this.name.equals(other.name))
this.name.equals(other.name))
return false;
false;
return true;
true;
}
@Override // generieren lassen
public int hashCode()
hashCode() {
int hash = 5;
hash = 47 * hash + this.nr;
this.nr;
hash = 47 * hash
+ (this.name
(this.name != null ? this.name.hashCode()
this.name.hashCode() : 0);
return hash;
hash;
}
@Override
public String toString()
toString() {return
{return name+"("+nr+")";}
name+"("+nr+")";}
Komponentenbasierte
Software}
Entwicklung
Prof. Dr.
Stephan Kleuker
227
Nulltes JSF-Beispiel (8/11) - web.xml [1/2]
• Konfigurationsdatei für Servlets (hier benötigt)
• sun-web.xml ist Glassfish-spezifische Konfiguratonsdatei
<?xml
<?xml version="1.0" encoding="UTFencoding="UTF-8"?>
<webweb-app version="3.0"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchemaxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/webhttp://java.sun.com/xml/ns/javaee/web-app_3_0.xsd">
<contextcontext-param>
param>
<paramparam-name>javax.faces.PROJECT_STAGE</paramname>javax.faces.PROJECT_STAGE</param-name>
name>
<paramparam-value>Development</paramvalue>Development</param-value>
value>
</context
</contextcontext-param>
param>
<servlet>
servlet>
<servletservlet-name>Faces Servlet</servletServlet</servlet-name>
name>
<servletservlet-class>javax.faces.webapp.FacesServlet
</servlet
</servletservlet-class>
class>
<load<load-onon-startup>1</loadstartup>1</load-onon-startup>
</servlet
</servlet>
servlet>
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
228
Nulltes JSF-Beispiel (9/11) - web.xml [2/2]
<servletservlet-mapping>
mapping>
<servletservlet-name>Faces Servlet</servletServlet</servlet-name>
name>
<urlurl-pattern>/faces/*</urlpattern>/faces/*</url-pattern>
pattern>
</servlet
</servletservlet-mapping>
mapping>
<sessionsession-config>
config>
<sessionsession-timeout>
timeout>
30
</session
</sessionsession-timeout>
timeout>
</session
</sessionsession-config>
config>
<welcomewelcome-filefile-list>
list>
<welcomewelcome-file>faces/index.xhtml</welcomefile>faces/index.xhtml</welcome-file>
file>
</welcome
</welcomewelcome-filefile-list>
list>
</web
</webweb-app>
app>
in sun-web.xml steht u. a.
<context<context-root>/JSFSpielerei2</contextroot>/JSFSpielerei2</context-root>
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
229
Nulltes JSF-Beispiel (10/11) - Projektstruktur
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
230
Nulltes JSF-Beispiel (11/11) - Ergebnis
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
231
Basisprinzip der Applikationssteuerung
• Im Controller: Auftruf einer Methode ohne Parameter vom
Rückgabetyp String
<h:commandButton value="Abschicken"
value="Abschicken"
action="#{modul.uebernehmen}"/>
action="#{modul.uebernehmen}"/>
• Im Modell:
public String uebernehmen(){
uebernehmen(){
return "./ausgabe.xhtml
"./ausgabe.xhtml";
ausgabe.xhtml";
}
• Methode kann natürlich abhängig von Variablen
unterschiedliche Seiten liefern
• Beachten: Navigation kann in den Tiefen des Codes
verschwinden ( -> Konstanten nutzen, Architektur)
• Hinweis: wir werden noch Varianten kennenlernen
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
232
Lebensdauer von Informationen (scope)
None
Request
Session
Application
nur
nur für einen
aktuelle Aufruf
Seite
(auch für
Weiterleitung)
für eine
NutzerSitzung
solange Zeit
aktuelles
Deployment
läuft
• Anmerkung: Obwohl es verlockend ist, viele Informationen in
Session oder Application zu legen, ist dies wg Performance
verboten (wird gespeichert, evtl. passiviert, hat wilde
Referenzen, Zugriff muss ggfls. synchronisiert werden)
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
233
Scope-Beispiel (1/5) - Bean-Klasse
//@ManagedBean(name
//@ManagedBean(name = "modul
"modul")
modul")
//@RequestScoped
Modul als einfache Klasse
//@RequestScoped
public class Modul implements Serializable { ...// wie vorher
"moduln
moduln")
@ManagedBean(name = "
moduln
")
@NoneScoped
public class ModulNone extends Modul{}
Modul{}
@ManagedBean(name = "modulr
"modulr")
modulr")
@RequestScoped
public class ModulRequest extends Modul{}
Modul{}
@ManagedBean(name = "moduls
"moduls")
moduls")
@SessionScoped
public class ModulSession extends Modul{}
Modul{}
@ManagedBean(name = "modula
"modula")
modula")
@ApplicationScoped
public class ModulApplication extends Modul{}
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
234
Scope-Beispiel (2/5) - Ausschnitt index.xhtml
<h:form>
h:form>
<h:panelGrid columns="3" >
<h:outputLabel for="mnamen"
for="mnamen" value="Modulname "/>
<h:inputText id="mnamen"
id="mnamen" value="#{moduln.name}"/>
value="#{moduln.name}"/>
<h:message for="mnamen"
for="mnamen" />
<h:outputLabel for="mnrn"
for="mnrn" value="Modulnummer "/>
<h:inputText id="mnrn"
id="mnrn" value="#{moduln.nr}"/>
value="#{moduln.nr}"/>
<h:message for="mnrn"
for="mnrn" />
<h:outputLabel for="mnamer"
for="mnamer" value="Modulname "/>
<h:inputText id="mnamer"
id="mnamer" value="#{modulr.name}"/>
value="#{modulr.name}"/>
<h:message for="mnamer"
for="mnamer" />
<h:outputLabel for="mnrr"
for="mnrr" value="Modulnummer "/>
<h:inputText id="mnrr"
id="mnrr" value="#{modulr.nr}"/>
value="#{modulr.nr}"/>
<h:message for="mnrr"
for="mnrr" />
<!-<!-- auch moduls und modula -->
-->
<h:commandButton value="Abschicken"
value="Abschicken"
action="#{modulr.uebernehmen}"/>
action="#{modulr.uebernehmen}"/>
</h:panelGrid
</h:panelGrid>
h:panelGrid>
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
235
Scope-Beispiel (3/5) - Ausschnitt ausgabe.xhtml
<h:form>
h:form>
<h:messages globalOnly="true"/>
globalOnly="true"/>
<h:outputText value="Modulname n: "/>
<h:outputText id="mnamen"
id="mnamen" value="#{moduln.name}"/>
value="#{moduln.name}"/> <br
<br/>
br/>
<h:outputText value="Modulnummer n: "/>
<h:outputText id="mnrn"
id="mnrn" value="#{moduln.nr}"/><br/>
value="#{moduln.nr}"/><br/>
<h:outputText value="Modulname r: "/>
<h:outputText id="mnamer"
id="mnamer" value="#{modulr.name}"/>
value="#{modulr.name}"/> <br
<br/>
br/>
<h:outputText value="Modulnummer r: "/>
<h:outputText id="mnrr"
id="mnrr" value="#{modulr.nr}"/><br/>
value="#{modulr.nr}"/><br/>
<h:commandButton value="Zur Eingabe"
action="#{modulr.eingeben}"/><br/>
action="#{modulr.eingeben}"/><br/>
<!-<!-- auch moduls und modula -->
-->
<h:commandButton value="Ausgabe wiederholen"
action="#{modulr.uebernehmen}"/>
action="#{modulr.uebernehmen}"/>
</h:form
</h:form>
h:form>
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
236
Scope-Beispiel (4/5) - Ein Nutzer, zwei Klicks
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
237
Nutzer 2
Nutzer 1
Scope-Beispiel (5/5) - Zwei Nutzer
Zeit
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
238
Manövrieren vor JSF 2.0
• Grundidee: Automat mit Seiten als Knoten (Zustände),
Übergang findet durch String-Konstanten statt
• String-Konstanten sind Ergebnisse von (Action-) Methoden
(oder stehen direkt in action="EINGEBEN"
action="EINGEBEN")
index.xhtml
ausgabe.xhtml
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
239
Manövrieren vor JSF 2.0 - faces-config.xml 1/2
<?xml
<?xml version='1.0' encoding='UTFencoding='UTF-8'?>
<facesfaces-config version="1.2"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchemaxmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/webhttp://java.sun.com/xml/ns/javaee/web-facesconfig_1_2.xsd">
<navigationnavigation-rule>
rule>
<fromfrom-viewview-id>/index.xhtml</fromid>/index.xhtml</from-viewview-id>
id>
<navigationnavigation-case>
case>
<fromfrom-outcome>ANZEIGEN</fromoutcome>ANZEIGEN</from-outcome>
outcome>
<toto-viewview-id>/ausgabe.xhtml</toid>/ausgabe.xhtml</to-viewview-id>
id>
</navigation
</navigationnavigation-case>
case>
</navigation
</navigationnavigation-rule>
rule>
<navigationnavigation-rule>
rule>
<fromfrom-viewview-id>/ausgabe.xhtml</fromid>/ausgabe.xhtml</from-viewview-id>
id>
<navigationnavigation-case>
case>
<fromfrom-outcome>EINGEBEN</fromoutcome>EINGEBEN</from-outcome>
outcome>
<toto-viewview-id>/
id>/ index.xhtml </to
</toto-viewview-id>
id>
</navigation
</navigationnavigation-case>
case>
</navigation
</navigationrule>
navigation-rule>
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
240
Manövrieren vor JSF 2.0 - Managed Bean
// statt durch Annotationen kö
können Beans auch in facesfaces// config.xml angelegt werden
public class Modul implements Serializable {
private static final long serialVersionUID = 1L;
private int nr;
nr;
private String name;
name;
// fehlt: getget- und setset-Methoden für Exemplarvariablen
public Modul(){}
public String uebernehmen(){
//Actionuebernehmen(){
//Action-Methode
// Zugriff auf Exemplarvariablen mö
möglich
return "ANZEIGEN";
}
public String eingeben(){
// Zugriff auf Exemplarvariablen mö
möglich
return "EINGEBEN";
}
...
Komponentenbasierte Software}
Entwicklung
Prof. Dr.
Stephan Kleuker
241
Manövrieren vor JSF 2.0 - faces-config.xml 2/2
<managedmanaged-bean>
bean>
<managedmanaged-beanbean-name>modul</managedname>modul</managed-beanbean-name>
name>
<managedmanaged-beanbean-class>entities.Modul</managedclass>entities.Modul</managed-beanbean-class>
class>
<managedmanaged-beanbean-scope>request</managedscope>request</managed-beanbean-scope>
scope>
</managed
</managedbean>
managed-bean>
</faces
</facesfaces-config>
config>
Vorteil der klassischen Navigation:
• Es gibt zentrale Stelle, an der es einen Überblick über
mögliche Abläufe gibt
Nachteile:
• JSF 2.0 bietet flexiblere Ablaufsteuerung
• XML ist schwer nachvollziehbar
• Konfigurationsdatei facesfaces-config.xml bleibt trotzdem wichtig
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
242
Erinnerung: Konstanten in Programmen
• schlecht return "ANZEIGEN";
• besser: Konstanten getrennt deklarieren
public class Modul implements Serializable{
Serializable{
private final static string ANZEIGEN = "ANZEIGEN";
...
return ANZEIGEN;
• Alternativ: Klasse mit Konstanten
package konstanten;
public class Navigation{
public final static string ANZEIGEN = "ANZEIGEN";
...
return konstanten.Navigation.ANZEIGEN;
konstanten.Navigation.ANZEIGEN;
– Entwicklungsumgebungen erlauben dann einfache Suche
und Änderung (Refactoring)
Komponentenbasierte SoftwareEntwicklung
Prof. Dr.
Stephan Kleuker
243
Herunterladen