JSF und CSS (1/3) JSF und CSS (2/3) – Ausschnitt aus Anwendung <html> html> <head> head> <meta http http-equiv="Contentequiv="Content-Type" Type" content="text/html; content="text/html; charset=UTFcharset=UTF-8"/> <title>Module</title> title>Module</title> <link rel="stylesheet" rel="stylesheet" type="text/css" type="text/css" href="/JSFCSS/css/stil.css" href="/JSFCSS/css/stil.css" /> </head </head> head> <body <body> body> <f:view <f:view> f:view> <h:form id="f2"> <h:messages styleClass="infoClass" styleClass="infoClass" globalOnly="true"/> globalOnly="true"/> <h:panelGrid rendered="#{!empty module.module}"> module.module}"> <h:dataTable value="#{module.module}" value="#{module.module}" var="m" var="m" styleClass="resultGrid" styleClass="resultGrid" rowClasses="oddRow,evenRow"> rowClasses="oddRow,evenRow"> ... • CSS-Dateien grundsätzlich nutzbar • keine einfache Einstellung einmal für alles, da CSS keine Vererbung bzw. kontextabhängige Nutzung ermöglicht • fast allen JSF-Elementen können Style-Klassen (genauer Stylespezifikationen) und konkrete Styles zugeordnet werden Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 365 JSF und CSS (3/3) - Beispielausgabe Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 366 JSF-Erweiterungen • graphische Möglichkeiten in JSF recht schlicht (wesentlich besser als gezeigt !), Erweiterungsbibliotheken sinnvoll • wesentliche Bibliotheken: – RichFaces: http://www.jboss.org/richfaces – IceFaces: http://www.icefaces.org/main/home/ – Apache MyFaces: http://myfaces.apache.org/ – Apache MyFaces Trinidad (ehemals Oracle ADF-Faces): http://myfaces.apache.org/trinidad/index.html • kritisch: Bibliotheken nur teilweise kompatibel • kritisch: in Details teilweise deutliche Darstellungsunterschiede in verschiedenen Browsern • Erweiterungen teilweise homogenisiert unter JSF 2.0; trotzdem bleiben Ergänzungen wichtig Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 367 Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 368 RichFaces Ideen Partielles Rendering • • erweiterte graphische Komponenten Integration von Ajax (ohne es nutzen zu müssen, es aber zu können) • RichFaces integriert Frameworks und Bibliotheken – Prototype 1.6.0.3 [http://prototypejs.org] – jQuery 1.3.1 [http://jquery.com] – Script.aculo.us 1.8.1 [http://script.aculo.us] benötigte Bibliotheken mit Versionsnummern beachten: commons-beanutils-1.7.0.jar, commons-collections-3.2.jar, commonsdigester-1.8.jar, commons-logging-1.0.4.jar, jhighlight-1.0.jar einleitender Artikel: http://www.ibm.com/ developerworks/java/library/j-richfaces/index.html • • Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 369 Probleme bei partiellen Aktualisierungen Entwicklung Stephan Kleuker <a4j:commandButton value="update" value="update" reRender="infoBlock"/> reRender="infoBlock"/> ... <h:panelGrid id="infoBlock"> id="infoBlock"> ... </h:panelGrid </h:panelGrid> h:panelGrid> • Einschalten von partiellem Rendering über Attribut switchType="ajax" Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 370 Beispiel: Viel aufwändige Action (1/4) • Erinnerung: Attribut rendered als Boolescher Schalter, ob Komponente gezeigt wird • wenn Komponente aktuell nicht angezeigt und durch partielle Aktualisierung dann sichtbar, ist Platz im DOM-Tree unklar – Ansatz 1: reRender verweist auf eine äußere Komponente ohne rendered – Ansatz 2: kritische Komponente „einpacken“ in <a4j:outputPanel ajaxRendered="true"> • Ansatz 2 verhinderbar durch Attribut limitToList = "true" • generell: immer alle Komponenten angeben, nie später welche ergänzen (ein- und ausblenden ok), id müssen eindeutig sein Komponentenbasierte SoftwareProf. Dr. • Grundidee: nur Teile von Seiten werden neu berechnet • Ansatz nutzt Ajax (Asynchronous JavaScript and XML) ohne dass JavaScript genutzt werden muss • typische Idee: wenn sich eine Komponente ändert, dann sollen sich auch andere Komponenten ändern, deren IDs im Attribut reRender stehen 371 <%@page contentType="text/html" contentType="text/html" pageEncoding="UTF pageEncoding="UTF="UTF-8"%> <%@taglib taglib prefix="f" uri="http:// <%@ uri="http://java.sun.com/jsf/core ="http://java.sun.com/jsf/core"%> java.sun.com/jsf/core"%> <%@taglib <%@taglib prefix="h" uri="http:// uri="http://java.sun.com/jsf/html ="http://java.sun.com/jsf/html"%> java.sun.com/jsf/html"%> <%@taglib <%@taglib uri="http://richfaces.org/a4j" uri="http://richfaces.org/a4j" prefix="a4j"%> <%@taglib <%@taglib uri="http:// uri="http://richfaces.org ="http://richfaces.org/rich" richfaces.org/rich" prefix="rich"%>< prefix="rich"%><h:form> h:form> ... <body> body> <f:view> f:view> <a4j:form> <h:inputText value="#{modul.name}"> value="#{modul.name}"> <a4j:support event="onkeyup" event="onkeyup" reRender="test" reRender="test" limitToList="true"/> limitToList="true"/> </h:inputText </h:inputText> h:inputText> <br <br> br> <h:outputText id="test" id="test" value="#{modul.name}" value="#{modul.name}" /> </a4j:form> </f:view </f:view> f:view> </body </body> body> ... Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 372 Beispiel: Viel aufwändige Action (2/4) - web.xml Beispiel: Viel aufwändige Action (3/4) - Ausgabe • minimal notwendige Ergänzung direkt beim Tippen <filter> <display<display-name>RichFaces name>RichFaces Filter</displayFilter</display-name> <filter<filter-name>richfaces name>richfaces</filter </filterrichfaces</filter-name> <filter<filter-class>org.ajax4jsf.Filter</filterclass>org.ajax4jsf.Filter</filter-class> </filter> <filter<filter-mapping> <filter<filter-name>richfaces name>richfaces</filter richfaces</filter</filter-name> <servletservlet-name>Faces Servlet</servlet Servlet</servletservlet-name> <dispatcher>REQUEST</dispatcher> <dispatcher>FORWARD</dispatcher> <dispatcher>INCLUDE</dispatcher> </filter</filter-mapping> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 373 Beispiel: Viel aufwändige Action (4/4) - Projektordner Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 374 Mini-Beispiel: Kalender - kleiner Ausschnitt (1/3) <body> <f:view> f:view> <a4j:form> <rich:calendar id="cal" value="#{modul.start value="#{modul.start}" modul.start}" popup="false“ popup="false“ datePattern=" datePattern="dd.MM.yyyy ="dd.MM.yyyy"> dd.MM.yyyy"> <a4j:support event="onchanged event="onchanged" onchanged" reRender="o"/> reRender="o"/> </rich:calendar </rich:calendar> rich:calendar> <br> br> <h:commandButton action="#{modul.show action="#{modul.show}" modul.show}" value="Ü value="Übernehmen"/> bernehmen"/> <br <br> br> <h:outputLabel value="ausgew value="ausgewä ausgewählt: hlt: "/> <h:outputText id="o" value="#{modul.start value="#{modul.start}" modul.start}" /> </a4j:form> </f:view </f:view> f:view> </body> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 375 Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 376 Mini-Beispiel: Kalender - kleiner Ausschnitt (2/3) Mini-Beispiel: Kalender - kleiner Ausschnitt (3/3) public class Modul implements Serializable {... private Date start=new Date();... public Date getStart() getStart() { return start; } public void setStart(Date start) { this.start = start; } public String show(){ show(){ System.out.println("Datum: System.out.println("Datum: " +new SimpleDateFormat("dd.MM.yyyy").format(start)); SimpleDateFormat("dd.MM.yyyy").format(start)); return "X"; } <managed<managed-bean> <managed<managed-beanbean-name>modul name>modul</managed modul</managed</managed-beanbean-name> <managed<managed-beanbean-class>entities.Modul class>entities.Modul</managed entities.Modul</managed</managed-beanbean-class> <managed<managed-beanbean-scope>session</managedscope>session</managed-beanbean-scope> </managed</managed-bean> Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 377 Komponentenbasierte SoftwareEntwicklung Prof. Dr. Stephan Kleuker 378