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 ● HTML vs. XHTML ● Einbinden von JSF ● AJAX ● Beispiele ● Komponenten Entwicklung ● PrimeFaces ● Praktikum Was ist JSF? ● ● ● JavaServer Faces Framework zur Entwicklung von grafischen Oberflächen in Web-Anwendungen Initial release 2004 ● JSF expert group Sun, Borland, IBM, Macromedia, Oracle... Aufbau und Techniken von JSF? ● ● Rollenkonzept ● Webdesigner ● Applikationsentwickler ● Komponentenentwickler Klare Aufgabentrennung ● Präsentationsschicht ● Geschäftslogik ● Datenhaltung Aufbau und Techniken von JSF? ● Verknüpfung von View und Controller via JSF Expression Language #{Klasse.Ziel} ● Bean-Management ● Beans Speicherung Benutzer- und/oder Anwendungsdaten ● Verwaltung übernimmt JSF ● Globale Bereitstellung Managed Beans (lazy loading) ● Gültigkeitsbereiche über zentrale Konfigurationsdatei konfigurierbar Aufbau und Techniken von JSF? JSF durchläuft fest definierten Lebenszyklus pro Aufruf Quelle: http://edndoc.esri.com HTML vs. XHTML HTML XHTML <html xmlns="http://www.w3.org/1999/xhtml" xml:lang="de"> <head> <title>Beispiel</title> <body> <head> <title>Beispiel</title> </head> <body> <h1>Beispielseite</h1> <h1>Beispielseite</h1> <p>Ein Absatz <p>Ein Absatz</p> <ol> <ol> <li>Listelement 1 <li>Listelement 2 </ol> <p><img src=bild.gif alt="Bildmotiv"> </body> <li>Listelement</li> <li>Listelement</li> </ol> <p> <img src="bild.gif" alt="Bildmotiv" /> </p> </body> </html> Einbinden JSF ● Maven Dependencies ● Java Server Faces API – ● Java Server Faces Implementation – ● jsf-impl JavaServer Pages Standard Tag Library – ● jsf-api jstl Servlet API – servlet-api Einbinden JSF ● web.xml <web­app> [...] <servlet> <servlet­name>FacesServlet</servlet­name> <servlet­class>javax.faces.webapp.FacesServlet</servlet­class> <load­on­startup>1</load­on­startup> </servlet> <servlet­mapping> <servlet­name>FacesServlet</servlet­name> <url­pattern>*.xhtml</url­pattern> </servlet­mapping> <listener> <listener­class>com.sun.faces.config.ConfigureListener</listener­class> </listener> </web­app> Einbinden PrimeFaces ● Maven Dependencies ● ● Primefaces web.xml <web­app> [...] <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> </web­app> Einbinden JSF und PrimeFaces ● In den xhtml- Seiten <!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://java.sun.com/jsf/facelets" xmlns:f="http://java.sun.com/jsf/core" xmlns:h="http://java.sun.com/jsf/html" xmlns:p="http://primefaces.prime.com.tr/ui“> <h:head> [...] </h:head> <body> <h2> <h:outputText value="#{DummyBean.helloWorld}"/> </h2> </body> </html> AJAX ● Asynchronous JavaScript and XML ● HTML (oder XHTML) ● Document Object Model ● JavaScript ● XMLHttpRequest-Objekt AJAX ● Ohne AJAX Webbrowser HTTP- Request Benutzeroberfläche HTML Seite Server AJAX Mit AJAX Webbrowser DOM Operation Benutzeroberfläche JavaScript Aufruf ● HTTP- Request Server AJAX-Engine XML oder JSON AJAX ● AJAX Engine zu Fuß httpObject = (window.XMLHttpRequest)?new XMLHttpRequest():new ActiveXObject("MICROSOFT.XMLHTTP"); if(httpObject){ httpObject.open("post","ajax.php",true); var encoded_content_id = encodeURIComponent(content_id); var param = "param1=paramValue1&param2=paramValue2" ; httpObject.setRequestHeader("Content-type","application/x-www-form-urlencoded"); httpObject.setRequestHeader("Contentlength",param.length); httpObject.setRequestHeader("Connection","close"); httpObject.onreadystatechange = function(){ if(httpObject.readyState == 4 && httpObject.status == 200){ var txtNodes = httpObject.responseXML.documentElement.getElementsByTagName("pagescript")[0] → .childNodes; var str = ""; for (var i=0; i <txtNodes.length; i++){ str += txtNodes[i].data; } alert(str); } } httpObject.send(param); Beispiele JSF Beispiele JSF Komponentenentwicklung in JSF ● ● Es gibt zwei Arten von Komponenten ● Kompositkomponenten ● „normale“ Komponenten Kompositkomponente ● ● ● ● Sehr einfach Erstellen einer .xhtml Datei und in den Ressourcenpfad ablegen Namensraum aus Präfix http://java.sun.com/jsf/composite/ gefolgt vom Bibliotheknamen Tag erhält den Namen von der Deklaration Komponentenentwicklung in JSF ● Aufbau der .xhtml Datei ● ● Die mit cc:interface und cc:implementation umfassten Bereiche erforderlich cc:interface – – ● Definiert die Schnittstelle nach aussen und umfasst alle Merkmale die für den Benutzer relevant sind Verschiedene Tags möglich (cc:attribute, cc:valueHolder, ...) cc:implementation – – – Enthält die „implementierung“, JSF-Tags, HTML-Elemente,... Es ist möglich auf die Attribute, Facets, ... der Kompositkomponente zuzugreifen (cc.attrs.attributname, …) Verschiedene Tags möglich (cc:insertChildren, cc:renderFacet, ...) Komponentenentwicklung in JSF ● ● Komplexer zu erstellen als eine Kompositkomponente 7 Schritte nötig ● Komponentenfamilie, Komponententyp und Renderertyp definieren – ● Komponentenklasse schreiben – ● „Herzstück“ der Komponentenarchitektur Rendererklasse schreiben – – – ● Komponente von bekannten ableiten (UIOutput, UICommand, …) oder vom Scratch entwickeln? Eigener Renderer? Zuständig für die vernünftige Aufbereitung der Daten. Daten aus dem Request bekommen und in den Response schreiben Wird von abstrakten Klasse javax.faces.render.Render abgeleitet und besitzt 7 Methoden (encodeBegin(), decode(), ... ) Rendern von Ressourcen (Bilder, Skripte, …) geschieht über Annotations Komponentenklasse und Rendererklasse registrieren – Werden per Annotations registriert (@FacesComponent(...), @FacesRenderer(...)) Komponentenentwicklung in JSF ● ● ● ● ● ● Tag-Definition schreiben und in Bibliothek aufnehmen – Existiert bereits eine passende Tag-Bibliothek muss lediglich der Tag-Name, Komponententyp und Rendertyp angegeben werden – Existiert keine muss zu erst eine Tag-Bibliothek erstellt werden (geschieht über Facelets) Tag-Handler-Klasse schreiben – Muss nur in speziellen Fällen erstellt werden , z.B. wenn hinter dem Tag keine Komponente kommt (z.B. c:if) Bibliothek in die Seite einbinden – In .xhtml Datei einfügen Es ist auch möglich beide Komponententypen zu kombinieren Auch anderen Möglichkeiten vorhanden (Renderer austauschen, Komponentenklasse austauschen) Zahlreiche Beispiel, wo diese Technik benutzt wird um eine Komponentenbibliothek zu erstellen z.B. PrimeFaces, MyFaces, RichFaces, ... PrimeFaces ● OpenSource Komponentenbibliotheken ● Sehr leicht einzubinden ● ● ● Kann in 2 unterschiedlichen Kategorien unterteilt werden ● Webbrowser ● Mobile-Endgeräte Enthält weitere Tags und Funktionen (AutoComplete, …) Größten Teils jQuery und YUI (JS-Library von Yahoo) verantwortlich Beispiele PrimeFaces Beispiele PrimeFaces Praktikum ● ● Gegebenes Projekt anpassen (Datenbank u.ä.) Bsp. Such- bzw. Anzeigeoptionen mit JSF erweitern (AutoComplete, AJAX-Funktionen, ...) ● Projekt „verschönern“ ● (Evtl. eigene Komponente entwickeln)