4. JavaServer Faces (JSF) / JEE

Größe: px
Ab Seite anzeigen:

Download "4. JavaServer Faces (JSF) / JEE"

Transkript

1 4. JavaServer Faces (JSF) / JEE 4.1 Grundlagen 4.2 Einführendes nulltes Beispiel 4.3 Validierung 4.4 JSF mit EJB und JPA 4.5 Get 4.6 Sicherheit 4.7 Weitere JSF-Möglichkeiten 4.8 JSF-Lebenszyklus 4.9 Templates und Komponenten 4.10 Nutzung von Ajax 4.11 Testen von Web-Applikationen - Selenium 4.12 JSF-Erweiterungen 219

2 Literatur E.Burns, C. Schalk, JavaServer Faces 2.0: The Complete Reference, Mc Graw Hill, New York, 2010 M. Marinschek, M. Kurz, G. Müllan, JavaServer Faces 2.0, dpunkt, Heidelberg, 2010 (im Wesentlichen auch: D. Geary, C. Horstmann, Core JavaServer Faces, 3. Auflage, Prentice Hall, USA, 2010 K. Ka Iok Tong, Beginning JSF 2 APIs and JBoss Seam, Apress, Berkeley, USA, 2009 Standard: Sun, JSR 344: JavaServer Faces 2.2, Sun, JEE7 Tutorial, Bücher nutzen teilweise auf Eclipse und JBoss; nicht notwendig, funktioniert fast alles mit Netbeans und Glassfish / Apache 220

3 4.1 Grundlagen verschiedene Ziele von JSF-Applikationen Software, die Web als zusätzlichen Nutzen hat (z. B. Web- Prä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! 221

4 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 222

5 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 223

6 Typische splattformen (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 sehr 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 HTML5 und aktuell noch Flash immer im Nachteil, was mit JavaFX2 passiert unklar 224

7 Web- Container EJB- Container Konzept eines Seitenaufrufs HTTP-Request Client HTTP-Response mit HTML-Datei im Body Application 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 225

8 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 226

9 Web-Server mit Container nutzen Servlet: Wortkreation aus den Begriffen Server und Applet, (serverseitiges Applet) Web-Server leitet HTTP- Request an Servlet weiter Servlet kann Antwort (HTML-Code) berechnen Servlet kann Anfrage- Informationen und Serverumgebung nutzen Servlet kann mit anderen Servlets kommunizieren Container 227

10 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. AJAX- Einbettung Hinweis: wir betrachten nur Grundkonzepte (-> mehr evtl. Semesteraufgabe) 228

11 Web-Server mit JSF- (und EJB-) Unterstützung Beispiele: Apache Tomcat BEA WebLogic Server IBM WebSphere (Apache Geronimo) JBoss Wildfly Oracle WebLogic Glassfish (Oracle, Referenzimplementierung) Unterschiedliches Tempo bei der Unterstützung neuer JEE- Versionen 229

12 Konzeptübersicht Web-Seite in XHTML Input-Komponente beschrieben in XHTML... Web-Seite in XHTML Output-Komponente beschrieben in XHTML... event leitet auf Folgeseite liest Modell Java-Programm im Container im Server 230

13 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/> nicht <br> generell saubere Terminierung <input... /> XHTML2 wegen HTML5 zurückgestellt (verschwimmt damit) Standard: 231

14 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" value="#{modul.name} required="true"/> <h:outputtext id="omname" value="#{modul.name}"/> Kontakt zum Java-Programm über Methodenaufrufe (lesend und aufrufend, z. B. modul.setname(...), modul.getname() große Komponenten können aus kleineren komponiert werden 232

15 Elementare Aufgabe: Eingabeseite mit Ausgabeseite Managed public class Modul implements Serializable { private String name; WebSeite ="#{modul.name}" WebSeite ="#{modul.name}" Modulname: Modulnummer: Abschicken Modulname: <Ausgabe> Modulnummer: <Ausgabe> Zur Eingabe Knopf Eingabefeld Ausgabefeld 233

16 Projekt einrichten (1/2) 234

17 Projekt einrichten (2/2) 235

18 4.2 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 Layout-Gestaltung viele weitere coole Dinge 236

19 Nulltes JSF-Beispiel (2/11) - Start index.xhtml <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html"> <h:head> <title>moduleingabe</title> </h:head> <h:body> <h:form> <h:outputtext value="modulname "/> <h:inputtext id="mname" value="#{modul.name}" required="true"/><br/> <h:outputtext value="modulnummer "/> <h:inputtext id="mnr" value="#{modul.nr}" required="true"/><br/> <h:commandbutton value="abschicken" action="#{modul.uebernehmen}"/> </h:form> </h:body> </html> 237

20 Nulltes JSF-Beispiel (3/11) - Analyse der Startseite Einbinden der JSF-Bibliotheken <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:f ="http://xmlns.jcp.org/jsf/core" > Nutzung von Standard XHTML (vereinfacht, da so als Standardnamensraum gesetzt) enge Verwandtschaft HTML zu XHTML (<h:form>) für 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}", echtes Event- Handling (Methodenaufruf) 238

21 Nulltes JSF-Beispiel (4/11) - Ausgabe ausgabe.xhtml <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html"> <h:head> <title>modulausgabe</title> </h:head> <h:body> <h:form> <h:outputtext value="modulname: "/> <h:outputtext id="mname" value="#{modul.name}"/> <br/> <h:outputtext value="modulnummer: "/> <h:outputtext id="mnr" value="#{modul.nr}"/><br/> <h:commandbutton value="zur Eingabe" action="#{modul.eingeben}"/> </h:form> </h:body> </html> 239

22 Nulltes JSF-Beispiel (5/11) - Managed Bean [1/3] package entities; import java.io.serializable; import javax.enterprise.context.requestscoped; public class Modul implements Serializable { private static final long serialversionuid = 1L; private int nr; private String name; public Modul(){} public Modul(int nr, String name) { this.nr = nr; this.name = name; } 240

23 Nulltes JSF-Beispiel (6/11) - Managed Bean [2/3] public String uebernehmen(){ return "./ausgabe.xhtml"; } public String eingeben(){ return "./index.xhtml"; } public String getname() { return name; } public void setname(string name) { this.name = name; } public int getnr() { return nr; } public void setnr(int nr) { this.nr = nr; } //Manövrieren 241

24 Nulltes JSF-Beispiel (7/11) - Managed Bean public boolean equals(object object) { if (object==null!(object instanceof Modul)) return false; Modul other = (Modul) object; if (this.nr!= other.nr!this.name.equals(other.name)) return false; return true; // generieren lassen public int hashcode() { int hash = 5; hash = 47 * hash + this.nr; hash = 47 * hash + (this.name!= null? this.name.hashcode() : 0); return hash; public String tostring() {return name+"("+nr+")";} } 242

25 Nulltes JSF-Beispiel (8/11) - web.xml [1/2] Konfigurationsdatei für Servlets (hier benötigt) <?xml version="1.0" encoding="utf-8"?> <web-app version="3.1" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://xmlns.jcp.org/xml/ns/javaee <context-param> <param-name>javax.faces.project_stage</param-name> <param-value>development</param-value> </context-param> <servlet> <servlet-name>faces Servlet</servlet-name> <servlet-class>javax.faces.webapp.facesservlet </servlet-class> <load-on-startup>1</load-on-startup> </servlet> 243

26 Nulltes JSF-Beispiel (9/11) - web.xml [2/2] <servlet-mapping> <servlet-name>faces Servlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping> <session-config> <session-timeout> 2 </session-timeout> </session-config> <welcome-file-list> <welcome-file>faces/index.xhtml</welcome-file> </welcome-file-list> </web-app> fehlt z. B. gesamte Fehlercodebehandlung in glassfish-web.xml (Glassfish-spezifisch) steht, wenn existent, z. B. <context-root>/vljsfnulltesbeispiel</context-root> 244

27 Nulltes JSF-Beispiel (10/11) - Projektstruktur 245

28 Nulltes JSF-Beispiel (11/11) - Ergebnis 246

29 Richtige Klassen und Annotationen nutzen! bei Korrekturvorschlägen immer auch richtige Klasse achten, steht nicht immer oben oder ist ausgewählt!!! falsche Klasse führt teilweise zu extrem schwer zu findenden Fehlern Historisch sind diese Klassen oft verwandt und ältere Ansätze werden nicht verschwinden 247

30 Einschub: IE 9 ggfls. Problem Programm läuft problemlos in Firefox und Chrome in IE 8 gab es auch keine Probleme in IE 9, erfolgt nach Drücken des Knopfes folgende Ausgabe 248

31 Einschub: IE 9 - Lösung Session-Informationen können statt im Server auch im Client gehalten werden entlastet Server, ist aber für Nutzer langsamer Ergänzung in web.xml: <context-param> <param-name>javax.faces.state_saving_method</param-name> <param-value>client</param-value> </context-param> Anmerkung: fehlt systematische Fehleranalyse: NetBeans 7.3.1, Glassfish 4, MS IE 9, MS IE 9 Nutzereinstellungen, Win 7 x64, 249

32 Einschub: korrekte Pfadangabe Browser zeigt immer vergangene Seite wenn nicht gewünscht, dann Manövrierungsstring ändern ist etwas langsamer (warum, später genauer) Scope setzen public String uebernehmen(){ return "./ausgabe.xhtml?faces-redirect=true"; } public String eingeben(){ return "./index.xhtml?faces-redirect=true"; } 250

33 Basisprinzip der Applikationssteuerung Im Controller: Aufruf einer Methode ohne Parameter vom Rückgabetyp String <h:commandbutton value="abschicken" action="#{modul.uebernehmen}"/> Im Modell: public String uebernehmen(){ return "./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 251

34 Lebensdauer von Informationen (Scope) Request Session Application nur ein Aufruf für eine Nutzer- Sitzung solange Zeit aktuelles Deployment läuft Anmerkung: Obwohl es verlockend ist, viele Informationen in Session oder Application zu legen, ist dies wegen Performance verboten (wird gespeichert, evtl. passiviert, hat wilde Referenzen, Zugriff muss ggfls. synchronisiert werden) fehlt: CoversationScoped; im Programm Scope starten und enden 252

35 Scope-Beispiel (1/5) - Bean-Klassen Modul als einfache Klasse (wichtig!) public class Modul implements Serializable {...// wie = public class ModulRequest public class ModulSession public class ModulApplication extends Modul{} 253

36 Scope-Beispiel (2/5) - Ausschnitt index.xhtml <h:form> <h:panelgrid columns="3" > <h:outputlabel for="mnamer" value="modulname "/> <h:inputtext id="mnamer" value="#{modulr.name}"/> <h:message for="mnamer" /> <h:outputlabel for="mnrr" value="modulnummer "/> <h:inputtext id="mnrr" value="#{modulr.nr}"/> <h:message for="mnrr" /> <!-- auch moduls und modula --> <h:commandbutton value="abschicken" action="#{modulr.uebernehmen}"/> </h:panelgrid> </h:form> 254

37 Scope-Beispiel (3/5) - Ausschnitt ausgabe.xhtml <h:form> <h:messages globalonly="true"/> <h:outputtext value="modulname r: "/> <h:outputtext id="mnamer" value="#{modulr.name}"/> <br/> <h:outputtext value="modulnummer r: "/> <h:outputtext id="mnrr" value="#{modulr.nr}"/><br/> <h:commandbutton value="zur Eingabe" action="#{modulr.eingeben}"/><br/> <!-- auch moduls und modula --> <h:commandbutton value="ausgabe wiederholen" action="#{modulr.uebernehmen}"/> </h:form> 255

38 Scope-Beispiel (4/5) - Ein Nutzer, zwei Klicks 256

39 Nutzer 2 Nutzer 1 Scope-Beispiel (5/5) - Zwei Nutzer Zeit 257

40 ConversationScope (1/4) Entwickler kann selbst Länge der Session bestimmen, damit zwischen RequestScope und SessionScope import javax.enterprise.context.conversation; import javax.enterprise.context.conversationscoped; import javax.inject.inject; public class Scopeanalyse implements Serializable { private String wert; private List<String> liste = new private Conversation conver; Vorgriff auf CDI: Container stellt Conversation-Objekt zur Verfügung 258

41 ConversationScope (2/4) public Scopeanalyse(){} // get- und set-methoden fehlen public void hinzu(){ if(this.conver.istransient()){ this.conver.begin(); } if(this.wert!= null &&!this.wert.trim().equals("")){ this.liste.add(wert); } } // kein String zurueck, da auf gleicher Seite geblieben public void vergiss(){ if (!this.conver.istransient()){ this.conver.end(); } } 259

42 ConversationScope (3/4) <h:head> <title>scope Spielerei</title> </h:head> <h:body> <h:form id="main"> <h:inputtextarea id="ein" value="#{scope.wert}" rows="3"/><br/> <ui:repeat value="#{scope.liste}" var="w"> <h:outputtext value="#{w} "/> </ui:repeat> <br/> <h:commandbutton value="übernehmen" action="#{scope.hinzu}"/> <h:commandbutton value="vergessen" action="#{scope.vergiss}"/> </h:form> </h:body> Anmerkung: mit <ui:repeat> wird über eine Sammlung (scope.liste) iteriert, jeweiliges Objekt in Laufvariable w 260

43 ConversationScope (4/4) Bild jeweils nach dem Klicken 261

44 Ausgabeprobleme: Umlaute und Zeilenumbrüche vor Knopfnutzung danach danach 262

45 Umlaute Text-Encoding Sonderzeichen, wie Umlaute bei Eingaben problematisch wenn konsequent UTF-8 genutzt, dann kein Problem; trifft man öfter nicht an häufig, gerade im MS-Bereich, nur ISO nutzbar nicht ganz sauberer Trick: Eingaben selbst passend umwandeln (läuft ggfls. nicht in Ländern mit nichtlateinischer Schrift) String s1 = new String("äöüÄÖßÜ"); System.out.println(s1); String s2 = new String(s1.getBytes("UTF-8"), "ISO "); System.out.println(s2); String s3 = new String(s2.getBytes("UTF-8"), "ISO "); System.out.println(s3); 263

46 Umlaute saubere Glassfish-Lösung Codierung des Glassfish auf UTF-8 umstellen in glassfishweb.xml <?xml version="1.0" encoding="utf-8"?> <!DOCTYPE glassfish-web-app PUBLIC "-//GlassFish.org//DTD GlassFish Application Server 3.1 Servlet 3.0//EN" "http://glassfish.org/dtds/glassfish-web-app_3_0-1.dtd"> <glassfish-web-app error-url=""> <class-loader delegate="true"/> <locale-charset-info default-locale=""> <locale-charset-map locale="" charset=""/> <parameter-encoding default-charset="utf-8"/> </locale-charset-info> </glassfish-web-app> https://wikis.oracle.com/display/glassfish/faqhttprequestparameterencoding 264

47 Zeilenumbrüche (1/2) verschiedene Lösungen, alle nicht optimal Konvertierer schreiben <h:outputtext converter="wandel" hier: HTML-Wissen nutzen, genauer CSS <h:inputtextarea id="ein" value="#{scope.wert}" rows="3"/><br/> <div style="white-space: pre-wrap"> <ui:repeat value="#{scope.liste}" var="w"> <h:outputtext value="#{w} "/> </ui:repeat> </div> <h:commandbutton value="übernehmen" action="#{scope.hinzu}"/> <h:commandbutton value="vergessen" action="#{scope.vergiss}"/> 265

48 Zeilenumbrüche (2/2) 266

49 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") index.xhtml ausgabe.xhtml 267

50 Manövrieren vor JSF faces-config.xml 1/2 <?xml version='1.0' encoding='utf-8'?> <faces-config version="1.2" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://xmlns.jcp.org/xml/ns/javaee <navigation-rule> <from-view-id>/index.xhtml</from-view-id> <navigation-case> <from-outcome>anzeigen</from-outcome> <to-view-id>/ausgabe.xhtml</to-view-id> </navigation-case> </navigation-rule> <navigation-rule> <from-view-id>/ausgabe.xhtml</from-view-id> <navigation-case> <from-outcome>eingeben</from-outcome> <to-view-id>/ index.xhtml </to-view-id> </navigation-case> </navigation-rule> 268

51 Manövrieren vor JSF Managed Bean // statt durch Annotationen können Beans auch in faces- // config.xml angelegt werden public class Modul implements Serializable { private static final long serialversionuid = 1L; private int nr; private String name; // fehlt: get- und set-methoden für Exemplarvariablen public Modul(){} public String uebernehmen(){ //Action-Methode // Zugriff auf Exemplarvariablen möglich return "ANZEIGEN"; } public String eingeben(){ // Zugriff auf Exemplarvariablen möglich return "EINGEBEN"; }... } 269

52 Manövrieren vor JSF faces-config.xml 2/2 <managed-bean> <managed-bean-name>modul</managed-bean-name> <managed-bean-class>entities.modul</managed-bean-class> <managed-bean-scope>request</managed-bean-scope> </managed-bean> </faces-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 faces-config.xml bleibt trotzdem wichtig 270

53 Erinnerung: Konstanten in Programmen schlecht return "ANZEIGEN"; besser: Konstanten getrennt deklarieren public class Modul implements 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; sumgebungen erlauben dann einfache Suche und Änderung (Refactoring) 271

54 Standardattribut rendered (1/3) JSF-Elemente werden typischerweise ineinander geschachtelt (typische GUI-Idee der Schächtelchen in Schächtelchen) viele (Schachtel-)Elemente haben Attribut rendered; Boolescher Wert, ob Element dargestellt public class Mojo { private boolean jo=true; public Mojo(){} } public boolean getjo() {return jo;} public void setjo(boolean jo) {this.jo = jo;} public String change(){ jo=!jo; return "./index.xhtml"; } 272

55 Standardattribut rendered (2/3) - JSF-Seite <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html"> <h:head> <title>klickklack</title> </h:head> <h:body> <h:form id="f1"> <h:panelgrid id="p1" rendered="#{mo.jo}"> <h:outputlabel value= HS rocks"/> </h:panelgrid> <h:panelgrid id="p2" rendered="#{!mo.jo}"> <h:outputlabel value="os rocks"/> </h:panelgrid> <h:commandbutton action="#{mo.change}" value="press"/> </h:form> </h:body> </html> 273

56 Standardattribut rendered (3/3) <?xml version='1.0' encoding='utf-8'?> oder in <faces-config version="1.2"...> faces-config.xhtml <managed-bean> <managed-bean-name>mo</managed-bean-name> <managed-bean-class>entities.mojo</managed-bean-class> <managed-bean-scope>session</managed-bean-scope> </managed-bean> </faces-config> 274

57 Strukturierung mit panelgrid / Kommentare mit h:panelgrid können einzelne Komponenten zu einem Block zusammengefasst und einheitlich behandelt werden (ähnlich zu JPanel in Swing) durch columns="3" eine Spaltenanzahl angegebbar Ausgabe erfolgt in Tabellenform Elemente werden zeilenweise ergänzt mit h:panelgroup Sammlung ohne Formatierung möglich (?!) Kommentare In JSF-Seiten <!-- Dies liest eh keiner --> wandern in Ausgabe, Ausdrücke mit #{ } werden ausgewertet Ergänzung in web.xml: <context-param> <param-name>javax.faces.facelets_skip_comments</param-name> <param-value>true</param-value> </context-param> 275

58 Unified Expression Language Zugriff auf Exemplarvariablen und Methoden der Managed Beans zentrale Typen: Zahlen und Strings (können sehr gut verarbeitet und verglichen werden) Schreiben von Werten über set-methoden "#{mo.jo}" Lesen erfolgt über get-methoden, generell Berechnungen möglich, die beim Schreiben keinen Sinn haben "#{!mo.jo}" Bei Methoden mit fest vorgegebener Aufgabe (vorgegebener Signatur), stehen keine Klammern beim Aufruf action="#{mo.change}" sonst ja "#{bean1.machwasmit(bean2)}" Zugriff auf Variablen aus festen Namensraum: Managed Beans und Servlet Parameter JSR 341: Expression Language 3.0, https://jcp.org/en/jsr/detail?id=

59 Implizite Objekte der EL (Ausschnitt) requestscope (analog sessionscope, applicationscope) Zugriff auf Request-Map des External-Contexts param Zugriff auf Request-Parameter-Map des External-Contexts header Zugriff auf Request-Header-Map des External-Contexts facescontext Zugriff auf den Faces-Context initparam Zugriff auf Kontextparameter der Webapplikation cookie Zugriff auf die Request-Cookie-Map des External-Contexts 277

60 4.3 Validierung/ Fehleingaben im nullten Beispiel (1/2) Eingabe: Fehler wird automatisch unter der bleibender Seite ausgegeben j_idt7 ist interner Name, mname ist unsere id des Eingabefeldes 278

61 Fehleingaben im nullten Beispiel (2/2) Anpassung des Projektstatus (oder Parameter löschen) in web.xml (Development, UnitTest, SystemTest, Production) <context-param> <param-name>javax.faces.project_stage</param-name> <!-- <param-value>development</param-value> --> <param-value>production</param-value> </context-param> Applikation bleibt auf der Seite, keine sichtbare Fehlermeldung im Server-Log: INFO: WARNUNG: FacesMessage(s) wurde(n) in die Warteschlange gestellt, aber möglicherweise nicht angezeigt. sourceid=j_idt7:mname[severity=(error 2), summary=(j_idt7:mname: Validierungs-Fehler: Wert wird benötigt.), detail=(j_idt7:mname: Validierungs-Fehler: Wert wird benötigt.)] 279

62 Direkte Validierungen - einige Möglichkeiten <h:form> <h:panelgrid columns="3" > <h:outputlabel for="mname" value="modulname "/> <h:inputtext id="mname" value="#{modul.name}" required="true" size="8" requiredmessage="nich leer" validatormessage="4 Zeichen"> <f:validatelength minimum="4" maximum="4"/> </h:inputtext> <h:message for="mname" /> <h:outputlabel for="mnr" value="modulnummer "/> <h:inputtext id="mnr" value="#{modul.nr}" required="true" requiredmessage="eingabe notwendig" size="4" convertermessage="normale Zahl"/> <h:message for="mnr" /> <h:commandbutton value="abschicken" action="#{modul.uebernehmen}"/> </h:panelgrid> </h:form> 280

63 Ausgaben beim Drücken von Abschicken 281

64 Globale Fehlermeldungen erzeugen und anzeigen public String uebernehmen() { if (name.equals("ooad")) { FacesContext ctxt = FacesContext.getCurrentInstance(); FacesMessage ms = new FacesMessage(); ms.setseverity(facesmessage.severity_error); ms.setsummary("ooad ist schon da"); ms.setdetail("ooad im Standard"); ctxt.addmessage(null, ms); } return "ANZEIGEN"; } //in ausgabe.xhtml <h:form> <h:messages globalonly="true"/> <h:outputtext value="modulname: "/> 282

65 Validierer selbst gestrickt (1/2) public class Modul implements Serializable {... // Validierungsmethoden können beliebigen Namen haben, // müssen aber die folgende Signatur haben public void pruefe(facescontext context, UIComponent component, Object value) throws ValidatorException { if (((String) value).equals("ooad")) { throw new ValidatorException(new FacesMessage( FacesMessage.SEVERITY_ERROR, "oweh", "ole ole")); } }... Hinweis: wird?faces-redirect=true genutzt, ist zu ergänzen: context.getexternalcontext().getflash().setkeepmessages(true); 283

66 Validierer selbst gestrickt (2/2) in index.xhtml <h:panelgrid columns="3" > <h:outputlabel for="mname" value="modulname "/> <h:inputtext id="mname" value="#{modul.name}" validator="#{modul.pruefe}"/> <h:message for="mname" /> 284

67 Anmerkungen zu vorherigen Folien man kann eigene Validierungsmethoden schreiben man kann auch hier BeanValidation nutzen (folgt danach) FacesContext ist der zentrale Zugang zu den Innereien von JSF Zugriff bis auf genutzte Servlets mit deren Parametern möglich leider auch eine Art Voodoo-Klassen, da fast die gesamte JSF-Steuerung manipulierbar und so keine JSF-Schicht mehr richtig existiert FacesContext macht Code-Wiederverwendung mit anderen Technologien fast unmöglich (hier gehen z. B. auch einfache Bean-Variablen mit Meldungstexten) 285

68 Erinnerung: Bean Validation nicht: Nutzer Oberfläche Java fachliche Ebene Datenzugriffsschicht DB besser: individuelle Datenvalidierung individuelle Datenvalidierung Java individuelle Datenvalidierung individuelle Datenvalidierung Nutzer Oberfläche fachliche Ebene Datenzugriffsschicht DB Datenmodell mit Validierungsregeln 286

69 Beispiel public class Modul implements Serializable { private static final long serialversionuid = message="dreistellig") private groups={validators.modulgroup.class}) private String name; //... übliche Konstruktoren, get und set Hinweis: Implementierung des Validierers in Libraries benötigt (Klasseneigenschaften werden nicht unterstützt!?) 287

70 Beispiel @Constraint(validatedBy = Modulnamenregel { String message() default "Modul unerwuenscht"; Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; String[] verboten() default {}; } package validators; public interface ModulGroup {} 288

71 Beispiel Bean-Validation (3/6) public class ModulnamenregelValidator implements ConstraintValidator<Modulnamenregel,String>{ private String[] niveau; } public void initialize(modulnamenregel ca) { this.niveau=ca.verboten(); } public boolean isvalid(string t, ConstraintValidatorContext cvc) { System.out.println("isValid"); for(string s:this.niveau) if(s.equals(t)){ cvc.buildconstraintviolationwithtemplate( "Modul in unerwuenschter Liste: " + Arrays.toString(niveau)).addConstraintViolation(); return false; } return true; } 289

72 Beispiel Bean-Validation (4/6) - index.xhtml <h:body> <h:form> <h:panelgrid columns="3" > <h:outputlabel for="mname" value="modulname "/> <h:inputtext id="mname" value="#{modul.name}"> <f:validatebean disabled="false" validationgroups="validators.modulgroup"/> </h:inputtext> <h:message for="mname" /> <h:outputlabel for="mnr" value="modulnummer "/> <h:inputtext id="mnr" value="#{modul.nr}" /> <h:message for="mnr" /> <h:commandbutton value="abschicken" action="#{modul.uebernehmen}"/> </h:panelgrid> </h:form> </h:body> 290

73 Beispiel Bean-Validation (5/6) 291

74 Beispiel Bean-Validation (6/6) Bean Validation- (und JPA-) Realisierungen enthalten 292

75 Ordentliche Softwarearchitektur JSF-Seite <<managed-bean>> Controller Bean (Entität) #{controller.bearbeiten} #{controller.bean.attribut} #{controller.speichern} Controller (und Bean) auch backing bean, Handler genannt bei DB-Nutzung greift Controller auf DB-Verwaltungsschicht zu; die verwaltet Bean-Objekte JPA einfach im Controller (besser eigener Schicht) nutzen (später schöner mit JEE als 293

76 4.4 JSF mit EJB und JPA Ziel: einfache Persistierung von Daten (Create, Read, Update, Delete) mit Transaktionssteuerung DB einbinden Kurzer Überblick EJB Controller zur Seitenverwaltung Ausgabe dynamischer Tabellen 294

77 Datenbank in Server einbinden Einschub: Nutzung von JPA bei DB im Server Datenbank einrichten Datenbank wird unter JNDI-Namen im Server registriert JSF-Applikation kann über JNDI auf DB zugreifen JSF-Container regelt DB-Zugriff (nicht Nutzer!), typische container-managed Persistance [geht auch individuell] 295

78 EJB-SessionBeans Architekturvariante bisher einfache direkte Software-Architektur (nutzbar für kleinere und mittlere Projekte) Problem: Skalierung nicht unbedingt sichergestellt, da Server nicht im Detail eingreifen kann Problem: direkte Nutzung von JPA wäre sehr bastelig Lösung: Datenbankzugriff in eigene Klasse (Enterprise JavaBean, EJB) auslagern EJB werden vom Server verwaltet (Tempo, Skalierung) EJB werden in Managed Bean injiziert 296

79 EJB - Konzept Standardisierte Komponenten eines JEE-Servers Klassen zur Steuerung von Prozessen und Verwaltung von Daten, die leicht in anderen EJB-Applikationen nutzbar sind Unterstützt mit wenig Aufwand Transaktionssteuerung (Transaktion pro Methodenaufruf) Sicherheitseinstellungen Identifikation von Objekten zur Zusammenarbeit Drei Arten (local und remote Varianten) Entity Bean wie bereits bekannt) Session Bean: Kommunikation mit bei jeder Nutzung neu in einer Session nutzbar Message Driven Bean: asynchroner Nachrichtenablauf 297

80 Erinnerung: Verwandt mit public class PersistenzService = "SprinterPU") private EntityManager em; public void persist(object object) { em.persist(object); //Exception weiterreichen } public Object merge(object object) { return em.merge(object); //Exception weiterreichen } public List<Mitarbeiter> findallmitarbeiter() { return em.createnamedquery("mitarbeiter.findall").getresultlist(); }... wird vom Server gefüllt Session vom Container gesteuert, keine eigene Steuerung! 298

81 persistence.xml (Ausschnitt) <persistence-unit name="sprinterpu" transaction-type="jta"> <provider>org.eclipse.persistence.jpa.persistenceprovider </provider> <jta-data-source>java:app/jdbc/sprinterdb</jta-data-source> <exclude-unlisted-classes>false</exclude-unlisted-classes> <properties> <property name="javax.persistence.schemageneration.database.action" value="create"/> </properties> </persistence-unit> 299

82 Zentrale Aufgabe: JSF zur Mitarbeiterverwaltung 300

83 Strategische Entscheidung SessionScoped braucht wesentlich mehr Speicher; wird für Status des Fensters benötigt (Alternativ zwei Fenster) zentrale Frage wann wird auf die Datenbank zugegriffen bei RequestScoped bei Erstellung eines neuen Objekts, d.h. sehr häufig wenn SessionScoped immer aktuell sein soll, dann auch hier sehr häufig (bei jeder Aktion) aktualisieren Kompromiss: am Anfang einmal Lesen und nur, wenn Änderungen nach außen gegeben werden 301

84 public class MitarbeiterController implements Serializable PersistenzService pers; private List<Mitarbeiter> allemitarbeiter; private Mitarbeiter mitarbeiter; // Hilfsobjekt für Oberfläche private Status modus; // aktuell Status.BASIC oder Status.EDIT private List<Mitarbeiter> alleelemente() { } return pers.findallmitarbeiter(); 302

85 MitarbeiterController public void init() { } this.mitarbeiter = new Mitarbeiter(); this.modus = Status.BASIC; this.allemitarbeiter = alleelemente(); public String abbrechen() { } this.mitarbeiter = new Mitarbeiter(); this.modus = Status.BASIC; return Konstanten.MITARBEITER; public boolean getimeditmodus() { } return this.modus.equals(status.edit); garantiert, dass dies Nach der Erstellung und vor anderen Methoden aufgerufen wird (Konstruktor bleibt leer) Zugriff von XHTML- Seite aus, da Methode mit "get" beginnt 303

86 MitarbeiterController (3/6) public String uebernehmen() { FacesContext ctxt = FacesContext.getCurrentInstance(); FacesMessage ms = new FacesMessage("Erfolgreich übernommen"); try { if (this.modus.equals(status.edit)) { this.mitarbeiter = (Mitarbeiter) pers.merge(this.mitarbeiter); aktualisieremitarbeiter(this.mitarbeiter); // lokale Liste this.modus = Status.BASIC; } else { this.pers.persist(this.mitarbeiter); this.allemitarbeiter.add(this.mitarbeiter); // lokal } this.mitarbeiter = new Mitarbeiter(); // neues Hilfsobjekt 304

87 MitarbeiterController (4/6) } } catch (Exception e) { ms = Utilities.meldung(e); this.allemitarbeiter = alleelemente(); // hier wichtig } ctxt.addmessage(null, ms); return Konstanten.MITARBEITER; private void aktualisieremitarbeiter(mitarbeiter m) { int position = -1; for (int i = 0; i < this.allemitarbeiter.size(); i++) { if (this.allemitarbeiter.get(i).getid() == m.getid()) { position = i; } } this.allemitarbeiter.set(position, m); } 305

88 MitarbeiterController (5/6) public String loeschen(long id) { FacesContext ctxt = FacesContext.getCurrentInstance(); FacesMessage ms = new FacesMessage("Erfolgreich gelöscht"); ctxt.getexternalcontext().getflash().setkeepmessages(true); try { this.pers.removemitarbeiter(id); loeschemitarbeiter(id); // lokal } catch (Exception e) { ms = Utilities.meldung(e); this.allemitarbeiter = alleelemente(); // hier wichtig } ctxt.addmessage(null, ms); this.mitarbeiter = new Mitarbeiter(); this.modus = Status.BASIC; return Konstanten.MITARBEITER; } 306

89 MitarbeiterController (6/6) public String editieren(long id) { this.mitarbeiter = pers.findmitarbeiter(id); if (this.mitarbeiter == null) { FacesContext ctxt = FacesContext.getCurrentInstance(); FacesMessage ms = new FacesMessage("Objekt wurde" + "zwischenzeitlich gelöscht"); ctxt.getexternalcontext().getflash().setkeepmessages(true); ctxt.addmessage(null, ms); this.allemitarbeiter = alleelemente(); // wichtig } else { this.modus = Status.EDIT; } return Konstanten.MITARBEITER; } 307

90 Einschub: Ausgabe von Sammlungen in Tabellen <h:datatable value="#{sprintcontroller.sprints}" var="s"> datatable erlaubt die Datenaufbereitung einer Collection in Tabellenform (Iterator über Daten mit getsprints(); Elemente in Variable m); grundlegende Darstellungsmöglichkeiten einstellbar Zur Ausgabe wird minimal <h:column> benötigt Attribut first für erste Zeile und rows für Zeilenzahl Nie, nie Elemente der alten JSTL nutzen <c:foreach> wenn keine Tabelle gewünscht <ui:repeat value= var > nutzt xmlns:ui="http://xmlns.jcp.org/jsf/facelets" 308

91 Strukturierung in XHTML (Facelets) Templating wird unterstützt auch einfaches inkludieren von Seiten nutzbar, dann wird Header ignoriert Parameter-Übergabe möglich generell (leicht eingeschränkte) Nutzung von CSS möglich (Attribut für jedes Objekt oder/und generell für gerenderte Dateien) <div> - Blöcke (aus HTML) erleichtern Strukturierung generell: JavaScript für einzelne Aktionen nutzbar 309

92 Konzept der Basisseite rahmen.html <h:head> <title>#{titel}</title> <h:outputstylesheet library="css" name="tabelle.css" /> </h:head> <h:body> <div id="kopf"> <div id="knopfleiste"> </div> <div id="detailinformation"> <ui:insert name="uebersicht"/> </div> </div> <div id="nachricht" style="height: 45px; overflow: hidden"> <h:messages globalonly="true"/> </div> <div id="hauptteil"> <ui:insert name="inhalt"/> </div> </h:body> 310

93 Ausschnitt mitarbeiter.xhtml (1/4): Kopf/Parameter <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:ui="http://xmlns.jcp.org/jsf/facelets"> <h:head> <title>mitarbeiter-bearbeitung</title> <h:outputstylesheet library="css" name="tabelle.css" /> </h:head <h:body> <ui:composition template="./resources/templates/rahmen.xhtml"> <ui:param name="titel" value="mitarbeiter-bearbeitung"/> <ui:param name="sprints" value="true"/> <ui:param name="mitarbeiter" value="false"/> <ui:param name="kanban" value="true"/> <ui:param name="sprintid" value="-1"/> 311

94 Ausschnitt mitarbeiter.xhtml (2/4): Eingabefelder <ui:define name="inhalt"> <h3> Mitarbeiter neu / bearbeiten </h3> <h:panelgrid columns="3" > <h:outputtext value="id "/> h:outputtext value="#{mitarbeitercontroller.mitarbeiter.id}" rendered="#{mitarbeitercontroller.imeditmodus}"/> <h:outputtext value="wird vom System vergeben" rendered="#{!mitarbeitercontroller.imeditmodus}"/> <h:outputtext value=" "/> <h:outputtext value="mitarbeiternummer "/> <h:inputtext id="minr" required="true" value ="#{mitarbeitercontroller.mitarbeiter.minr}" requiredmessage="eindeutige Nummer ge 0 angeben" convertermessage="geben ganze Zahl ein"/> <h:message for="minr" style="color:red"/> 312

95 Ausschnitt mitarbeiter.xhtml (3/4): Übersicht <h3> Aktuelle Mitarbeiter </h3> <h:panelgrid rendered ="#{!empty mitarbeitercontroller.allemitarbeiter}"> <h:datatable border="1" frame="box" value="#{mitarbeitercontroller.allemitarbeiter}" var="m" styleclass="tabelle" headerclass="tabelle-kopfzeile" rowclasses="tabelle-ungerade-zeile,tabelle-gerade-zeile" > <h:column > <f:facet name="header"> <h:outputtext value="id" /> </f:facet> <h:outputlabel value="#{m.id}"/> </h:column> 313

96 Ausschnitt mitarbeiter.xhtml (4/4): Aktionen <h:column> <f:facet name="header"> <h:outputtext value="mitarbeiten" /> </f:facet> <h:commandlink value="mitarbeiten" action="#{mitarbeitcontroller.fuermitarbeiter(m)}"/> </h:column> <h:column> <f:facet name="header"> <h:outputtext value="editieren" /> </f:facet> <h:commandbutton value="editieren" action="#{mitarbeitercontroller.editieren(m.id)}" immediate="true"/> </h:column> 314

97 Analyse erreichter Architektur 315

98 Kritische Analyse der erreichten Architektur für Projektgröße ok evtl. kritisch: JSF-Controller müssen recht detailliert Persistenz steuern, sollten sich aber nur um die Seite kümmern (-> Auslagern der Steuerung in ViewModels) evtl. kritisch JSF-Controller greifen direkt auf Entities zu (die in Data Transfer Objects (DTO) kapseln; hier auch berechnete Werte hinein) neues Problem: recht viel redundanter Code in Controller und ViewModel; DTOs müssen vollständiges ER-Modell abdecken 316

99 Architektur-Variante 317

100 4.5 Get Aktuell: Links nur sehr eingeschränkt nutzbar, für Bookmarks nutzlos Gewünscht: Links für Bookmarks und zum Aufruf von Funktionalität mit Parametern nutzbar 318

101 Wunsch nach GET aktuelle Seiten nicht für Bookmarks oder Mails geeignet sinnvoll wäre GET-Nutzung (ab JSF 2.0 möglich, wird erweitert, mindestens von mojarra notwendig) Ansatz: In Seite können GET-Parameter spezifiziert werden aufgerufene Seite erhält Parameter und kann diese in speziellen f:metadata-tag lesen und mit Variablen des Controllers verknüpfen Steuerung passiert durch neue Elemente, h:button und h:link ersetzen h:commandbutton und h:xommandlink Trick (ab und zu nutzbar): Baue vor klassische Seite neue Seite für Parameter, die alte Seite inkludiert 319

102 Beispiel: gewünschte Links Mitarbeiten eines Mitarbeiters Aufruf der Editier-Funktion (gerendert) <td><input type="button" onclick="window.location.href='/sprinter/faces/ mitarbeiterparam.xhtml?mid=10&actionid=2'; return false;" value="editieren" /></td> actionid als Protokoll, was gemacht werden soll (1=anzeigen, 2=editieren, 3=loeschen) 320

103 h:button genauer <h:button value="editieren" outcome="mitarbeiterparam"> <f:param name="mid" value="#{m.id}" /> <f:param name="actionid" value="2" /> </h:button> outcome nennt aufzurufende Seite Parameter per GET übergeben aufgerufene Seite, in <f:metadata> Einlesen mit <f:viewparam name="mid" value="#{controller.id}" /> Aktion, die nach dem Einlesen passieren soll <f:viewaction action="#{controller.reagiereaufget}"/> 321

104 mitarbeiterparam.xhtml <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:ui="http://xmlns.jcp.org/jsf/facelets"> <f:metadata> <f:viewparam name="mid" value="#{mitarbeitercontroller.mitarbeiterid}"/> <f:viewparam name="actionid" value="#{mitarbeitercontroller.action}"/> <f:viewaction action= "#{mitarbeitercontroller.mitarbeitercontrollermitget}"/> </f:metadata> <h:head></h:head> <h:body> <ui:include src="mitarbeiter.xhtml"/> </h:body> ursprüngliche Seite </html> 322

105 in public class MitarbeiterController implements Serializable {... private long mitarbeiterid; // fuer GET mit get/set private int action; // ausgewaehlte Aktion public String mitarbeitercontrollermitget() { this.modus = Status.BASIC; if (this.action == 2) { this.action = 0; return this.editieren(this.mitarbeiterid); } if (this.action == 3) { this.action = 0; return this.loeschen(this.mitarbeiterid); } 323

106 in MitarbeiterController (2/2) } if (this.action == 1) { // zeige alle Mitarbeiter this.action = 0; this.mitarbeiter = new Mitarbeiter(); this.allemitarbeiter = alleelemente(); return Konstanten.MITARBEITER; } return null; // verhindert erneute Parameterauswertung 324

107 Einbau von get-links in mitarbeiter.xhtml <h:column> <f:facet name="header"> <h:outputtext value="mitarbeiten" /> </f:facet> <h:link value="mitarbeiten" outcome="mitarbeitmitarbeiterparam"> <f:param name="mid" value="#{m.id}" /> <f:param name="actionid" value="1" /> </h:link> </h:column> <h:column> <f:facet name="header"> <h:outputtext value="editieren" /> </f:facet> <h:button value="editieren" outcome="mitarbeiterparam"> <f:param name="mid" value="#{m.id}" /> <f:param name="actionid" value="2" /> </h:button> </h:column> 325

108 4.6 Sicherheit Vier Aufgaben Authentifizierung: Nutzer erkennen; klassisch über Name und Passwort Autorisierung: Nutzer darf nur bestimmte Aktionen durchführen, klassisch über Rechte-Rollen-System Vertraulichkeit: kein weiterer Nutzer (außer BKA, NSA,...) darf Informationen mitlesen Unverfälschtheit: Inhalte werden zwischen Senden und Empfangen nicht verändert letzten beiden Punkte typischerweise durch Verschlüsselung realisiert 326

109 Nutzer Rollen Gruppen typischerweise wird ein Nutzer einer oder mehreren Gruppen (mit unterschiedlichen) Rechten zugeordnet zur Vereinfachung (Abstraktion) bekommt jeder Nutzer genau eine Rolle, die dann verschiedenen Gruppen zugeordnet werden kann jede benötigte Gruppenkombination benötigt eine Rolle Nutzer NC M Gruppe NC M 1 Rolle NC 327

110 Varianten zur Realisierung direkt von Hand codieren (mit DB-Anbindung für uns technisch kein Problem; Übertragung aber unsicher mit HTTP) jeder Methodenaufruf beginnt mit Berechtigungsprüfung deklarativ Möglichkeit zur abgetrennten Authentifizierung Seiten (Servlets, JSP, JSF) können als schützenswert markiert werden (im Deployment Descriptor) Zugang zu Seiten wird nur Nutzer in bestimmten Rollen gewährleistet deklarativ (Variante) Programmcode direkt mit erlaubten Rollen annotieren 328

111 Umsetzungsmöglichkeit in JSF Deployment Descriptor (web.xml) Man kann Rollen definieren Man kann Seiten/Ordner Rollen zuordnen Man kann Art der Übertragung festlegen und Applikationsserver-spezifisch: Auswahl eines Informationssystems zur Authentifizierung (Nutzer, Passwort, zugehörige Rollen), z. B. im Server selbst, Datenbank, Anbindung LDAP Zuordnung der Server-Gruppen zu den Rollen der JSF- Applikation (oder Zuordnung von Nutzern zu Rollen der JSF- Applikation) 329

112 Applikationsbeispiel - Überblick 1. Nutzer wählt Funktionalität 2. Nutzer muss sich authentifizieren 3. Prüfung ob Nutzer erlaubt und ob er benötigte Rechte hat 4a. falls ja, Zugang zur Funktionalität 4b. falls Nutzer unbekannt, ihn über Scheitern informieren 4c. falls Nutzer bekannt und zu wenig Rechte, ihn über fehlende Rechte informieren [oder wie 4b behandeln] Hinweis: statt geschützten Zugriff auf Startseite kann diese noch offen sein (ergonomisch, weitere Einstellungen regelbar) technische Probleme: Nutzer kann mehrere Seiten für gleiche Applikation nutzen Nutzer spielt mit Back -Button 330

113 Sicheres JSF (1/17) Aufgabenstellung / Nutzer Nur registrierte Basisnutzer können Modul hinzufügen Nur Editierer (Admins) dürfen Modul bearbeiten Server unterstützen verschiedene Sicherheitsmechanismen direkter Eintrag von Nutzern im Server Anbindung an LDAP Nutzung eigener Tabellen (wird hier genutzt, eigener Realm, eigene Tabellen zur Verwaltung, mit verschlüsselten Passwort, genauer: Nutzer username password Gruppen groupid usernme edna edna admin edna uwe uwe basic edna otto otto basic uwe 331

114 Sicheres JSF (2/17) Ergebnis 1/3 332

115 Sicheres JSF (3/17) Ergebnis 2/3 333

116 Sicheres JSF (4/17) Ergebnis 3/3 - Konzept Web-Seiten in Ordner pro Nutzergruppe einordnen In web.xml regeln, welche Gruppe worauf zugreifen darf Standard login-servlet einschalten und nutzen Ausnahmefälle regeln Ausloggen sicherstellen (Session deaktivieren) generell: inkrementelle 334

117 Sicheres JSF (5/17) - Projektstruktur serverspezifische Einstellungen Angabe von Rollen und Rechten zu schützende Informationen pro Gruppe auch Startseite geschützt Eingabe der Nutzererkennung bekannter Nutzer ohne Rechte nicht existenter Nutzer 335

118 Sicheres JSF (6/17) - serverindividuelle Vorbereitung Rechte-Rollen werden mit konkreten Nutzern in Datei glassfish-web.xml (vorher sun-web.xml) umgesetzt <security-role-mapping> <role-name>basisnutzer</role-name> <group-name>basic</group-name> </security-role-mapping> <security-role-mapping> <role-name>editierer</role-name> <group-name>admin</group-name> </security-role-mapping> Gruppenname aus Datenbank (Spalte) Auch Nutzer (username) direkt eintragbar 336

119 Sicheres JSF (7/17) - JSF-Konfiguration web.xml [1/3] <welcome-file-list> <welcome-file>faces/hinzufuegen/index.xhtml</welcome-file> </welcome-file-list> <security-constraint> <display-name>c1</display-name> <web-resource-collection> <web-resource-name>basisschutz</web-resource-name> <description/> <url-pattern>/faces/hinzufuegen/*</url-pattern> <http-method>get</http-method> <http-method>post</http-method> </web-resource-collection> <auth-constraint> <description/> <role-name>basisnutzer</role-name> </auth-constraint> <user-data-constraint> <transport-guarantee>confidential</transport-guarantee> </user-data-constraint> </security-constraint> Startseite im Unterordner Regel für alle Seiten des Ordners wer darf HTTPS einschalten 337

120 Sicheres JSF (8/17) - JSF-Konfiguration web.xml [2/3] <security-constraint> <display-name>c2</display-name> <web-resource-collection> <web-resource-name>editierschutz</web-resource-name> <description/> <url-pattern>/faces/editieren/*</url-pattern> <http-method>get</http-method> <http-method>post</http-method> </web-resource-collection> <auth-constraint> <description/> <role-name>editierer</role-name> </auth-constraint> <user-data-constraint> <transport-guarantee>confidential</transport-guarantee> </user-data-constraint> </security-constraint> 338

121 Sicheres JSF (9/17) - JSF-Konfiguration web.xml [3/4] <login-config> <auth-method>form</auth-method> <realm-name>zugriffsrealm</realm-name> <form-login-config> <form-login-page>/faces/hinzufuegen/login.xhtml</form-login-page> <form-error-page>/faces/loginerror.xhtml</form-error-page> </form-login-config> </login-config> <security-role> <description/> <role-name>basisnutzer</role-name> </security-role> <security-role> <description/> <role-name>editierer</role-name> </security-role> Art der Anmeldung (so sicher) im Server; Verweis auf Nutzertabellen Login und Login- Fehler-Seite in glassfish-web.xml eingerichtete Rollen 339

122 Sicheres JSF (10/17) - JSF-Konfiguration web.xml [4/4] <error-page> <error-code>403</error-code> <location>/faces/fehler.xhtml</location> </error-page> <error-page> <error-code>500</error-code> <location>/faces/fehler.xhtml</location> </error-page> <error-page> <error-code>404</error-code> <location>/faces/loginerror.xhtml</location> </error-page> </web-app> pro Fehlerart eigene Seite einstellbar 340

123 Sicheres JSF (11/17) Nutzeranalyse [1/2] Hinweis: Klasse nicht public class Nutzer implements Serializable { private String name; private boolean editierer; private boolean basisnutzer; public boolean isedit() { lesenutzer(); return editierer; } public boolean isbasis() { lesenutzer(); return basisnutzer; } 341

124 Sicheres JSF (12/17) - Nutzeranalyse [2/2] private void lesenutzer() { if (name == null) { ExternalContext ectx = FacesContext.getCurrentInstance().getExternalContext(); name = ectx.getremoteuser(); if (ectx.isuserinrole("editierer")) { editierer = true; } if (ectx.isuserinrole("basisnutzer")) { basisnutzer = true; } } } public String getname() { lesenutzer(); return name; } } 342

125 Sicheres JSF (13/17) - Startseite <h:commandbutton value="ausloggen" action="#{module.ausloggen(nutzer)}"/> // in ModulBean public String ausloggen(nutzer nutzer) { System.out.println(nutzer); ExternalContext ectx = FacesContext.getCurrentInstance().getExternalContext(); ectx.invalidatesession(); nutzer = null; return "/hinzufuegen/index.xhtml?faces-redirect=true"; } 343

126 Sicheres JSF (14/17) uebersicht.xhtml <h:column rendered="#{nutzer.edit}"> <f:facet name="header"> <h:outputtext value="bearbeitung"/> </f:facet> <h:commandlink value="editieren" action="#{module.editieren(m)}"/> </h:column> 344

127 Sicheres JSF (15/17) - login.xhtml <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE...> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html"> <h:head> <title>einloggen</title> </h:head> <h:body> <form name="post" action="j_security_check"> Nutzer:<input type="text" name="j_username" value="" size="15" /><br/> Passwort:<input type="text" name="j_password" value="" size="15" /><br/> <input type="submit" value="anmelden" /> </form> </h:body> </html> 345

128 Sicheres JSF (16/17) - loginerror.xhtml <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1- transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html"> <head> <title>fehler</title> </head> <h:form> Passt nicht <h:commandbutton value="noch mal" action="/hinzufuegen/login.xhtml"/> </h:form> </html> 346

129 Sicheres JSF (17/17) - fehler.xhml (hier unberechtigt) <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1- transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html"> <h:head> <title>au weia</title> </h:head> <h:body> <h:form> <h:outputtext value="hey, #{nutzer.name}, Du kommst nit rein "/> <h:commandbutton value="zurück" action="#{wahrheit.ausloggen(nutzer)}"/> </h:form> </h:body> </html> 347

130 Auch Fehler 500 abfangen (Session-Timeout) 348

131 Sicherer Datenverkehr Übertragungsart wählen, dann anmelden hinzufuegen/index.xhtml hinzufuegen/index.xhtml (login.xhtml) hinzufuegen/index.xhtml 349

132 Session-Kontrolle / Vision: systematischere Rechte meist sinnvoll: Nutzerdaten in Session-Objekt speichern (außer, wenn nur erlaubt / nicht erlaubt) Bei erster Nutzung weitere Nutzerdaten setzen (evtl. jedes Attribut auf null prüfen, dann Boolean statt boolean) Bei Logout Nutzer-Objekt auf null setzen (!) Generell Session mit invalidatesession() // Ausblick, wie es sein kann, noch nicht JSF public class Wahrheit public String getwahr(){ return "Der Kunde ist König"; } 350

133 4.7 Weitere JSF-Möglichkeiten Graphische Elemente Konvertierung Nutzung von Listenern 351

134 GUI-Spielereien - Boolesche Checkbox <h:form> <h:selectbooleancheckbox title="gratisprobe" value="#{guikram.gratis}" /> <h:outputtext value="wollen Sie es gratis?"/> <br> <h:commandbutton action="./index.xhtml" value="sichern"/> </h:form> private boolean gratis; public void setgratis(boolean v){ gratis=v; System.out.println("gratis: "+gratis);} 352

135 GUI-Spielereien - selectmanycheckbox (1/2) import javax.faces.model.selectitem; public class GUIKram { private List<SelectItem> list= new ArrayList<SelectItem>(); private String[] array={"ute","uwe","urs","uta"}; private List<String> elemente; public GUIKram() { for(string s:array) list.add(new SelectItem(s)); } public List<String> getelemente() { System.out.println("get"); return elemente; } public void setelemente(list<string> e) { elemente = e; System.out.println("elemente: "+elemente); }

136 GUI-Spielereien - selectmanycheckbox (2/2) <h:selectmanycheckbox id="nase" value="#{guikram.elemente}"> <f:selectitems value="#{guikram.list}"/> </h:selectmanycheckbox> <h:commandbutton action="./index.xhtml" value="sichern"/> 354

137 GUI-Spielereien - selectmanymenu <h:selectmanymenu id="nas2" value="#{guikram.elemente}"> <f:selectitems value="#{guikram.list}"/> </h:selectmanymenu> <h:commandbutton action="./index.xhtml" value="sichern"/> 355

138 GUI-Spielereien - selectmanylistbox <h:selectmanylistbox id="nas3" value="#{guikram.elemente}"> <f:selectitems value="#{guikram.list}"/> </h:selectmanylistbox> <h:commandbutton action="./index.xhtml" value="sichern"/> 356

139 GUI-Spielereien - selectoneradio <h:selectoneradio id="nas4" value="#{guikram.el}"> <f:selectitems value="#{guikram.list}" /> </h:selectoneradio> <h:commandbutton action="save" value="sichern"/> private String el; public void setel(string el) { } this.el = el; System.out.println("el: "+el); Variante: el am Anfang setzen analog: selectonemenu selectonelistbox 357

140 Konvertierung: Datum (1/3) <h:form> <h:panelgrid columns="3" frame="border"> <h:outputlabel for="da" value="datum:"/> <h:inputtext id="da" value ="#{studi.start}"> <f:convertdatetime pattern ="dd.mm.yyyy"/> </h:inputtext> <h:message for="da"/> <h:outputlabel value="format:"/> <h:outputtext value ="#{studi.start}"/> <h:outputtext value ="#{view.locale}" /> <h:outputtext value ="#{studi.start}"> <f:convertdatetime type ="date" /> </h:outputtext > <h:outputtext value ="#{studi.start}"> <f:convertdatetime type ="time" /> </h:outputtext > <h:outputtext value ="#{studi.start}"> <f:convertdatetime pattern="ddd-mmmmm-yy" /> </h:outputtext > </h:panelgrid> </h:form> 358

141 Konvertierung: public class Studi { private Date start; public Date getstart() { return start; } } public void setstart(date start) { } this.start = start; 359

142 Konvertierung: Datum (3/3) Datenübertragung schon durch Drücken von <Return>, wg. Converter 360

143 Konzept Konvertierung für Standardtypen findet automatisch eine Konvertierung mit Prüfung und eventueller Fehlermeldung statt (int) Man kann für Standarddatentypen einige Parameter zur Konvertierung ergänzen Generell besteht die Möglichkeit, eigene Konvertierer in XHTML-Seite einzubinden Konvertierer müssen Interfaces berücksichtigen Ziel: Konvertierung in zugehöriger Bean, möglichst wenig Aufwand auf Darstellungsseite Thema bietet sich zur Vertiefung an 361

144 Beispiel: Nutzung von Listenern (1/3) <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html"> <h:head> <title>facelet Title</title> </h:head> <h:body> <h:form> <h:messages globalonly="true" layout="table"/> <h:panelgrid columns="2"> <h:commandbutton id="c1" action="#{ac.listen}" value="c1"/> <h:commandbutton id="c2" action="#{ac.listen}" value="c2"/> <h:commandbutton id="c3" action="./index.xhtml" actionlistener="#{ac.listen}" value="c3"/> <h:commandbutton id="c4" action="./index.xhtml" actionlistener="#{ac.listen}" value="c4"/> </h:panelgrid> </h:form> </h:body> </html> 362

145 Beispiel: Nutzung von public class Knoeppke { public String listen() { // zufällig gleicher Name FacesContext fc = FacesContext.getCurrentInstance(); fc.addmessage(null, new FacesMessage("wer wars?")); return "./index.xhtml"; } } public void listen(actionevent e) { UIComponent u= e.getcomponent(); FacesContext fc = FacesContext.getCurrentInstance(); fc.addmessage(null, new FacesMessage("es war "+u.getid())); } 363

146 Beispiel: Nutzung von Listenern (3/3) 364

147 4.8 JSF-Lebenszyklus 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 UIComponent extends Object implements 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 UIViewRoot that represents the entire content of the request or response. (Oracle Klassendoku) public abstract class UIComponentBase extends UIComponent public class UICommand extends UIComponentBase implements ActionSource2 public class UIOutput extends UIComponentBase implements ValueHolder 365

148 Analyse von FacesContext (1/4) <h:form id="f1"> <h:messages id="m1" globalonly="true"/> <h:panelgrid id="p1" columns="3" > <h:outputlabel id="o1" for="mname" value="modulname "/> <h:inputtext id="mname" value="#{module.modul.name}"/> <h:message id="m2" for="mname" /> <h:outputlabel id="o2" for="mnr" value="modulnummer "/> <h:inputtext id="mnr" value="#{module.modul.nr}"/> <h:message id="m3" for="mnr"/> <h:commandbutton id="c1" value="abschicken" action="#{module.uebernehmen}"/> </h:panelgrid> <h:commandlink id="anz" action="#{module.anzeigen}" > <h:outputtext value="zur Modulübersicht"/> </h:commandlink><br/> <h:commandlink id="intern" action="#{module.intern}" > <h:outputtext value="jsfaufbauinfos"/> </h:commandlink> </h:form> 366

149 Analyse von FacesContext (2/4) private void baum(uicomponent ui, String leer) { System.out.println(leer + ui.getid() + ": " + ui.getrenderertype() +" : " + ui.getclass()); List<UIComponent> com = ui.getchildren(); for (UIComponent u : com) { baum(u, leer + " "); } } public String intern() { FacesContext ctxt = FacesContext.getCurrentInstance(); UIViewRoot vr = ctxt.getviewroot(); if (vr!= null) { System.out.println("Root:" + vr.getviewid()); baum(vr, " "); } else System.out.println("keine Root"); return ANZEIGEN; } 367

150 Analyse von FacesContext (3/4) INFO: Root:/index.xhtml INFO: j_id1: null : class javax.faces.component.uiviewroot INFO: j_idt2: null : class com.sun.faces.facelets.compiler.uiinstructions INFO: j_idt3: null : class com.sun.faces.facelets.compiler.uiinstructions INFO: j_idt4: javax.faces.head : class javax.faces.component.uioutput INFO: j_idt5: null : class com.sun.faces.facelets.compiler.uiinstructions INFO: j_idt6: javax.faces.body : class javax.faces.component.uioutput INFO: f1: javax.faces.form : class javax.faces.component.html.htmlform INFO: m1: javax.faces.messages : class javax.faces.component.html.htmlmessages INFO: p1: javax.faces.grid : class javax.faces.component.html.htmlpanelgrid INFO: o1: javax.faces.label : class javax.faces.component.html.htmloutputlabel INFO: mname: javax.faces.text : class javax.faces.component.html.htmlinputtext INFO: m2: javax.faces.message : class javax.faces.component.html.htmlmessage INFO: o2: javax.faces.label : class javax.faces.component.html.htmloutputlabel INFO: mnr: javax.faces.text : class javax.faces.component.html.htmlinputtext INFO: m3: javax.faces.message : class javax.faces.component.html.htmlmessage INFO: c1: javax.faces.button : class javax.faces.component.html.htmlcommandbutton INFO: anz: javax.faces.link : class javax.faces.component.html.htmlcommandlink INFO: j_idt15: javax.faces.text : class javax.faces.component.html.htmloutputtext INFO: j_idt16: null : class com.sun.faces.facelets.compiler.uiinstructions INFO: intern: javax.faces.link : class javax.faces.component.html.htmlcommandlink INFO: j_idt17: javax.faces.text : class javax.faces.component.html.htmloutputtext INFO: j_idt18: null : class com.sun.faces.facelets.compiler.uiinstructions Grundregel: Layout bleibt statisch; Ein- und Ausblenden durch Attribut rendered 368

151 Analyse von FacesContext (4/4) - Komponentenbaum UIViewRoot HtmlForm HtmlMessages HtmlPanelGrid HtmlOutputLabel HtmlInputText HtmlMessage HtmlOutputLabel HtmlInputText HtmlMessage HtmlCommandButton HtmlCommandLink HtmlOutputText HtmlCommandLink HtmlOutputText 369

152 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 <context-param> <param-name>javax.faces.state_saving_method</param-name> <param-value>client</param-value> </context-param> anzuzeigende Seite enthält Zustand in hidden Field 370

153 Speichern der Zustandsinformationen (2/2) Seitenende in generiertem HTML (Ausschnitt): <a id="f1:intern" href="#" onclick="if(typeof jsfcljs == 'function'){jsfcljs(document.forms['f1'],'f1:intern, f1:intern','');}return false">jsfaufbauinfos</a> <input type="hidden" name="javax.faces.viewstate" id="javax.faces.viewstate" value="h4siaaaaaaaaanvxw2wuvrg+o9s7fxrhglnaaiiyu2w7i0hqsif efndb0i1f4kgcnt3bnti3z850bogehtreeqnbek0wavdbb3hrn4jxeh6m JJhI4ouJCTEmxsRLYkxQH9Tzn9mZnd2dbSliopNmembm/875/tt3zl7+E VaBuo+mp7D8zgmY3U2NpGbIyLd9dLnT73RYW6VBYQcHSG0wjRQQtSUmGm sqiwirndui5liqaspsayffoswsqejuzk0evnuwyh41qe/fq4+ugvbamft cm8dhzb1qeroavz2jy6phkvxg6mpivit2oara1zm1ke/cwtjvk0oo0eu5 crjvbjgkk44fu8al+kow8oi1eicxbitkbbzsfjnyz+6pnrq499eu=" /> </form> </body> </html> 371

154 Hintergrund: Abarbeitung von JSF-Anfragen 372

155 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) 373

156 Apply Request Values UI-Komponenten mit Anfrageparametern 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 (Input): sofort konvertieren und validieren 374

157 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 375

158 Update Model Values Werte im Modell (Beans) aktualisieren Typsicherheit durch vorherige Schritte garantiert nutzt Methode processupdates() der Komponenten Werte aktualisieren, durch set-methoden Abbruch bei Fehler 376

159 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 377

160 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 378

161 JSF-Lifecycle verfolgen (1/8) Man kann PhaseListener schreiben, die über Phasenänderungen informiert werden wird in faces-config.xml festgehalten <?xml version='1.0' encoding='utf-8'?> <faces-config version="2.0" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xmlns:xsi="http://www.w3.org/2001/xmlschema-instance" xsi:schemalocation="http://xmlns.jcp.org/xml/ns/javaee <lifecycle> <phase-listener>controller.zeichphasen</phase-listener> </lifecycle> </faces-config> 379

162 JSF-Lifecycle verfolgen (2/8) - index.xhtml <h:form id="form1"> <h:panelgrid id="panel1" columns="3" rules="all"> <h:outputtext id="o1" value="neuer Text"/> <h:inputtext id="i1" value="#{analyse.ein}" required="true"/> <h:message id="m1" for="i1"/> <h:outputtext id="ow1" value="neue Zahl"/> <h:inputtext id="iw1" value="#{analyse.zahl}"/> <h:message id="m1w" for="iw1"/> <h:outputtext id="o2" value="alter Text/Zahl"/> <h:outputtext id="o3" escape="false" value="#{analyse.ein}"/> <h:outputlabel id="ow3" value="#{analyse.zahl}"/> <h:commandbutton id="c1" value="übernehmen" action="#{analyse.uebernehmen}"/> </h:panelgrid> </h:form> 380

163 JSF-Lifecycle verfolgen (3/8) public class Analyse implements Serializable{ private String ein; private int zahl; public Analyse(){} public String uebernehmen(){ return "./index.xhtml"; } } public String getein() {return ein;} public void setein(string ein) {this.ein = ein;} public int getzahl() {return zahl;} public void setzahl(int zahl) {this.zahl = zahl;} 381

164 JSF-Lifecycle verfolgen (4/8) - PhaseListener [1/2] public class ZeichPhasen implements PhaseListener { // Hier angeben, in welchen Phasen dieser Listener genutzt // werden soll, im Beispiel in public PhaseId getphaseid() { return PhaseId.ANY_PHASE; public void beforephase(phaseevent e) { if (e.getphaseid() == PhaseId.RESTORE_VIEW) System.out.println("===geht los"); System.out.println("before: " + e.getphaseid()); zeichanalyse(); } 382

165 JSF-Lifecycle verfolgen (5/8) - PhaseListener public void afterphase(phaseevent e) { System.out.println("after: " + e.getphaseid()); zeichanalyse(); if (e.getphaseid() == PhaseId.RENDER_RESPONSE) System.out.println("===is Schicht"); } } private void zeichanalyse() { FacesContext fc = FacesContext.getCurrentInstance(); Analyse a = fc.getapplication().evaluateexpressionget(fc, "#{analyse}", Analyse.class); System.out.println("A: "+a.getein() +" :: "+ a.getzahl()); } 383

166 JSF-Lifecycle verfolgen (6/8) - Applikationsstart INFO: ===geht los INFO: before: RESTORE_VIEW 1 INFO: A: null :: 0 INFO: after: RESTORE_VIEW 1 INFO: A: null :: 0 INFO: before: RENDER_RESPONSE 6 INFO: A: null :: 0 INFO: after: RENDER_RESPONSE 6 INFO: A: null :: 0 INFO: ===is Schicht Nutzer macht Eingaben 384

167 JSF-Lifecycle verfolgen (7/8) - erfolgreiche Übernahme INFO: ===geht los INFO: before: RESTORE_VIEW 1 INFO: A: null :: 0 INFO: after: RESTORE_VIEW 1 INFO: A: null :: 0 INFO: before: APPLY_REQUEST_VALUES 2 INFO: A: null :: 0 INFO: after: APPLY_REQUEST_VALUES 2 INFO: A: null :: 0 INFO: before: PROCESS_VALIDATIONS 3 INFO: A: null :: 0 INFO: after: PROCESS_VALIDATIONS 3 INFO: A: null :: 0 INFO: before: UPDATE_MODEL_VALUES 4 INFO: A: null :: 0 INFO: after: UPDATE_MODEL_VALUES 4 INFO: A: Zaphod :: 42 INFO: before: INVOKE_APPLICATION 5 INFO: A: Zaphod :: 42 INFO: after: INVOKE_APPLICATION 5 INFO: A: Zaphod :: 42 INFO: before: RENDER_RESPONSE 6 INFO: A: Zaphod :: 42 INFO: after: RENDER_RESPONSE 6 INFO: A: Zaphod :: 42 INFO: ===is Schicht 385

168 JSF-Lifecycle verfolgen (8/8) - falsche Eingabe INFO: ===geht los INFO: before: RESTORE_VIEW 1 INFO: A: Zaphod :: 42 INFO: after: RESTORE_VIEW 1 INFO: A: Zaphod :: 42 INFO: before: APPLY_REQUEST_VALUES 2 INFO: A: Zaphod :: 42 INFO: after: APPLY_REQUEST_VALUES 2 INFO: A: Zaphod :: 42 INFO: before: PROCESS_VALIDATIONS 3 INFO: A: Zaphod :: 42 INFO: after: PROCESS_VALIDATIONS 3 INFO: A: Zaphod :: 42 INFO: before: RENDER_RESPONSE 6 INFO: A: Zaphod :: 42 INFO: after: RENDER_RESPONSE 6 INFO: A: Zaphod :: 42 INFO: ===is Schicht 386

169 Problem: Abbrüche (1/2) in Analyse : public String zuruecksetzen(){ ein=""; zahl=0; return "./index.xhtml"; } in index.xhtml <h:commandbutton id="c2" value="zurücksetzen" action="#{analyse.zuruecksetzen}"/> Problem: Validierung läuft trotzdem 387

170 Problem: Abbrüche (2/2) immediate= true erlaubt Validierung zu überspringen <h:commandbutton id="c2" value="zurücksetzen" immediate="true" action="#{analyse.zuruecksetzen}"/> ===geht los before: RESTORE_VIEW 1 A: Zaphod :: 42 after: RESTORE_VIEW 1 A: Zaphod :: 42 before: APPLY_REQUEST_VALUES 2 A: Zaphod :: 42 after: APPLY_REQUEST_VALUES 2 A: :: 0 before: RENDER_RESPONSE 6 A: :: 0 after: RENDER_RESPONSE 6 A: :: 0 ===is Schicht 388

171 Nutzung von immediate für Eingabefelder immediate=true fordert sofortige Validierung und Konvertierung für diese Komponente <h:inputtext id="i1" value="#{analyse.ein}" immediate="true" validatormessage="nur 3"> <f:validatelength maximum="3"/> </h:inputtext> ===geht los before: RESTORE_VIEW 1 A: null :: 0 after: RESTORE_VIEW 1 A: null :: 0 before: APPLY_REQUEST_VALUES 2 A: null :: 0 after: APPLY_REQUEST_VALUES 2 A: null :: 0 before: RENDER_RESPONSE 6 A: null :: 0 after: RENDER_RESPONSE 6 A: null :: 0 ===is Schicht <Return> im Eingabefeld drücken 389

172 Eineinhalb Schleifen public String uebernehmen(){ return "./index.xhtml?faces-redirect=true"; } // wie vorher INFO: before: INVOKE_APPLICATION 5 INFO: A: Zaphod :: 42 INFO: after: INVOKE_APPLICATION 5 INFO: A: Zaphod :: 42 INFO: ===geht los INFO: before: RESTORE_VIEW 1 INFO: A: Zaphod :: 42 INFO: after: RESTORE_VIEW 1 INFO: A: Zaphod :: 42 INFO: before: RENDER_RESPONSE 6 INFO: A: Zaphod :: 42 INFO: after: RENDER_RESPONSE 6 INFO: A: Zaphod :: 42 INFO: ===is Schicht Ohne Redirect: rein serverseitige Weiterleitung, Client kennt Ziel nicht 390

173 Nutzung von CSS Verwaltung von Hilfsdateien und Bildern im Ordner resources (dieser Name ist wichtig) in Unterordnern mit beliebigen Namen Nutzung (mehrfach möglich in h:head) <h:outputstylesheet library="css" name="stil.css"/> Jede JSF-Komponente hat style- Attribut (oder styleclass), weitere Attribute möglich <h:messages globalonly="true" styleclass="infoclass"/> 391

174 JSF und CSS (1/3) CSS-Dateien nutzbar fast allen JSF-Elementen können Style-Klassen (genauer Style- Spezifikationen) und konkrete Styles zugeordnet werden 392

175 JSF und CSS (2/3) Ausschnitt aus Anwendung <h:head> <title>modulübersicht</title> <h:outputstylesheet library="css" name="stil.css"/> </h:head> <h:form id="f2"> <h:messages globalonly="true" styleclass="infoclass"/> <h:panelgrid rendered="#{!empty module.module}"> <h:datatable value="#{module.module}" var="m" styleclass="resultgrid" rowclasses="oddrow,evenrow"> <h:column > <f:facet name="header"> <h:outputtext value="nummer" /> </f:facet>

176 JSF und CSS (3/3) - Beispielausgabe 394

177 4.9 Templates und Komponenten 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 einer 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) Anmerkung: Vermeiden Sie möglichst die Nutzung der JSTL MVC-Ansatz, kein Java-Code in XHTML möglich (und nötig) Hinweis: Chrome ab und zu bemerkenswert langsam 395

178 Erstes Template-Beispiel (1/5) - Template rahmen.xhtml <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:ui="http://xmlns.jcp.org/jsf/facelets"> <h:head> <h:graphicimage library="bilder" name="boah.jpg" width="200" height="40" alt="boah"/> <title> <ui:insert name="titel"/> </title> </h:head> <h:body> <h:form> <ui:insert name="rumpf"/> <br/> <br/> <h:commandlink value="zurück" action="#{bsp.zurueck}"/> </h:form> </h:body> </html> 396

179 Erstes Template-Beispiel (2/5) public class Bsp { public String getergebnis(){ return "Du solltest Dich ändern"; } public String bad(){ return "./analyse.xhtml"; } public String good(){ return "./analyse.xhtml"; } } public String zurueck(){ return "./index.xhtml"; } 397

180 Erstes Template-Beispiel (3/5) - index.xhtml <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:ui="http://xmlns.jcp.org/jsf/facelets"> <h:body> <ui:composition template="./templates/rahmen.xhtml"> <ui:define name="titel"> Wesenstest </ui:define> <ui:define name="rumpf"> <h:outputtext value="was bist Du?"/> <br/> <h:commandbutton value="bad Guy" action="#{bsp.bad}"/> <h:commandbutton value="good Boy" action="#{bsp.good}"/> </ui:define> </ui:composition> </h:body> </html> 398

181 Erstes Template-Beispiel (4/5) - analyse.xhtml <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1- transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:ui="http://xmlns.jcp.org/jsf/facelets"> <h:body> <ui:composition template="./templates/rahmen.xhtml"> <ui:define name="titel"> Ergebnis </ui:define> <ui:define name="rumpf"> <h:outputtext value="#{bsp.ergebnis}"/> </ui:define> </ui:composition> </h:body> </html> 399

182 Erstes Template-Beispiel (5/5) - Nutzung 400

183 Aufbau genauer analysiert in index.xhtml <h:body> <ui:composition template="./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:body> <h:outputtext value="hallo"/> <ui:decorate template="./templates/rahmen.xhtml"> 401

184 Nutzung von Parametern in rahmen.xhtml <h:commandlink value="zurück" action="#{bsp.zurueck}" rendered="#{!start}"/> in index.xhtml <ui:composition template="./templates/rahmen.xhtml"> <ui:param name="start" value="true"/> <ui:define name="titel"> in analyse.xhtml <ui:composition template="./templates/rahmen.xhtml"> <ui:param name="start" value="false"/> Parameter auch bei anderen Elementen nutzbar 402

185 Nutzung von ui:include (1/2) - index.xhtml <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://xmlns.jcp.org/jsf/facelets"> <ui:include src="./templates/head.xhtml"> <ui:param name="titel" value="hallodele"/> </ui:include> <ui:include src="./templates/body.xhtml"> <ui:param name="text" value="rischtisch"/> <ui:param name="obj" value="#{bsp}"/> </ui:include> </html> 403

186 Nutzung von ui:include (2/2) - head/body.xhtml <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html"> <h:head> <title> <h:outputtext value="#{titel}"/> </title> </h:head> </html> <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html"> <h:body> <h3> <h:outputtext value="#{text}"/> </h3> <h:outputtext value="#{obj.ergebnis}"/> </h:body> </html> 404

187 Nutzung von h:graphicimage Verwaltung von Hilfsdateien und Bildern im Ordner WEB-INF/resources Nutzung <h:graphicimage library="bilder" name="boah.jpg" width="200" height="40" alt="boah"/> 405

188 Nutzung von ui:debug Im Development- oder Debug-Modus erhält man durch Drücken von CTRL+SHIFT+d Komponentenbaum angezeigt <html xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://xmlns.jcp.org/jsf/facelets"> <ui:debug/> <ui:include src="./templates/head.xhtml"> 406

189 eigener Komponenten Möglichkeit Komponenten basierend auf anderen Komponenten in XHTML zu realisieren konfigurierbar über Interface (hier nur Mini-Beispiel) vor eigener nachdenken: Realisierung mit Templates oder/und include genauso gut? gibt es gewünschte Komponente schon? (z. B. nachschauen unter Reichen nicht Validatoren, Konvertierer und evtl. PhaseListener aus? 407

190 Komponente (1/4) - Schnittstelle glossar.xhtml <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1- transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:ui="http://xmlns.jcp.org/jsf/facelets" xmlns:composite="http://xmlns.jcp.org/jsf/composite"> <!-- INTERFACE --> <composite:interface> <composite:attribute name="schlagwort" required="true"/> <composite:attribute name="detail" required="true"/> </composite:interface> 408

191 Komponente (2/4) - Implementierung <!-- IMPLEMENTATION --> <composite:implementation> <h:panelgrid columns="2" rules="cols" frame="box"> <h:outputlabel value="#{cc.attrs.schlagwort}"/> <h:panelgroup> <p> <h:outputtext value="#{cc.attrs.detail}"/> </p> <composite:insertchildren/> </h:panelgroup> </h:panelgrid> </composite:implementation> </html> 409

192 Komponente (3/4) - Beispielnutzung index.xhtml <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:bsp="http://xmlns.jcp.org/jsf/composite/beispiel"> <h:head> <title>glossar</title> </h:head> <h:body> <bsp:glossar schlagwort="adam" detail="der, wo nich allein sein konnte"/> <bsp:glossar schlagwort="eva" detail="die, wo den Apfel nich lassen konnte"> Wo ist Missing Link? </bsp:glossar> </h:body> </html> 410

193 Komponente (4/4) - Ausgabe, Projektstruktur Ordner muss so heißen 411

194 Ausblick: Komponentenmöglichkeiten Im Interface wesentlich mehr als nur einfache Parameter (Attribute) definierbar Attribute können Verknüpfungen zu Action-Methoden bzw. Event-Listenern enthalten method-signature="java.lang.string f()" Übergabe weiterer Funktionalität (Methoden) an Komponente möglich für Event-Listener, Konvertierer und Validatoren <composite:actionsource> <composite:valueholder> <composite:editablevalueholder> Funktionalität kann dann bei inneren Komponenten der Composite-Komponente genutzt werden 412

195 4.10 Nutzung von Ajax Ajax = Asynchronous JavaScript and XML(HTTPRequest) klassische Webapplikation: Nutzer macht Eingaben Nutzer beendet Eingabe (Knopf, Link, <Return>-Taste) Informationen an Server, der wertet aus neu berechnete Seite wird Nutzer zur Verfügung gestellt interaktive Applikation (Jesse James Garret, 2004) Nutzer macht Eingaben Eingaben führen auch während der Eingabe zu Reaktionen Informationen werden zwischenzeitlich auf Server ausgewertet berechnete Teilergebnisse werden in aktuelle Seite eingeblendet 413

196 Ajax-Beispiel (1/3) public class Nutzer implements Serializable{ private String name = ""; public String getname() { } return this.name; } public void setname(string name) { } this.name = name; 414

197 Ajax-Beispiel (2/3) - index.xhtml mit f:ajax <h:form> <h:outputtext value="your name: " /> <h:inputtext id="in" value="#{user.name}" > <f:ajax render="greeting" event="keyup"/> <f:validatelength minimum="0" maximum="10" /> </h:inputtext> <h:message for="in"/> <br/> <h:panelgroup id="greeting" > <h:outputtext value="hello, " rendered="#{not empty user.name}" /> <h:outputtext value="x " rendered="#{empty user.name}" /> <h:outputtext value="#{user.name}" /> <h:outputtext value="!" rendered="#{not empty user.name}"/> </h:panelgroup> </h:form> 415

198 Ajax-Beispiel (3/3) - Ausgabe Start Nutzer tippt, dann unmittelbare Aktion (so) keine direkte Validierung Nutzer drückt Return-Taste 416

199 Granulare Nutzung von f:ajax f:ajax kann um Komponenten gelegt werden f:ajax kann in Komponenten ergänzt werden (z. B. h:commandbutton) f:ajax kann in und um Komponenten genutzt werden, dann ist Effekt die Summe aller spezifizierten Effekte Mehrere f:ajax-einträge für eine Komponente ergänzen sich generell render: IDs der Komponenten, die neu gerendert werden sollen = dieses = umgebende = alle = kein Element) execute: IDs der Komponenten, die vollständig JSF- Lebenszyklus durchlaufen sollen (auch... s. o.) 417

200 Garantierte Aktualisierung Nicht alle Elemente werden sofort aktualisiert, z. B. h:commandbutton Standardtrick: Zu verändernde Komponenten in h:panelgroup oder h:panelgrid einordnen <h:inputtext id="nutzername" value="#{steuerung.nutzer}" > <f:ajax render="edit" event="keyup" listener="#{ }"/> </h:inputtext> <h:panelgroup id="edit"> <h:commandbutton id ="editbutton" value="editieren" action="#{ }" rendered="#{!empty steuerung.nutzer}"/> </h:panelgroup> 418

201 Interaktionsspielerei (1/4) - index.xhtml <h:form> <h:outputlabel id="be" value="#{control.beruehrt}"> <f:ajax event="mouseover" render="be pg" listener="#{control.drueber}"/> <f:ajax event="mouseout" render="be pg" listener="#{control.weg}"/> </h:outputlabel> <h:panelgrid id="pg" columns="2"> <h:outputtext value="drueber:"/> <h:outputtext value="#{control.dzahl}"/> <h:outputtext value="weg:"/> <h:outputtext value="#{control.wzahl}"/> </h:panelgrid> </h:form> 419

202 Interaktionsspielerei (2/4) public class Control implements Serializable{ private String beruehrt = "beruehr mich"; private int dzahl; private int wzahl; } public String getberuehrt() {return beruehrt;} public int getdzahl() {return dzahl;} public int getwzahl() {return wzahl;} public void drueber() { beruehrt = "beruehr mich nicht"; dzahl++; } public void weg() { beruehrt = "beruehr mich"; wzahl++; } 420

203 Interaktionsspielerei (3/4) Ausgabe Firefox 421

204 Interaktionsspielerei (4/4) Ausgabe Chrome Zähler laufen bei Bewegung auf dem Text los, maximaler Unterschied: eins 422

205 action blur change click dblclick focus keydown keypress keyup load mousedown mousemove mouseout mouseover mouseup select unload valuechange <h: Komponenten> und Events (Ausschnitt) body X X X X X X X X X X X X commandbutton X X X X X X X X X X X X X X commandlink X X X X X X X X X X X X X datatable X X X X X X X X X X inputtext X X X X X X X X X X X X X X X inputtextarea X X X X X X X X X X X X X X X outputlabel X X X X X X X X X X X X panelgrid X X X X X X X X X X selectmanymenu X X X X X X X X X X X X X X X selectoneradio X X X X X X X X X X X X X X X 423

206 Polling mit Primefaces (1/2) <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:p="http://primefaces.prime.com.tr/ui"> <h:head> <title>poller</title> </h:head> <h:body> <h:form> <h:outputtext id="o1" value="#{zeit.datum}"/><br/> <h:outputtext id="o2" value="#{zeit.anzahl}"/> <p:poll interval="3" update="o1,o2"/> </h:form> </h:body> </html> 424

207 Polling mit public class Zeit implements Serializable{ private int anzahl; public String getdatum() { anzahl++; return new Date().toString(); } public int getanzahl() { return anzahl; } } 425

208 Anforderung Kanban-Board. das immer aktuell den Stand der BacklogElemente zeigt 426

209 Ausschnitt kanban.xhtml <h:panelgroup id="kanbantabelle" rendered="#{kanbancontroller.ausgewaehlt}"> <p:poll interval="5" update="kanbantabelle"/> <h3> <h:link value="#{kanbancontroller.sprint.motto}" outcome="backlogelementparam" style="color: orange"> <f:param name="sid" value="#{kanbancontroller.sprint.id}" /> <f:param name="actionid" value="1" /> </h:link> </h3> <h:datatable value="#{kanbancontroller.sprint.backlogelemente}" var="b"... <h:column> <f:facet name="header"> <h:outputtext value="zu bearbeiten" /> </f:facet> <h:button value="#{b.titel}" rendered="#{b.phase.tostring() eq 'zu bearbeiten'}" 427

210 4.11 Testen von Web-Applikationen - Selenium Web-Browser nutzen schwerpunktmäßig HTML zur Darstellung Capture & Replay-Werkzeuge, die hardgecoded Pixel und Klicks verarbeiten, eignen sich meist auch für diese Programme Einfaches Werkzeug für Web-Applikationen und Firefox ist Selenium IDE [hier nicht gezeigt] (http://seleniumhq.org/) erlaubt Capture & Replay von Nutzereingaben ermöglicht Tests von Elementen, Identifizierung über Ids aber auch Beschriftungen erlaubt den Export der aufgezeichneten Tests u. a. in JUnit (Variante: Browsersteuerung aus JUnit heraus [nächste Folien], ähnlich FEST) basiert auf JavaScript und Iframes 428

211 Hinweise zum Testen Erinnerung: White Box Grey Box Black Box Basisfunktionalität mit JUnit testen einige Funktionalität ohne Server testbar gibt einfache Server nur zur Testausführung Selenium WebDriver ermöglicht Test der (Web-)Oberfläche niemals alle Tests durch Oberflächentests ersetzen es gibt nie das ultimative Werkzeug; aber Familie von Werkzeugen hilft oft Ziel: Continuous Integration 429

212 Selenium WebDriver Selenium steuert Browser von Java (C#, Python, Ruby) aus Installation als jar-dateien flexible Möglichkeiten zum Finden von GUI-Komponenten ideal für Regressionstests, bei wenig sich ändernden GUIs in fast allen Unternehmen genutzt, die Web-Applikationen herstellen kontinuierliche Weiterentwicklung (nicht immer alles übertragbar, Selenium -> Selenium 2) Grundregel: nur automatisieren, was sinnvoll und machbar ist, Rest manuell 430

213 Beispielprogramm (1/3) Spezifikation: Zu entwickeln ist eine Applikation mit der geheime Nachrichten an einen Server übergeben und dort wieder abgefragt werden können. Genauer gibt der Nutzer eine Nachricht zusammen mit zwei Codewörtern und der Anzahl, wie oft die Nachricht abgerufen werden kann, ein. Weiterhin kann ein Nutzer über die Eingabe zweier Codewörter an gespeicherte Nachrichten kommen. Ist die Codewortkombination nicht vorhanden, wird ein Standardtext ausgegeben. Realisierung: Glasfish, JSF (Nutzung des Application Scope) 431

214 Beispielprogramm (2/3) Server starten Applikation starten vergebene Ids: main:verfassen main:lesen 432

215 Beispielprogramm (3/3) Nachricht verfassen Nachricht lesen 433

216 Einblick in Nutzungsmöglichkeiten (1/14) public class SafeMoeglichkeitenTest { private WebDriver driver; private int linie = public void setup() { // Erzeugt neue Instanz des Browser Treibers // oftmals noch Konfigurationsaufwand driver = new FirefoxDriver(); // driver = new HtmlUnitDriver(); // driver = new ChromeDriver(); //driver = new InternetExplorerDriver(); } 434

217 Einblick in Nutzungsmöglichkeiten (2/14) Klasse WebDriver als zentrale Steuerungsmöglichkeit Erzeugt neue Browser-Instanz Browser muss auf dem System installiert sein, nutzt keine weiteren Einstellungen des aktuellen Nutzers (leeres Profil) werden kontinuierlich weiterentwickelt (früher reichte driver = new InternetExplorerDriver(); ) bisheriges Angebot (unterschiedliche Qualität): HtmlUnitDriver(), FirefoxDriver(), InternetExplorerDriver(), ChromeDriver(), OperaDriver durch andere Entwickler, IPhoneDriver nur zusammen mit Apple-XCode-Umgebung, AndroidDriver mit Android-sunterstützung Hintergrund: Selenium lange Zeit nur mit Firefox nutzbar 435

218 Einblick in Nutzungsmöglichkeiten (3/14) Zentrale Hilfsklasse für GUI-Komponenten: WebElement nur zur Veranschaulichung: Ausgabemöglichkeit private void zeigeelemente(list<webelement> liste){ System.out.println("----"+(++linie)); if (liste!= null) { for (WebElement w : liste) { System.out.println(" " + w.gettagname() + "::" + w.getattribute("type") + "::" + w.getattribute("name") + "::" + w.getattribute("value") + "::" + w.gettext() + "::" + w.getlocation() + "::" +w.isenabled()); } } } 436

219 Einblick in Nutzungsmöglichkeiten (4/14) Überblick über generierte HTML-Seite In sinnvolle Ids/Namen vergeben JSF: Ids eindeutig Zugriff auch ohne Ids machbar ( drittes Imput-Element ) 437

220 Einblick in Nutzungsmöglichkeiten public void testbeispielvarianten() throws InterruptedException, IOException { // Seite aufrufen driver.get("http://localhost:8080/secretsafe/"); List<WebElement> liste = driver.findelements(by.tagname("input")); zeigeelemente(liste); input::hidden::main::main::::(0, 0)::true input::submit::main:verfassen::nachricht verfassen::::(8, 129)::true input::submit::main:lesen::nachricht lesen::::(8, 153)::true input::hidden::javax.faces.viewstate:: : ::::(0, 0)::true 438

221 Einblick in Nutzungsmöglichkeiten (6/14) List<WebElement> inp = driver.findelements( By.xpath("//input")); zeigeelemente(inp); input::hidden::main::main::::(0, 0)::true input::submit::main:verfassen::nachricht verfassen::::(8, 129)::true input::submit::main:lesen::nachricht lesen::::(8, 153)::true input::hidden::javax.faces.viewstate:: : ::::(0, 0)::true 439

222 Einblick in Nutzungsmöglichkeiten (7/14) Viele weitere Lokalisierungsmöglichkeiten Method Summary static By classname(java.lang.string classname) static By cssselector(java.lang.string selector) WebElement findelement(searchcontext context) List<WebElement> findelements(searchcontext context) static By id(java.lang.string id) static By linktext(java.lang.string linktext) static By name(java.lang.string name) static By partiallinktext(java.lang.string linktext) static By tagname(java.lang.string name) static By xpath(java.lang.string xpathexpression) 440

223 Einblick in Nutzungsmöglichkeiten (8/14) Steuerungsmöglichkeiten mit submit(), click(), weiteren Eingabemöglichkeiten WebElement element = driver.findelement(by.name("main:verfassen")); System.out.println(element.getTagName() + "::" + element.getattribute("type") + "::" + element.getattribute("name") + "::" + element.getattribute("value")); element.click(); input::submit::main:verfassen::nachricht verfassen 441

224 Einblick in Nutzungsmöglichkeiten (9/14) System.out.println(driver.findElement(By.tagName("body")).getText()); Codewort 1: Codewort 2: geheime Nachricht: wie oft abrufbar: Zur Startseite // Hilfsvariable für folgende Berechnung List<WebElement> labels = driver.findelements(by.tagname("input")); 442

225 Einblick in Nutzungsmöglichkeiten (10/14) es besteht die Möglichkeit JavaScript direkt auszuführen Mächtige Möglichkeiten, z. B. um Skripte zu starten oder Seite zu analysieren hier mit Übergabe und List<WebElement> inputs2 = (List<WebElement>) ((JavascriptExecutor)driver).executeScript( "var labels = arguments[0]; " + "var inputs = []; " + "for (var i=0; i < labels.length; i++){" + " inputs.push(document.getelementbyid(" + " labels[i].getattribute('name'))); " + "} " + "return inputs;", labels); zeigeelemente(inputs2); 443

226 Einblick in Nutzungsmöglichkeiten (11/14) Ausgabe zur letzten Folie form::null::eingabe::null::codewort 1: Codewort 2: geheime Nachricht: wie oft abrufbar: Zur Startseite::(8, 109)::true input::text::eingabe:c1::::::(92, 109)::true input::text::eingabe:c2::::::(92, 131)::true input::text::eingabe:geheim::::::(138, 153)::true input::text::eingabe:ab::0::::(120, 175)::true input::submit::eingabe:verschicken::verschicken::::(8, 197)::true 444

227 Einblick in Nutzungsmöglichkeiten (12/14) Object[] werte = {"input", List<WebElement> inputs3 = (List<WebElement>) ((JavascriptExecutor) driver).executescript( "var tmp = document.getelementsbytagname(arguments[0]); " + "var erg = []; " + "for (var i=0; i<tmp.length; i++){" + " if(tmp[i].type==arguments[1]){" + " erg.push(tmp[i])" + " }" + "}; " + "return erg;", werte); input::text::eingabe:c1::::::(92, 109)::true input::text::eingabe:c2::::::(92, 131)::true input::text::eingabe:geheim::::::(138, 153)::true input::text::eingabe:ab::0::::(120, 175)::true 445

228 Einblick in Nutzungsmöglichkeiten (13/14) // Gibt Seitentitel auf Konsole aus System.out.println("Titel der Seite ist: " + driver.gettitle()); // Bildschirmfoto File screenshot = ((TakesScreenshot)driver).getScreenshotAs(OutputType.FILE); FileUtils.copyFile(screenshot, new File("bild"+new Date().getTime()+".png")); } Assert.assertTrue(driver.getTitle().contains("Pssst")); 446

229 Einblick in Nutzungsmöglichkeiten (14/14) nach mehren Testläufen 447

230 Projektaufbau zentral benötigte Bibliotheken im Selenium-Download (alle) benötigt benötigt 448

231 Weitere Funktionalität Wechsel zwischen Fenstern und zwischen Frames Möglichkeit vorwärts und zurück zu navigieren Nutzung von Cookies (Versuch der) Unterstützung von Drag und Drop Proxy-Nutzung Einstellung von Wartezeiten Warten auf das Erscheinen von HTML-Elementen (wichtig in Richtung AJAX und HTML5) Zusammenspiel mit Selenium IDE zur Testaufzeichnung 449

232 Achtung: Viele Einstiegsfallen generell gute Einarbeitungsmöglichkeit durch gute Dokumentation trotzdem viele kleine Fehlerquellen, die sprozess bremsen können Beispiel: Tests ziehen auf anderen Rechner um wichtiges Detail aus der Doku "The browser zoom level must be set to 100% so that the native mouse events can be set to the correct coordinates." (nicht erster Google- Treffer) teilweise weitere Browser-Einstellungen beachten Fazit: Testrechner nie zu anderen Zwecken nutzen, Konfiguration sichern 450

233 Weitere Steuerungsvarianten Warten, bis Element vorhanden ist (new WebDriverWait(driver, 10)).until( new public WebElement apply(webdriver d) { return d.findelement( By.name("j_idt8:j_idt10")); }}); Steuerungsvariante mit JavaScript WebElement but = driver.findelement(by.name("j_idt8:j_idt10")); ((IJavaScriptExecutor)driver).executeScript("arguments[0].fireEvent('onclick');", but); 451

234 Test des Beispiels (1/6) public class SecretSafeTest { private WebDriver driver; private static String text1; private static String public static void setupclass() { text1 = "" + Math.random(); // nicht ganz QS-sauber text2 = "" + Math.random(); public void setup() { driver = new FirefoxDriver(); public void teardown() { driver.quit(); } 452

235 Test des Beispiels (2/6) private void startseite(){ driver.get("http://localhost:8080/secretsafe"); } private void eingabeseite(){ startseite(); driver.findelement(by.name("main:verfassen")).click(); } private void ausgabeseite(){ startseite(); driver.findelement(by.name("main:lesen")).click(); } private void feldfuellen(string name, String wert){ driver.findelement(by.name(name)).clear(); driver.findelement(by.name(name)).sendkeys(wert); } 453

236 Test des Beispiels (3/6) private void texteingeben(string text1, String text2, String geheim, int versuche){ eingabeseite(); feldfuellen("eingabe:c1",text1); feldfuellen("eingabe:c2",text2); feldfuellen("eingabe:geheim",geheim); feldfuellen("eingabe:ab",""+versuche); driver.findelement(by.name("eingabe:verschicken")).click(); Assert.assertTrue(driver.findElement(By.tagName("body")).getText().contains("Eintrag erfolgreich")); } private void texteingeben(string geheim, int versuche){ texteingeben(text1, text2, geheim, versuche); } 454

237 Test des Beispiels (4/6) private void texterfolgreichsuchen(string text1, String text2, String geheim){ ausgabeseite(); feldfuellen("abfrage:c1",text1); feldfuellen("abfrage:c2",text2); driver.findelement(by.name("abfrage:abfragen")).click(); Assert.assertTrue(driver.findElement(By.tagName("body")).getText().contains(geheim)); } private void texterfolglossuchen(string text1, String text2){ ausgabeseite(); feldfuellen("abfrage:c1",text1); feldfuellen("abfrage:c2",text2); driver.findelement(by.name("abfrage:abfragen")).click(); Assert.assertTrue(driver.findElement(By.tagName("body")).getText().contains("Treffen um 730 in KN2")); } 455

238 Test des Beispiels (5/6) private void texterfolgreichsuchen(string geheim){ texterfolgreichsuchen(text1, text2, geheim); } private void texterfolglossuchen(){ texterfolglossuchen(text1, text2); public void testerfolglos(){ texterfolglossuchen(); public void testeintragenundlesen(){ texteingeben("texttext", 3); texterfolgreichsuchen("texttext"); texterfolgreichsuchen("texttext"); texterfolgreichsuchen("texttext"); texterfolglossuchen(); } 456

239 Test des Beispiels public void testlinklesen(){ ausgabeseite(); driver.findelement(by.linktext("zur Startseite")).click(); Assert.assertTrue(driver.findElement(By.tagName("body")).getText().contains("Was wollen Sie machen?")); public void testlinkschreiben(){ eingabeseite(); driver.findelement(by.linktext("zur Startseite")).click(); Assert.assertTrue(driver.findElement(By.tagName("body")).getText().contains("Was wollen Sie machen?")); } } // weitere Tests sinnvoll 457

240 Testarchitektur Tests müssen für Änderbarkeit konzipiert werden häufig: viele Tests für eine konkrete Version geschrieben, nach leichten Änderungen der zu testenden Software werden Tests als unwartbar weggelegt Problem: ähnlich wie Software-Architektur wird Test- Architektur benötigt ein Ansatz: jeweils eigene Steuerungsklasse für eine Web- Seite, Tests arbeiten nur auf diesem Abstraktionslevel kleine Änderungen führen zu kleinen Änderungen in der Steuerungsklasse und keinen Änderungen bei deren Nutzern durch Abstraktion muss nicht jeder Tester Selenium können -> Tests müssen von qualifizierten Software-Entwicklern geschrieben werden 458

241 Design-Tests Browser stellen identische Inhalte leicht verändert da technisch überflüssig, aber wichtig für den Zeitgeist: modische Design-Anpassungen Für IT-Profi: Sisyphos-Arbeit; Test mit unterschiedlichen Browsern Direkte Hilfsmittel: Lunascape: ein Browser, bei dem man zwischen drei Maschinen umschalten kann IE (Trident)+Firefox (Gecko)+Chrome, Safari (Webkit) Windows: USB-portable Browser ohne Installationsnotwendigkeit (verändern keine Einstellungen): Firefox, Chrome, Opera, evtl. auch Capture & Replay mit Selenium zum inhaltlichen Test 459

242 4.12 JSF-Erweiterungen graphische Möglichkeiten in JSF recht schlicht (wesentlich besser als gezeigt!), Erweiterungsbibliotheken sinnvoll wesentliche frei nutzbare Komponentenframeworks: RichFaces: Primefaces: alternative JSF-Implementierung (Standard: Mojarra): Apache MyFaces: kritisch: Frameworks nur teilweise kompatibel, gilt auch für Framework mit Implementierung kritisch: in Details teilweise deutliche Darstellungsunterschiede in verschiedenen Browsern Hinweis: hier nur Ideen und notwendige Konfiguration NetBeans bietet Nachlademöglichkeit; hier nicht genutzt um einfacher IDE wechseln zu können 460

243 RichFaces Ideen erweiterte graphische Komponenten eigene Integration von Ajax (ohne es nutzen zu müssen, es aber zu können) RichFaces integriert Frameworks und Bibliotheken Prototype [http://prototypejs.org] jquery [http://jquery.com] Script.aculo.us [http://script.aculo.us] benötigte einige weitere externe Bibliotheken einleitender Artikel: developerworks/java/library/j-richfaces/index.html Leider Version 4 und Version 3.3 nicht vollständig kompatibel (z. B. event="change" statt event="onchanged") 461

244 Mini-Beispiel: Kalender Projektstruktur (1/6) Deployment Descriptor web.xml wird geändert aktuell: US/html/chap-Developer_Guide-Getting_started_with_RichFaces.html Externe benötigte Bibliotheken Realisierung der RichFaces- Komponenten aud framework- und ui-ordner Enthält u. a. JSF (Mojarra) 462

245 Mini-Beispiel: Kalender web.xml (optional!) (2/6) <context-param> <param-name>org.richfaces.skin</param-name> <param-value>bluesky</param-value> </context-param> <context-param> <param-name>org.richfaces.control_skinning</param-name> <param-value>enable</param-value> </context-param> <listener> <listener-class> com.sun.faces.config.configurelistener </listener-class> </listener> 463

246 Mini-Beispiel: Kalender übliche Bean (3/6) public class Modul implements Serializable { private Date start=new Date(); public Modul(){} public Date getstart() { System.out.println("getstart "+start+".."); return start; } public void setstart(date start) { System.out.println("setstart "+start); this.start = start; } public String show(){ System.out.println("Datum: "+ start); return ""; // unsauber, bleibt auf Seite } 464

247 Mini-Beispiel: Kalender index.xhtml 1 (4/6) <?xml version='1.0' encoding='utf-8'?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:a4j="http://richfaces.org/a4j" xmlns:rich="http://richfaces.org/rich"> <h:head> <title>datum auswählen</title> </h:head> 465

248 Mini-Beispiel: Kalender index.xhtml 2 (5/6) <h:body> <h:form> <rich:calendar id="cal" value="#{modul.start}" popup="false" datepattern="dd.mm.yyyy"> <a4j:ajax event="change" render="o"/> </rich:calendar> <br/> <h:commandbutton action="#{modul.show}" value="übernehmen"/> <br/> <h:outputlabel value="ausgewählt: "/> <h:outputtext id="o" value="#{modul.start}" /><br/> </h:form> </h:body> </html> 466

249 Mini-Beispiel: Kalender - Ablauf (6/6) 467

250 Nutzung von PrimeFaces unterstützt JSF 2, recht junges Projekt ab November 2008 Dokumentation war mal kostenpflichtig Installationsergänzung in web.xml: <servlet-mapping> <servlet-name>faces Servlet</servlet-name> <url-pattern>/faces/*</url-pattern> </servlet-mapping> <servlet> <servlet-name>resource Servlet</servlet-name> <servlet-class> org.primefaces.resource.resourceservlet </servlet-class> </servlet> <servlet-mapping> <servlet-name>resource Servlet</servlet-name> <url-pattern>/primefaces_resource/*</url-pattern> </servlet-mapping> 468

251 Beispiel: Editorspielerei (1/4) - public class Text implements Serializable { private String inhalt; public String getinhalt() { return inhalt; } } public void setinhalt(string inhalt) { this.inhalt = inhalt; } 469

252 Beispiel: Editorspielerei (2/4) - index.xhtml <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:p="http://primefaces.org/ui"> <h:head> <title>editor</title> </h:head> <h:body> <h:form > <p:editor id="ed" width="600px" height="120px" value="#{text.inhalt}" widgetvar="editor"/> <p:commandbutton update="o1,o2" async="true" value="p Uebernehmen" onclick="editor.savehtml();"/><br/> <h:commandbutton value="h Uebernehmen"/><br/> <h:outputtext id="o1" escape="true" value="inhalt: #{text.inhalt}"/><br/> <h:outputtext id="o2" escape="false" value="inhalt: #{text.inhalt}"/> </h:form> </h:body> </html> 470

253 Beispiel: Editorspielerei (3/4) - h: (Seite lädt neu) 471

254 Beispiel: Editorspielerei (4/4) - p: (Aktualisierung) 472

255 Anmerkungen zum Beispiel Normalerweise unterstützt p:commandbutton Ajax direkt (nur bei p:editor Problem, deshalb Workaround mit widgetvar) <h:head> immer benötigt Generell: Genaue Analyse der oft sehr vielen Attribute einer Komponente notwendig Mischung von h: und p: oft (nicht immer) möglich Man muss mit Eigenarten der Komponenten leben (bei Großprojekten und Auswahlentscheidungen schwierig) detaillierte Dokumentation als PDF-Download 473

256 Versionsänderung - Beispiel Versionswechsel zu führt zu anderer Darstellung Ungleichheit p: und h: korrigiert andere Attribute statt height="120px" nun height="120" 474

5. JavaServer Faces(JSF)

5. JavaServer Faces(JSF) 5. JavaServer Faces(JSF) Grundlagen Nutzung von JSF-Annotationen Validierung von Eingaben Ausgabe von Fehlermeldungen Auswahl darzustellender Elemente typische elementare Software-Architektur JSF + JPA

Mehr

5. JavaServer Faces (JSF) / JEE

5. JavaServer Faces (JSF) / JEE 5. JavaServer Faces (JSF) / JEE 5.1 Grundlagen 5.2 Einführendes nulltes Beispiel 5.3 Validierung 5.4 Einschub: Contexts and Dependency-Injection 5.5 JSF mit JPA und JNDI 5.6 Funktionale Erweiterung 5.7

Mehr

Ansatz 1: Alle kennen Entitäten-Modell (1/2) Erinnerung: Eine Komponentenarchitektur-Variante. Ansatz 1: Alle kennen Entitäten-Modell (2/2)

Ansatz 1: Alle kennen Entitäten-Modell (1/2) Erinnerung: Eine Komponentenarchitektur-Variante. Ansatz 1: Alle kennen Entitäten-Modell (2/2) Erinnerung: Eine Komponentenarchitektur-Variante Datenbank als zentrale Kommunikationsplattform Ansatz 1: alle Komponenten kennen Entitäten-Modell Ansatz 2: Datenzugriffsschicht kapselt Datenbank Ansatz

Mehr

Programmierung von Client/Server- Anwendungen

Programmierung von Client/Server- Anwendungen Programmierung von Client/Server- Anwendungen Komponenten des Web-Containers (Java EE) SoSe2015 Prof. Dr. Andreas Schmietendorf 1 Übersicht zur Vorlesung Entwicklung der Java Enterprise Edition Servlets,

Mehr

4. Servlets Ein kleiner Einstieg. Kurze Java Historie. Erinnerung: Internet Anwendungen. Konzept eines Seitenaufrufs

4. Servlets Ein kleiner Einstieg. Kurze Java Historie. Erinnerung: Internet Anwendungen. Konzept eines Seitenaufrufs 4. s Ein kleiner Einstieg Erinnerung: HTTP und HTML Idee von Web n und Containern Erstellung einfacher s (zunächst software technisch übelst unstrukturiert) Literatur: B. Basham, K. Sierra, B. Bates, Head

Mehr

5. JavaServer Faces (JSF)

5. JavaServer Faces (JSF) 5. JavaServer Faces (JSF) 5.1 Grundlagen 5.2 Einführendes nulltes Beispiel 5.3 Validierung 5.4 JSF mit JPA und JNDI 5.5 Kompakt: EJB-SessionBeansund CDI 5.6 Funktionale Erweiterung 5.7 Sicherheit 5.8 Weitere

Mehr

JBoss Seam. Ein JEE 5 Webframework. Jörg Wüthrich Infopoint, 4. Februar 2009

JBoss Seam. Ein JEE 5 Webframework. Jörg Wüthrich Infopoint, 4. Februar 2009 JBoss Seam Ein JEE 5 Webframework Jörg Wüthrich Infopoint, 4. Februar 2009 Inhalt Einführung Warum Seam? Zentrale Konzepte Demo Validierung Abschliessende Gedanken 04.02.2009 Infopoint - JBoss Seam - Jörg

Mehr

Sicherheit. letzten beiden Punkte typischerweise durch Verschlüsselung realisiert. Komponentenbasierte Software Entwicklung. Prof. Dr.

Sicherheit. letzten beiden Punkte typischerweise durch Verschlüsselung realisiert. Komponentenbasierte Software Entwicklung. Prof. Dr. Sicherheit Vier Aufgaben Authentifizierung: Nutzer erkennen; klassisch über Name und Passwort Autorisierung: Nutzer darf nur bestimmte Aktionen durchführen, klassisch über Rechte Rollen System Vertraulichkeit:

Mehr

Java - Webapplikationen

Java - Webapplikationen Java - Webapplikationen Bestandteile (HTTP,, JSP) Aufbau (Model View Controller) Datenverwaltung (Java Beans, Sessions) Entwicklung (Projektstruktur, Sysdeoplugin für Eclipse) 17. Januar 2006 Jan Hatje

Mehr

Fehleingaben im nullten Beispiel (2/2) 5.3 Validierung/ Fehleingaben im nullten Beispiel (1/2) Ausgaben beim Drücken von Abschicken

Fehleingaben im nullten Beispiel (2/2) 5.3 Validierung/ Fehleingaben im nullten Beispiel (1/2) Ausgaben beim Drücken von Abschicken 5.3 Validierung/ Fehleingaben im nullten Beispiel (1/2) Eingabe: Fehler wird automatisch unter der bleibender Seite ausgegeben j_idt7 ist interner Name, mname ist unsere id des Eingabefeldes Fehleingaben

Mehr

Erste Schritte mit JavaServer Faces und MyEclipse. Allgemeines. Erstellen eines JavaServer Faces Projektes

Erste Schritte mit JavaServer Faces und MyEclipse. Allgemeines. Erstellen eines JavaServer Faces Projektes Erste Schritte mit JavaServer Faces und MyEclipse Dieses Tutorial soll den Einstieg in das noch recht neue Framework, JavaServer Faces (JSF), erleichtern. Es wird Schritt für Schritt eine Beispiel-Anwendung

Mehr

Java EE 6 Ein Überblick

Java EE 6 Ein Überblick Java EE 6 Ein Überblick Bernd Müller Fakultät Informatik Ostfalia Hochschule Braunschweig/Wolfenbüttel GI-Regionalgruppe Braunschweig, 16.2.2012 Bernd Müller, Fakultät Informatik, Ostfalia, 16.2.2012 1/31

Mehr

Erfahrungen und Erkenntnisse. Klaus Richarz, HBT GmbH

Erfahrungen und Erkenntnisse. Klaus Richarz, HBT GmbH Erfahrungen und Erkenntnisse Klaus Richarz, HBT GmbH Java Enterprise Edition 5.0 JBoss Seam Konsequenzen für Realisierung Qualitätssicherung Build & Deployment Fazit & Empfehlungen JBoss Seam in Projekten,

Mehr

Beuth Hochschule für Technik Berlin, FB VI Informatik und Medien Software Engineering (SE II), 2. Kapitel: Wir bauen uns eine Web-Applikation.

Beuth Hochschule für Technik Berlin, FB VI Informatik und Medien Software Engineering (SE II), 2. Kapitel: Wir bauen uns eine Web-Applikation. Kapitel WIR BAUEN UNS EINE WEB-APPLIKATION (DRITTER TEIL) 2.10 Eine Benutzungsoberfläche mit JSF (Dritte Fingerübung) Technische Voraussetzungen 2.11 Die generelle Struktur von JSF Navigation zwischen

Mehr

EJB Beispiel. JEE Vorlesung 10. Ralf Gitzel ralf_gitzel@hotmail.de

EJB Beispiel. JEE Vorlesung 10. Ralf Gitzel ralf_gitzel@hotmail.de EJB Beispiel JEE Vorlesung 10 Ralf Gitzel ralf_gitzel@hotmail.de 1 Stundenkonzept Gemeinsame Übung Stoff der letzten Stunde wird gemeinsam in einem Beispiel umgesetzt Details werden nochmals erklärt bzw.

Mehr

Web 2.0 Software-Architekturen

Web 2.0 Software-Architekturen Web 2.0 Software-Architekturen Servlets als Controller einer MVC Web Architektur Prof. Dr. Nikolaus Wulff HTTP und HTML Das HyperText TransferProtokoll (HTTP) beschreibt eine einfache verbindungslose Kommunikation,

Mehr

JSP JSTL. JEE Vorlesung Teil 6. Ralf Gitzel ralf_gitzel@hotmail.de

JSP JSTL. JEE Vorlesung Teil 6. Ralf Gitzel ralf_gitzel@hotmail.de JSP JSTL JEE Vorlesung Teil 6 Ralf Gitzel ralf_gitzel@hotmail.de 1 Übersicht Ralf Gitzel ralf_gitzel@hotmail.de 2 Übersicht Wiederholung / Vertiefung JSTL Grundlagen JSTL Basisbefehle Templates über JSTL

Mehr

2. Bean Validation. Java Bean

2. Bean Validation. Java Bean 2. Bean Validation Java Bean Annotationen zur Validierung von Java Beans Auswertung von Bean Annotationen Gruppierung von Bean Annotationen Erstellung eigener Bean Annotationen 80 Java Bean Ist die Spezifikation

Mehr

Agenda. Einleitung. Einbinden von JSF AJAX Beispiele Komponenten Entwicklung PrimeFaces Praktikum. Was ist JSF Aufbau und Techniken HTML vs.

Agenda. Einleitung. Einbinden von JSF AJAX Beispiele Komponenten Entwicklung PrimeFaces Praktikum. Was ist JSF Aufbau und Techniken HTML vs. JavaServer Faces E-Commerce (WS 2011/12) Fachhochschule Münster FB02 Elektrotechnik und Informatik Referenten: Matthias Wellmeyer, Sven Wermers, Malte Wesker Agenda Einleitung Was ist JSF Aufbau und Techniken

Mehr

Faclets. Eine alternative View Technologie um JSF Applikationen OHNE JSP zu entwickeln Wird unter java.net gehostet Open Source, CDDL Lizenz

Faclets. Eine alternative View Technologie um JSF Applikationen OHNE JSP zu entwickeln Wird unter java.net gehostet Open Source, CDDL Lizenz Facelets Faclets Eine alternative View Technologie um JSF Applikationen OHNE JSP zu entwickeln Wird unter java.net gehostet Open Source, CDDL Lizenz (COMMON DEVELOPMENT AND DISTRIBUTION LICENSE) Von Jacob

Mehr

Programmierung von Java- Webanwendungen. paluno

Programmierung von Java- Webanwendungen. paluno Programmierung von Java- Webanwendungen Gliederung 1 Vorstellung und Einführung 2 Basiswissen Web 3 XML und JSF- Einführung 4 JSF- Komponenten und RichFaces 5 Wiederholung der ersten Woche 6 JSF- Konzepte

Mehr

Entwicklung von Web-Anwendungen auf JAVA EE Basis

Entwicklung von Web-Anwendungen auf JAVA EE Basis Entwicklung von Web-Anwendungen auf JAVA EE Basis Java Enterprise Edition - Überblick Prof. Dr. Bernhard Schiefer Inhalt der Veranstaltung Überblick Java EE JDBC, JPA, JNDI Servlets, Java Server Pages

Mehr

Session Beans & Servlet Integration. Ralf Gitzel ralf_gitzel@hotmail.de

Session Beans & Servlet Integration. Ralf Gitzel ralf_gitzel@hotmail.de s & Servlet Integration Ralf Gitzel ralf_gitzel@hotmail.de 1 Themenübersicht Ralf Gitzel ralf_gitzel@hotmail.de 2 Übersicht Motivation Das Interface Stateful und Stateless s Programmierung einer Stateful

Mehr

JSP Grundlagen. JEE Vorlesung Teil 5. Ralf Gitzel ralf_gitzel@hotmail.de

JSP Grundlagen. JEE Vorlesung Teil 5. Ralf Gitzel ralf_gitzel@hotmail.de JSP Grundlagen JEE Vorlesung Teil 5 Ralf Gitzel ralf_gitzel@hotmail.de 1 Übersicht Ralf Gitzel ralf_gitzel@hotmail.de 2 Übersicht JSP Konzept Model-View-Controller mit JSPs JSP Expression Language EL Literale

Mehr

Der IBM Websphere Portalserver

Der IBM Websphere Portalserver Der IBM Websphere Portalserver Ergebnisse aus dem Universitäts-Praxis-Projekt 2001/2002 Vortrag von Il-Hyun Kim und Horst Rechner am 19. Juli 2002 Weiterer Teilnehmer am UPP: Clemens Oertel Betreuer: Dipl.-Phys.

Mehr

JSF (JavaServer Faces) Erstellen einer Webseite

JSF (JavaServer Faces) Erstellen einer Webseite Universität Bayreuth Lehrstuhl für Angewandte Informatik IV Datenbanken und Informationssysteme Prof. Dr.-Ing. Jablonski JSF (JavaServer Faces) Erstellen einer Webseite Dipl. Inf. Manuel Götz Dipl. Inf.

Mehr

Erstellung eines Frameworks für Shop Systeme im Internet auf Basis von Java

Erstellung eines Frameworks für Shop Systeme im Internet auf Basis von Java Erstellung eines Frameworks für Shop Systeme im Internet auf Basis von Java Präsentation zur Diplomarbeit von Übersicht Java 2 Enterprise Edition Java Servlets JavaServer Pages Enterprise JavaBeans Framework

Mehr

FH LU JEE Vorlesung SS 2010. Ralf Gitzel ralf_gitzel@hotmail.de

FH LU JEE Vorlesung SS 2010. Ralf Gitzel ralf_gitzel@hotmail.de FH LU JEE Vorlesung SS 2010 Ralf Gitzel ralf_gitzel@hotmail.de 1 Einführung + Organisatorisches Ralf Gitzel ralf_gitzel@hotmail.de 2 Dozent Dr. Ralf Gitzel Promotion an der Universität Mannheim in Wirtschaftsinformatik

Mehr

Enterprise Java Beans Einführung

Enterprise Java Beans Einführung Enterprise Java Beans Einführung Vorlesung 8 Ralf Gitzel ralf_gitzel@hotmail.de 1 Themenübersicht Ralf Gitzel ralf_gitzel@hotmail.de 2 Übersicht EJBs im JEE Umfeld Verschiedene Typen von EJBs Von der Javaklasse

Mehr

Schritt 4: Hallo Enterprise Bean

Schritt 4: Hallo Enterprise Bean Prof. Dr. Th. Letschert FB MNI JEE Schritt 4: Hallo Enterprise Bean Einstieg: EJBs erzeugen und nutzen Meine erstes EJB Projekt Enterprise Beans sind eine Backend Technologie, die mit unterschiedlichen

Mehr

Web-Anwendungen mit Arquillian testen

Web-Anwendungen mit Arquillian testen Michael Kotten open knowledge @michaelkotten @_openknowledge Wozu denn testen? Ich mach doch keine Fehler! Wozu denn testen? > Notwendig bei komplexen Systemen > Sicherung von > Qualität > Funktionalität

Mehr

5.9 JSF-Lebenszyklus. StateHolder

5.9 JSF-Lebenszyklus. StateHolder 5.9 JSF-Lebenszyklus JSF-Klassen: typischer GUI-Aufbau mit Events Hierarchische Baumstruktur der Komponenten, z. B. Intern: Wurzel des Komponentenbaums, Container Formular, benötigt zum Daten

Mehr

Softwareentwicklung mit Enterprise JAVA Beans

Softwareentwicklung mit Enterprise JAVA Beans Softwareentwicklung mit Enterprise JAVA Beans Java Enterprise Edition - Überblick Was ist J2EE Java EE? Zunächst mal: Eine Menge von Spezifikationen und Regeln. April 1997: SUN initiiert die Entwicklung

Mehr

JSP und Servlet Programmierung

JSP und Servlet Programmierung Seminarunterlage Version: 5.02 Copyright Version 5.02 vom 1. März 2013 Dieses Dokument wird durch die veröffentlicht. Copyright. Alle Rechte vorbehalten. Alle Produkt- und Dienstleistungs-Bezeichnungen

Mehr

Anwendung eines Enterprise Java Beans

Anwendung eines Enterprise Java Beans Anwendung eines Enterprise Java Beans EJB Server EJB Container Remote Interface Home Interface EJB Object Der EJB Container kümmert sich um die Kommunikation des Beans mit anderen Komponenten, wobei er

Mehr

Java Server Pages 2 und Benutzerdefinierte Tags. Strahil Yordanov

Java Server Pages 2 und Benutzerdefinierte Tags. Strahil Yordanov Java Server Pages 2 und Benutzerdefinierte Tags Strahil Yordanov Überblick Einleitung JSP im Kontext von J2EE JSP2 Benutzerdefinierte Tags Zusammenfassung Einleitung Java Server Pages ist eine Technik

Mehr

Fortgeschrittene Servlet- Techniken. Ralf Gitzel ralf_gitzel@hotmail.de

Fortgeschrittene Servlet- Techniken. Ralf Gitzel ralf_gitzel@hotmail.de Fortgeschrittene Servlet- Techniken Ralf Gitzel ralf_gitzel@hotmail.de 1 Themenübersicht Ralf Gitzel ralf_gitzel@hotmail.de 2 Übersicht Servlet Initialisierung Attribute und Gültigkeitsbereiche Sessions

Mehr

Inhaltsverzeichnis. Zusammenfassung Wydler

Inhaltsverzeichnis. Zusammenfassung Wydler Inhaltsverzeichnis 1 Multitier Anwendungen... 2 2 J2EE Komponenten... 2 2.1 J2EE Design Patterns for Performance... 2 2.1.1 Design Patterns... 2 2.1.2 Session Façade... 2 2.1.3 Data Transfer Object (Value

Mehr

Inhaltsverzeichnis. Enterprise Java im Überblick. Technologien der Java2 Enterprise Edition

Inhaltsverzeichnis. Enterprise Java im Überblick. Technologien der Java2 Enterprise Edition Inhaltsverzeichnis Vorwort 13 I Enterprise Java im Überblick 1 Bedeutung von Enterprise Java und IBM WebSphere 21 1.1 Enterprise Java 23 1.1.1 Anforderungen 23 1.1.2 E-Business 30 1.1.3 Java 36 1.2 IBM

Mehr

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI

Drei-Schichten-Architektur. Informatik B - Objektorientierte Programmierung in Java. Vorlesung 16: 3-Schichten-Architektur 1 Fachkonzept - GUI Universität Osnabrück Drei-Schichten-Architektur 3 - Objektorientierte Programmierung in Java Vorlesung 6: 3-Schichten-Architektur Fachkonzept - GUI SS 2005 Prof. Dr. F.M. Thiesing, FH Dortmund Ein großer

Mehr

JSF 2.x Reality Check. Was geht heute schon? Was vermissen wir? Was kommt noch?

JSF 2.x Reality Check. Was geht heute schon? Was vermissen wir? Was kommt noch? JSF 2.x Reality Check Was geht heute schon? Was vermissen wir? Was kommt noch? Agenda Was ist JSF 2.0? Entstehungsgeschichte Neuerungen gegenüber 1.2 Konkrete Verbesserungen Projekt-Setup Quick Prototyping

Mehr

Java Server Pages (JSP)

Java Server Pages (JSP) Überblick über Internet-Technologien Server-Technologien Datenbankkopplung Servlets JSP PHP CGI XML+XSL Dokumentsprachen Client-PGM ruft DB-Server Web-Server ruft Datenbankserver HTML+Javascript HTML+Applets

Mehr

Java Persistence API 2.x. crud + relationships + jp-ql

Java Persistence API 2.x. crud + relationships + jp-ql Java Persistence API 2.x crud + relationships + jp-ql Grundprinzip 10.02.10 2 Problematik Man muss bei der Persistierung immer das Klassenmodell und dessen Umsetzung im Datenmodell (in der DB) berücksichtigen.

Mehr

Dataport IT Bildungs- und Beratungszentrum. HTML- Grundlagen und CSS... 2. XML Programmierung - Grundlagen... 3. PHP Programmierung - Grundlagen...

Dataport IT Bildungs- und Beratungszentrum. HTML- Grundlagen und CSS... 2. XML Programmierung - Grundlagen... 3. PHP Programmierung - Grundlagen... Inhalt HTML- Grundlagen und CSS... 2 XML Programmierung - Grundlagen... 3 PHP Programmierung - Grundlagen... 4 Java - Grundlagen... 5 Java Aufbau... 6 ASP.NET Programmierung - Grundlagen... 7 1 HTML- Grundlagen

Mehr

Design anpassen eine kurze Einführung

Design anpassen eine kurze Einführung Design anpassen eine kurze Einführung Das gesamte Layout von Papoo basiert auf modernen CSS Layouts die vollständig ohne Layout Tabellen funktionieren. Um schnell vorhandene Designs anpassen zu können

Mehr

ORACLE Business Components for Java (BC4J) Marco Grawunder

ORACLE Business Components for Java (BC4J) Marco Grawunder ORACLE Business Components for Java (BC4J) Marco Grawunder Gliederung 2 Probleme von J2EE/EJB J2EE-Pattern Lösungsansatz: BC4J Architektur einer BC4J-Anwendung Komponenten Entity Objects View Objects Application

Mehr

Java 2, Enterprise Edition Einführung und Überblick

Java 2, Enterprise Edition Einführung und Überblick Universität aiserslautern AG Datenbanken und Informationssysteme Seminar Datenbank-Aspekte des E-Commerce Java 2, Enterprise Edition Einführung und Überblick m_husema@informatik.uni-kl.de Vortragsinhalte

Mehr

Bernd Müller. JavaServer Faces 2.0. Ein Arbeitsbuch für die Praxis ISBN: 978-3-446-41992-6. Weitere Informationen oder Bestellungen unter

Bernd Müller. JavaServer Faces 2.0. Ein Arbeitsbuch für die Praxis ISBN: 978-3-446-41992-6. Weitere Informationen oder Bestellungen unter Bernd Müller JavaServer Faces 2.0 Ein Arbeitsbuch für die Praxis ISBN: 978-3-446-41992-6 Weitere Informationen oder Bestellungen unter http://www.hanser.de/978-3-446-41992-6 sowie im Buchhandel. Carl Hanser

Mehr

XPages Good to know. Benjamin Stein & Pierre Hein Stuttgart 7. Mai 2015

XPages Good to know. Benjamin Stein & Pierre Hein Stuttgart 7. Mai 2015 XPages Good to know Benjamin Stein & Pierre Hein Stuttgart 7. Mai 2015 Agenda 1. Einführung Was sind XPages? 2. Allgemeine Tipps Allgemeine Tipps für die Verwendung von XPages 3. Designer Tipps Tipps für

Mehr

Java zur Realisierung von Internetanwendungen

Java zur Realisierung von Internetanwendungen Java zur Realisierung von Internetanwendungen Elementare Web-Programmierung Prof. Dr. Bernhard Schiefer HTTP Web-Browser Web-Browser GET http://www.zw.fh-kl.de/beispiel.htm beispiel

Mehr

Web-Anwendungsentwicklung mit dem Delivery Server

Web-Anwendungsentwicklung mit dem Delivery Server Web-Anwendungsentwicklung mit dem Delivery Server Java-Framework auf Basis der Open API Bernfried Howe, Webertise Consulting GmbH WEBertise Consulting Dipl. Informatiker (Wirtschaftsinformatik) 2001-2010

Mehr

Benutzung eines Login Modules zur Authentifizierung unter JBoss 4.0.5

Benutzung eines Login Modules zur Authentifizierung unter JBoss 4.0.5 Benutzung eines Login Modules zur Authentifizierung unter JBoss 4.0.5 Erstellung der Datenbank Tabellen Als Login Module soll das in der JBoss Installation bereits vorhandene DatabaseServerLoginModule

Mehr

Web-Design mit JSF und AJAX. Java Enterprise Erkner, 6.1.2007 Carsten Mjartan (mjartan@codecentric.de)

Web-Design mit JSF und AJAX. Java Enterprise Erkner, 6.1.2007 Carsten Mjartan (mjartan@codecentric.de) Web-Design mit JSF und AJAX Java Enterprise Erkner, 6.1.2007 Carsten Mjartan (mjartan@codecentric.de) 0 Agenda Ajax als Web 2.0 Technologie Java-Server Faces 1 Java Server Faces Sun-Spezifikation (JSR-127)

Mehr

Web- Applikationen. in Java-Web

Web- Applikationen. in Java-Web Einführung in Java-Web Web- Applikationen Frank Huber Humboldt-Universität zu Berlin Allgemeines Java: Programmierung ist Programmierung nach Konvention Insbesondere bei Web-Applikationen wurde eine API

Mehr

Java Beans Enterprise Java Beans. Eine kurze Einführung in die Welt der Bohnen

Java Beans Enterprise Java Beans. Eine kurze Einführung in die Welt der Bohnen Java Beans Enterprise Java Beans Eine kurze Einführung in die Welt der Bohnen Java Beans Einführung Stefan Sauer Was ist ein Java Bean? Beans sind Komponenten. Einmal schreiben Überall wiederverwerten

Mehr

Fakultät Angewandte Informatik Programmierung verteilter Systeme 28.11.2011. Übungen zur Vorlesung Informatik II, Blatt 6

Fakultät Angewandte Informatik Programmierung verteilter Systeme 28.11.2011. Übungen zur Vorlesung Informatik II, Blatt 6 WS 2011/12 Fakultät Angewandte Informatik Programmierung verteilter Systeme 28.11.2011 Prof. Dr. Bernhard Bauer Übungen zur Vorlesung Informatik II, Blatt 6 Abgabe: Montag, 05.12.2011, 12.00 Uhr, Informatik

Mehr

Sitzungszustand. Vorläufige Version 309 c 2005 Peter Thiemann

Sitzungszustand. Vorläufige Version 309 c 2005 Peter Thiemann Sitzungszustand Gruppierung von Anfragen zu Sitzungen (Sessions) Klasse HttpServletRequest Methode HttpSession getsession (bool create) liefert aktuelle Sitzungsobjekt Zustand lokal zur Anwendung (ServletContext)

Mehr

Bean-Mapping mit MapStruct

Bean-Mapping mit MapStruct Machst Du noch Reflection oder annotierst Du schon? Bean-Mapping mit MapStruct Thomas Much thomas@muchsoft.com www.muchsoft.com 1 20 Jahre Java, 18 Jahre Beans JavaBeans JAXBEntities 2015 2006 2005 2000

Mehr

Modell 2 und JSF. JSP und Modell 1 MVC und Modell 2 Java Web Frameworks und Struts Java Server Faces

Modell 2 und JSF. JSP und Modell 1 MVC und Modell 2 Java Web Frameworks und Struts Java Server Faces Modell 2 und JSF JSP und Modell 1 MVC und Modell 2 Java Web Frameworks und Struts Java Server Faces JSP ein mächtiges Werkzeug! Client JSP Bean Fachlogik JSP Eine JSP empfängt Benutzer-Anfragen, "Requests"

Mehr

Datenbanksysteme SS 2007

Datenbanksysteme SS 2007 Datenbanksysteme SS 2007 Frank Köster (Oliver Vornberger) Institut für Informatik Universität Osnabrück Kapitel 9d: Datenbankapplikationen Architektur einer Web-Applikation mit Servlets, JSPs und JavaBeans

Mehr

Praktikum Datenbanksysteme. Ho Ngoc Duc IFIS - Universität zu Lübeck 01.06.2005

Praktikum Datenbanksysteme. Ho Ngoc Duc IFIS - Universität zu Lübeck 01.06.2005 Praktikum Datenbanksysteme Ho Ngoc Duc IFIS - Universität zu Lübeck 01.06.2005 Tomcat-Installation $JAVA_HOME (z.b. /home/dbp00/j2sdk1.4.2) $CATALINA_HOME (/home/dbp00/jakarta-tomcat-4) Skripte zum Start/Stop:

Mehr

Einleitung JavaServer Pages Erweiterungsmechanismen Beispiel Fazit. JavaServer Pages. Seminar Webprogrammierung WS04/05. Timothy Burk. 6.

Einleitung JavaServer Pages Erweiterungsmechanismen Beispiel Fazit. JavaServer Pages. Seminar Webprogrammierung WS04/05. Timothy Burk. 6. Seminar Webprogrammierung WS04/05 6. Juni 2005 1 Einleitung Die Vorgeschichte Java-Servlets 2 Merkmale Von der JSP zur HTML-Ausgabe Syntax 3 4 5 Die Vorgeschichte Java-Servlets Einleitung Ansätze für dynamische

Mehr

php Hier soll ein Überblick über das Erstellen von php Programmen gegeben werden. Inhaltsverzeichnis 1.Überblick...2 2.Parameterübergabe...

php Hier soll ein Überblick über das Erstellen von php Programmen gegeben werden. Inhaltsverzeichnis 1.Überblick...2 2.Parameterübergabe... php Hier soll ein Überblick über das Erstellen von php Programmen gegeben werden. Inhaltsverzeichnis 1.Überblick...2 2.Parameterübergabe...7 3.Zugriff auf mysql Daten...11 Verteilte Systeme: php.sxw Prof.

Mehr

MVC-II Schematische Aufzeichnung Des MVC (model-2), bei dem zwei Modelle zum Zuge kommen:

MVC-II Schematische Aufzeichnung Des MVC (model-2), bei dem zwei Modelle zum Zuge kommen: MVC im Web-Context bedeutet, dass es einen Controller gibt, welcher verschiedene Views kommandiert. Informationen an die Views kann der Controller per Models übergeben. Die Komplexität und das Multithreading

Mehr

Schlussbewertung FB VI SOFTWAREPROJEKT II WS 09/10 TEAM. Alexander Kalden Dominik Eckelmann Marcel Pierry Julian Heise Besha Taher

Schlussbewertung FB VI SOFTWAREPROJEKT II WS 09/10 TEAM. Alexander Kalden Dominik Eckelmann Marcel Pierry Julian Heise Besha Taher Schlussbewertung FB VI SOFTWAREPROJEKT II WS 09/10 TEAM Alexander Kalden Dominik Eckelmann Marcel Pierry Julian Heise Besha Taher 729631 745097 736477 745011 741297 Inhalt Schlussbewertung... 3 Bewertung

Mehr

Moderne Web- Anwendungen mit

Moderne Web- Anwendungen mit Moderne Web- Anwendungen mit Oliver.Damm@akquinet.de September 2013 Web- Anwendungen mit Vaadin???

Mehr

Applets Belebung von Webseiten. Dipl.-Ing. Wolfgang Beer

Applets Belebung von Webseiten. Dipl.-Ing. Wolfgang Beer Applets Belebung von Webseiten Dipl.-Ing. Wolfgang Beer Was sind Applets? Java Klassen, die spezielle Richtlinien befolgen, um: "in Internet-Browsern lauffähig zu sein" Somit ist, komplexere Funktionalität,

Mehr

Einsatz und Grenzen von Java Server Faces 2.0

Einsatz und Grenzen von Java Server Faces 2.0 Kai Wähner München 09. September 2010 Einsatz und Grenzen von Java Server Faces 2.0 Einordnung von JSF in JEE 9/11/2010 Seite 2 Einordnung von JSF in JEE 9/11/2010 Seite 3 "Überblick" über JSF 9/11/2010

Mehr

Shibboleth IdP-Erweiterungen an der Freien Universität Berlin

Shibboleth IdP-Erweiterungen an der Freien Universität Berlin Steffen Hofmann (Dipl.-Inf.) ZEDAT, Identity and Customer Management (ICM) Shibboleth IdP-Erweiterungen an der Freien Universität Berlin Informative Login-Webseiten, JAAS-Login- Module, Login-Handler,

Mehr

Webanwendungen mit IBM Rational und IBM WebSphere V6

Webanwendungen mit IBM Rational und IBM WebSphere V6 Joachim Gucker, Michael Müller, Dietmar Rager, Stefan Schäffer, Walter Schilder, Veronika Thurner, Dina Winkler 2008 AGI-Information Management Consultants May be used for personal purporses only or by

Mehr

i n g e n i e u r b ü r o f ü r s o f t w a r e t e c h n o l o g i e w w w. v o e l t e r. d e Servlet Debugging

i n g e n i e u r b ü r o f ü r s o f t w a r e t e c h n o l o g i e w w w. v o e l t e r. d e Servlet Debugging Servlet Debugging Markus Völter, voelter@acm.org, www.voelter.de Bei der Arbeit mit Servlets kommt man recht schnell an den Punkt, an dem man Servlets vernünftig testen oder debuggen will. Mit Hilfe des

Mehr

Übungsaufgabe Transaktion als Middleware

Übungsaufgabe Transaktion als Middleware Übungsaufgabe Transaktion als Middleware und Java Persistence API Client/Server Abstraktes Komponentenmodell Entscheidende Punkte Erweiterung der Invoke-Methode Context-Verwaltung Transaktionsbehandlung

Mehr

Übung 1: Object Inspector

Übung 1: Object Inspector Übung 1: Object Inspector Es ist ein System zu entwickeln, mit dem man Objektstrukturen bezüglich ihrer Properties analysieren und dann in einem Tree Viewer (JTree) anzeigen und bearbeiten kann. Properties

Mehr

Verteidigung gegen SQL Injection Attacks

Verteidigung gegen SQL Injection Attacks Verteidigung gegen SQL Injection Attacks Semesterarbeit SS 2003 Daniel Lutz danlutz@watz.ch 1 Inhalt Motivation Demo-Applikation Beispiele von Attacken Massnahmen zur Verteidigung Schlussfolgerungen 2

Mehr

Software Engineering II

Software Engineering II Software Engineering II Codegenerierung für den SmartIO Editor mit der Modeling Workflow Engine Wintersemester 10/111 Fachgebiet Software Engineering Albert Zündorf / Wiederholung Bisher im Laufe des Semesters

Mehr

Jakarta Turbine Ein Open Source Framework fÿr Webanwendungen. KNF Kongre 2001 Henning P. Schmiedehausen

Jakarta Turbine Ein Open Source Framework fÿr Webanwendungen. KNF Kongre 2001 Henning P. Schmiedehausen <henning@apache.org> Jakarta Turbine Ein Open Source Framework fÿr Webanwendungen Henning P. Schmiedehausen Turbine - ein berblick Open Source unter Apache License 100% pure Java, Java 2 (JDK 1.2+) Servlet-basiertes

Mehr

Programmieren II. Wie kommen Daten von einem Webserver? Vorlesung 12. Handout S. 1. Martin Schultheiß. Hochschule Darmstadt Sommersemester 2011

Programmieren II. Wie kommen Daten von einem Webserver? Vorlesung 12. Handout S. 1. Martin Schultheiß. Hochschule Darmstadt Sommersemester 2011 Programmieren II Martin Schultheiß Hochschule Darmstadt Sommersemester 2011 1 / 23 2 / 23 Wie kommen Daten von einem Webserver? In der Praxis existieren verschiedene Wege, wie ein Server einem Client zu

Mehr

Workshop Java Webentwicklung Einführung in Hibernate. Ulrich Stärk

Workshop Java Webentwicklung Einführung in Hibernate. Ulrich Stärk Workshop Java Webentwicklung Einführung in Hibernate Ulrich Stärk Ablauf Montag bis Donnerstag 09:00 Uhr s.t. Beginn, bis ca. 17:00 Uhr 1 Stunde Mittagspause Donnerstag Experiment Aufzeichnung der Programmiertätigkeit

Mehr

ASP: Active Server Pages

ASP: Active Server Pages ASP: Active Server Pages Allgemeines: ASP ist die serverseitige Schnittstelle zu Skripten/Programmen ausgehend vom Microsoft-Internet- Information-Server (z.b. in Windows Server enthalten) Skript- und

Mehr

J2EEKurs. Enterprise JavaBeans Einführung. Peter Thiemann. Sommercampus J2EEKurs, Freiburg, Germany, 10.-14.10.2005. Universität Freiburg, Germany

J2EEKurs. Enterprise JavaBeans Einführung. Peter Thiemann. Sommercampus J2EEKurs, Freiburg, Germany, 10.-14.10.2005. Universität Freiburg, Germany Enterprise JavaBeans Einführung Universität Freiburg, Germany Sommercampus, Freiburg, Germany, 10.-14.10.2005 Inhalt Allgemeines Motivation Rollen Aufbau einer EJB Arten von Beans Enterprise JavaBeans

Mehr

2. Interaktive Web Seiten. action in Formularen. Formular. Superglobale Variablen $ POST, $ GET und $ REQUEST. GET und POST

2. Interaktive Web Seiten. action in Formularen. Formular. Superglobale Variablen $ POST, $ GET und $ REQUEST. GET und POST 2. Interaktive Web Seiten GET und POST Die Übertragungsmethoden GET und POST sind im http Protokoll definiert: POST: gibt an, dass sich weitere Daten im Körper der übertragenen Nachricht befinden: z.b.

Mehr

Praktikum Datenbanksysteme. Ho Ngoc Duc IFIS Universität zu Lübeck 28.05.2003

Praktikum Datenbanksysteme. Ho Ngoc Duc IFIS Universität zu Lübeck 28.05.2003 Praktikum Datenbanksysteme Ho Ngoc Duc IFIS Universität zu Lübeck 28.05.2003 Nullwerte und Primitive Typen Wenn parent==null, was wird in der Datenbank gespeichert? Wenn man aus der DB liest, wie kann

Mehr

Proseminar: Website-Management-Systeme

Proseminar: Website-Management-Systeme Proseminar: Website-Management-Systeme Thema: Web: Apache/Roxen von Oliver Roeschke email: o_roesch@informatik.uni-kl.de Gliederung: 1.) kurze Einleitung 2.) Begriffsklärung 3.) Was ist ein Web? 4.) das

Mehr

Mainframe Internet Integration. Prof. Dr. Martin Bogdan Prof. Dr.-Ing. Wilhelm G. Spruth SS2013. WebSphere Application Server Teil 4

Mainframe Internet Integration. Prof. Dr. Martin Bogdan Prof. Dr.-Ing. Wilhelm G. Spruth SS2013. WebSphere Application Server Teil 4 UNIVERSITÄT LEIPZIG Mainframe Internet Integration Prof. Dr. Martin Bogdan Prof. Dr.-Ing. Wilhelm G. Spruth SS2013 WebSphere Application Server Teil 4 Leistungsverhalten el0100 copyright W. G. Spruth,

Mehr

Anwendungsprotokolle: HTTP, POP, SMTP

Anwendungsprotokolle: HTTP, POP, SMTP Anwendungsprotokolle: HTTP, POP, SMTP TCP? UDP? Socket? eingesetzt, um Webseiten zu übertragen Zustandslos Nutzt TCP Client schickt Anfrage ( HTTP-Request ) an Server, Server schickt daraufhin Antwort

Mehr

WEBAPPLIKATIONEN MIT PHP. Wo gibt es Hilfe? Wie fang ich an?

WEBAPPLIKATIONEN MIT PHP. Wo gibt es Hilfe? Wie fang ich an? WEBAPPLIKATIONEN MIT PHP Wo gibt es Hilfe? Wie fang ich an? Tools Webapplikationen bestehen aus Textdateien Lassen sich in Texteditoren schreiben Alternativen: Eclipse (PDT) Netbeans (Dynamic Languages)

Mehr

Firefox Add-ons. Präsentation in WAP WS09/10 von Christoph ASCHBERGER, Andreas BERTOLIN, Robert MUTTER und Yunzhou XU

Firefox Add-ons. Präsentation in WAP WS09/10 von Christoph ASCHBERGER, Andreas BERTOLIN, Robert MUTTER und Yunzhou XU Firefox Add-ons Präsentation in WAP WS09/10 von Christoph ASCHBERGER, Andreas BERTOLIN, Robert MUTTER und Yunzhou XU Agenda Technisches Überblick XUL JavaScript CSS XPI-Pakete Einreichen bei Mozilla Sicherheitsüberlegungen

Mehr

Contexts and Dependency Injection. W3L AG info@w3l.de

Contexts and Dependency Injection. W3L AG info@w3l.de 1 Contexts and Dependency Injection W3L AG info@w3l.de 2015 2 Inhaltsverzeichnis Teil 1: Motivation Teil 2: Inversion of Control Teil 3: Contexts and Dependency Injection Teil 4: Beispiel zurück 3 Motivation

Mehr

Übung 1 mit C# 6.0 MATTHIAS RONCORONI

Übung 1 mit C# 6.0 MATTHIAS RONCORONI Übung 1 mit C# 6.0 MATTHIAS RONCORONI Inhalt 2 1. Überblick über C# 2. Lösung der Übung 1 3. Code 4. Demo C# allgemein 3 aktuell: C# 6.0 mit.net-framework 4.6: Multiparadigmatisch (Strukturiert, Objektorientiert,

Mehr

Softwareentwicklung mit Enterprise JAVA Beans

Softwareentwicklung mit Enterprise JAVA Beans Softwareentwicklung mit Enterprise JAVA Beans JPA - JAVA Persistence API Problem In JAVA-programmen arbeitet man mit Hauptspeicherobjekten. Nach Beendigung des Programmes sind diese nicht mehr vorhanden.

Mehr

Workshop Java Webentwicklung Tapestry. Ulrich Stärk

Workshop Java Webentwicklung Tapestry. Ulrich Stärk Workshop Java Webentwicklung Tapestry Ulrich Stärk Webanwendungen Antwort im Browser des Benutzers sichtbar Anfrage geht ein Antwort rendern Anfrage an passenden Code weiterleiten 2 Servlets Servlet wird

Mehr

Inhaltsverzeichnis. 1 Ein Einstieg mit Profil 1. 2 Aufsetzen der Entwicklungsumgebung 19

Inhaltsverzeichnis. 1 Ein Einstieg mit Profil 1. 2 Aufsetzen der Entwicklungsumgebung 19 xi 1 Ein Einstieg mit Profil 1 1.1 Java EE 7 der Standard für Enterprise Java.................. 1 1.1.1 Struktur einer Enterprise-Java-Anwendung............. 1 1.1.2 Die Java Enterprise Edition (Java EE)..................

Mehr

Erste Erfahrungen mit NSASJ anhand der OmnivoBase Portierung. September 2013

Erste Erfahrungen mit NSASJ anhand der OmnivoBase Portierung. September 2013 GTUG Java Arbeitskreis Erste Erfahrungen mit NSASJ anhand der OmnivoBase Portierung September 2013 Jürgen Depping CommitWork GmbH Seite 1 Info@CommitWork.de www.commitwork.de Agenda Was ist OmnivoBase?

Mehr

Java Beans (22.02.2001)

Java Beans (22.02.2001) Component Based Software Development Java Beans (22.02.2001) Stefan Jäger Robert Kalcklösch Veranstalter: M. Bittner W. Koch Inhalt Einführung in Java Die Java Beans Einsatz und Entwicklung von Beans Enterprise

Mehr

OWASP Stammtisch München Sep 2014 XSS und andere Sicherheitslücken aus der Perspektive des Programmcodes

OWASP Stammtisch München Sep 2014 XSS und andere Sicherheitslücken aus der Perspektive des Programmcodes OWASP Stammtisch München Sep 2014 XSS und andere Sicherheitslücken aus der Perspektive des Programmcodes 1 XSS: Cross-Site Scripting 1.) Es gelangen Daten in den Web-Browser, die Steuerungsinformationen

Mehr

Benutzerauthentifizierung und Zugriffsschutz mit JAAS

Benutzerauthentifizierung und Zugriffsschutz mit JAAS Benutzerauthentifizierung und Zugriffsschutz mit JAAS Werner Eberling werner.eberling@mathema.de www.mathema.de Übersicht Altbekanntes kurz erwähnt Java Security Des Kaisers neue Kleider JAAS Zu Ihren

Mehr

Struts Shale. Von Bernhard Slominski

Struts Shale. Von Bernhard Slominski Struts Shale Von Bernhard Slominski Struts Shale - Hintergrund Aus der Shale Homepage: It is time to base a web tier framework on top of the new standard API in this space (JavaServer Faces), and eliminate

Mehr

Microsoft.NET & IBM System i - Webanwendungen mit AJAX - I Christian Neißl, 28.12.2010

Microsoft.NET & IBM System i - Webanwendungen mit AJAX - I Christian Neißl, 28.12.2010 Microsoft.NET & IBM System i - Webanwendungen mit AJAX - I Christian Neißl, 28.12.2010 Im Jahr 2006 hat ein cleverer Journalist den Namen AJAX erfunden. Der Begriff beschreibt eine damals bereits bekannte

Mehr

Entwicklung einer Suchmaschine mit dem Internet Information Server

Entwicklung einer Suchmaschine mit dem Internet Information Server Entwicklung einer Suchmaschine mit dem Internet Information Server Überblick: Der Index Server erstellt einen Index für alle Inhalte und Eigenschaften von Dokumenten, die auf dem Internet Information Server

Mehr

Rechnernetze Übung 12

Rechnernetze Übung 12 Rechnernetze Übung 12 Frank Weinhold Professur VSR Fakultät für Informatik TU Chemnitz Juli 2011 Sie kennen sicherlich sogenannte Web-Mailer, also WWW-Oberflächen über die Sie Emails lesen und vielleicht

Mehr