6. JavaServerFaces(JSF) -...

39
Komponentenbasierte Software- Entwicklung Prof. Dr. Stephan Kleuker 300 6. JavaServer Faces (JSF) Nutzung von JSF-Annotationen Validierung von Eingaben Ausgabe von Fehlermeldungen Auswahl darzustellender Elemente typische elementare Software-Architektur JSF + JPA • Visualisierungskomponenten • AJAXifizierung fortgeschrittene JSF-Frameworks Literatur: - Sun, JSR 252 JavaServer Faces 1.2, http://www.jcp.org/en/jsr/detail?i d=252 - R. Hightower, Getting started with JavaServer Faces 1.2, http://www.ibm.com/developerwo rks/edu/j-dw-java-jsf1-i.html - J. Jacobi, J. R, Fallows, Pro JSF and AJAX, Apress, NY (USA), 2006

Transcript of 6. JavaServerFaces(JSF) -...

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

300

6. JavaServer Faces (JSF)

• Nutzung von JSF-Annotationen

• Validierung von Eingaben

• Ausgabe von Fehlermeldungen

• Auswahl darzustellender Elemente

• typische elementare Software-Architektur

• JSF + JPA

• Visualisierungskomponenten

• AJAXifizierung

• fortgeschrittene JSF-Frameworks

Literatur:- Sun, JSR 252 JavaServer Faces 1.2, http://www.jcp.org/en/jsr/detail?id=252- R. Hightower, Getting started with JavaServer Faces 1.2, http://www.ibm.com/developerworks/edu/j-dw-java-jsf1-i.html- J. Jacobi, J. R, Fallows, Pro JSF and AJAX, Apress, NY (USA), 2006

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

301

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 JSF 1.2 (etabliert), auf JSF 2.0 übertragbar (-> evtl. Semesteraufgabe)

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

302

Web-Server mit JSF- (und EJB-) Unterstützung

• Beispiele:

– Apache + Tomcat

– BEA WebLogic Server

– IBM WebSphere (Apache Geronimo)

– JBoss

– Oracle WebLogic

– Sun Glassfish Enterprise Server (Glassfish)

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

303

Nulltes JSF-Beispiel (1/9)

• Aufgabe: Modul (Name + Nummer) eingeben und wieder ausgeben

• Beispiel zeigt:

– Konzept der Einbettung von JSF in JSP-Seiten (JSF auch ohne JSP, nur XML-basiert nutzbar!)

– erste JSF-Befehle

– Seitenmanövrierung durch JSF

• 0. Beispiel zeigt nicht:

– ordentliche Softwarearchitektur (Controller und Model trennen)

– Validierungsmöglichkeiten für Eingaben

– Layoutgestaltung

– viele coole Dinge

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

304

Nulltes JSF-Beispiel (2/9) - Start welcomeJSF.jsp<%@<%@<%@<%@pagepagepagepage contentType="text/htmlcontentType="text/htmlcontentType="text/htmlcontentType="text/html" pageEncoding="UTF" pageEncoding="UTF" pageEncoding="UTF" pageEncoding="UTF----8"%>8"%>8"%>8"%><%@<%@<%@<%@taglibtaglibtaglibtaglib prefix="fprefix="fprefix="fprefix="f" " " " uri="http://java.sun.com/jsf/coreuri="http://java.sun.com/jsf/coreuri="http://java.sun.com/jsf/coreuri="http://java.sun.com/jsf/core"%>"%>"%>"%><%@<%@<%@<%@taglibtaglibtaglibtaglib prefix="hprefix="hprefix="hprefix="h" " " " uri="http://java.sun.com/jsf/htmluri="http://java.sun.com/jsf/htmluri="http://java.sun.com/jsf/htmluri="http://java.sun.com/jsf/html"%>"%>"%>"%><!DOCTYPE HTML PUBLIC "<!DOCTYPE HTML PUBLIC "<!DOCTYPE HTML PUBLIC "<!DOCTYPE HTML PUBLIC "----//W3C//DTD HTML 4.01 //W3C//DTD HTML 4.01 //W3C//DTD HTML 4.01 //W3C//DTD HTML 4.01 Transitional//ENTransitional//ENTransitional//ENTransitional//EN"""""http://www.w3.org/TR/html4/loose.dtd">"http://www.w3.org/TR/html4/loose.dtd">"http://www.w3.org/TR/html4/loose.dtd">"http://www.w3.org/TR/html4/loose.dtd">

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

charset=UTFcharset=UTFcharset=UTFcharset=UTF----8"/>8"/>8"/>8"/><<<<title>Eingabe</titletitle>Eingabe</titletitle>Eingabe</titletitle>Eingabe</title> </> </> </> </headheadheadhead>>>>

<<<<bodybodybodybody>>>><<<<h:formh:formh:formh:form>>>><<<<h:outputTexth:outputTexth:outputTexth:outputText value="Modulnamevalue="Modulnamevalue="Modulnamevalue="Modulname "/>"/>"/>"/><<<<h:inputTexth:inputTexth:inputTexth:inputText id="mnameid="mnameid="mnameid="mname" " " " value="#{modul.namevalue="#{modul.namevalue="#{modul.namevalue="#{modul.name}" }" }" }"

required="true"/><brrequired="true"/><brrequired="true"/><brrequired="true"/><br>>>><<<<h:outputTexth:outputTexth:outputTexth:outputText value="Modulnummervalue="Modulnummervalue="Modulnummervalue="Modulnummer "/>"/>"/>"/><<<<h:inputTexth:inputTexth:inputTexth:inputText id="mnrid="mnrid="mnrid="mnr" " " " value="#{modul.nrvalue="#{modul.nrvalue="#{modul.nrvalue="#{modul.nr}" }" }" }"

required="true"/><brrequired="true"/><brrequired="true"/><brrequired="true"/><br>>>><<<<h:commandButtonh:commandButtonh:commandButtonh:commandButton value="Abschickenvalue="Abschickenvalue="Abschickenvalue="Abschicken" " " "

action="#{modul.uebernehmenaction="#{modul.uebernehmenaction="#{modul.uebernehmenaction="#{modul.uebernehmen}"/>}"/>}"/>}"/></</</</h:formh:formh:formh:form>>>>

</</</</bodybodybodybody> </> </> </> </htmlhtmlhtmlhtml> > > > </</</</f:viewf:viewf:viewf:view>>>>

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

305

Nulltes JSF-Beispiel (3/9) - Analyse der Startseite

• Einbinden der JSF-Bibliotheken<%@<%@<%@<%@taglibtaglibtaglibtaglib prefix="fprefix="fprefix="fprefix="f" " " " uri="http://java.sun.com/jsf/coreuri="http://java.sun.com/jsf/coreuri="http://java.sun.com/jsf/coreuri="http://java.sun.com/jsf/core"%>"%>"%>"%><%@<%@<%@<%@taglibtaglibtaglibtaglib prefix="hprefix="hprefix="hprefix="h" " " " uri="http://java.sun.com/jsf/htmluri="http://java.sun.com/jsf/htmluri="http://java.sun.com/jsf/htmluri="http://java.sun.com/jsf/html"%>"%>"%>"%>

• Gesamte JSF-Bearbeitung in <f:view>-Element (kann auch erst in <body> stehen)

• In JSF-Elementen (meist) HTML und JSTL nutzbar

• enge Verwandtschaft HTML zu JSF-Element (<h:form>)

• für value="#{modul.namevalue="#{modul.namevalue="#{modul.namevalue="#{modul.name}" }" }" }" offene Fragen:

– was ist modul? ( -> Managed Bean)

– warum #? (Trennung von JSTL-EL; Methodenaufruf)

– was passiert bei modul.name? (set/get abhängig von in/out)

• Ausblick: action="#{modul.uebernehmenaction="#{modul.uebernehmenaction="#{modul.uebernehmenaction="#{modul.uebernehmen}"}"}"}", echtes Event-Handling (Methodenaufruf)

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

306

Nulltes JSF-Beispiel (4/9) - Ausgabe ausgabeJSF.jsp

<%@<%@<%@<%@pagepagepagepage contentType="text/htmlcontentType="text/htmlcontentType="text/htmlcontentType="text/html" pageEncoding="UTF" pageEncoding="UTF" pageEncoding="UTF" pageEncoding="UTF----8"%>8"%>8"%>8"%><%@<%@<%@<%@taglibtaglibtaglibtaglib prefix="fprefix="fprefix="fprefix="f" " " " uri="http://java.sun.com/jsf/coreuri="http://java.sun.com/jsf/coreuri="http://java.sun.com/jsf/coreuri="http://java.sun.com/jsf/core"%>"%>"%>"%><%@<%@<%@<%@taglibtaglibtaglibtaglib prefix="hprefix="hprefix="hprefix="h" " " " uri="http://java.sun.com/jsf/htmluri="http://java.sun.com/jsf/htmluri="http://java.sun.com/jsf/htmluri="http://java.sun.com/jsf/html"%>"%>"%>"%><!DOCTYPE HTML PUBLIC "<!DOCTYPE HTML PUBLIC "<!DOCTYPE HTML PUBLIC "<!DOCTYPE HTML PUBLIC "----//W3C//DTD HTML 4.01 //W3C//DTD HTML 4.01 //W3C//DTD HTML 4.01 //W3C//DTD HTML 4.01 Transitional//ENTransitional//ENTransitional//ENTransitional//EN"""""http://www.w3.org/TR/html4/loose.dtd">"http://www.w3.org/TR/html4/loose.dtd">"http://www.w3.org/TR/html4/loose.dtd">"http://www.w3.org/TR/html4/loose.dtd">

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

charset=UTFcharset=UTFcharset=UTFcharset=UTF----8"/>8"/>8"/>8"/><<<<title>Ausgabe</titletitle>Ausgabe</titletitle>Ausgabe</titletitle>Ausgabe</title>>>>

</</</</headheadheadhead> <> <> <> <bodybodybodybody>>>><<<<h:formh:formh:formh:form>>>><<<<h:outputTexth:outputTexth:outputTexth:outputText value="Modulnamevalue="Modulnamevalue="Modulnamevalue="Modulname: "/>: "/>: "/>: "/><<<<h:outputTexth:outputTexth:outputTexth:outputText id="mnameid="mnameid="mnameid="mname" " " " value="#{modul.namevalue="#{modul.namevalue="#{modul.namevalue="#{modul.name}"/> <}"/> <}"/> <}"/> <brbrbrbr>>>><<<<h:outputTexth:outputTexth:outputTexth:outputText value="Modulnummervalue="Modulnummervalue="Modulnummervalue="Modulnummer: "/>: "/>: "/>: "/><<<<h:outputTexth:outputTexth:outputTexth:outputText id="mnrid="mnrid="mnrid="mnr" " " " value="#{modul.nr}"/><brvalue="#{modul.nr}"/><brvalue="#{modul.nr}"/><brvalue="#{modul.nr}"/><br>>>><<<<h:commandButtonh:commandButtonh:commandButtonh:commandButton value="Zurvalue="Zurvalue="Zurvalue="Zur Eingabe" Eingabe" Eingabe" Eingabe"

action="#{modul.eingebenaction="#{modul.eingebenaction="#{modul.eingebenaction="#{modul.eingeben}"/>}"/>}"/>}"/></</</</h:formh:formh:formh:form> </> </> </> </bodybodybodybody>>>>

</</</</htmlhtmlhtmlhtml>>>></</</</f:viewf:viewf:viewf:view>>>>

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

307

Nulltes JSF-Beispiel (5/9) - Manövrieren

• Grundidee: Automat mit Seiten als Knoten (Zustände), Übergang findet durch String-Konstanten statt

• String-Konstanten sind Ergebnisse von (Action-) Methoden

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

308

Nulltes JSF-Beispiel (6/9) - faces-config.xml 1/2<?<?<?<?xmlxmlxmlxml version='1.0' encoding='UTFversion='1.0' encoding='UTFversion='1.0' encoding='UTFversion='1.0' encoding='UTF----8'?>8'?>8'?>8'?><<<<facesfacesfacesfaces----configconfigconfigconfig version="1.2" version="1.2" version="1.2" version="1.2"

xmlns="http://java.sun.com/xml/ns/javaeexmlns="http://java.sun.com/xml/ns/javaeexmlns="http://java.sun.com/xml/ns/javaeexmlns="http://java.sun.com/xml/ns/javaee" " " " xmlns:xsi="http://www.w3.org/2001/XMLSchemaxmlns:xsi="http://www.w3.org/2001/XMLSchemaxmlns:xsi="http://www.w3.org/2001/XMLSchemaxmlns:xsi="http://www.w3.org/2001/XMLSchema----instance" instance" instance" instance" xsi:schemaLocation="http://java.sun.com/xml/ns/javaeexsi:schemaLocation="http://java.sun.com/xml/ns/javaeexsi:schemaLocation="http://java.sun.com/xml/ns/javaeexsi:schemaLocation="http://java.sun.com/xml/ns/javaeehttp://java.sun.com/xml/ns/javaee/webhttp://java.sun.com/xml/ns/javaee/webhttp://java.sun.com/xml/ns/javaee/webhttp://java.sun.com/xml/ns/javaee/web----facesconfig_1_2.xsd">facesconfig_1_2.xsd">facesconfig_1_2.xsd">facesconfig_1_2.xsd">

<<<<navigationnavigationnavigationnavigation----rulerulerulerule>>>><<<<fromfromfromfrom----viewviewviewview----id>/welcomeJSF.jsp</fromid>/welcomeJSF.jsp</fromid>/welcomeJSF.jsp</fromid>/welcomeJSF.jsp</from----viewviewviewview----idididid>>>><<<<navigationnavigationnavigationnavigation----casecasecasecase>>>><<<<fromfromfromfrom----outcome>ANZEIGEN</fromoutcome>ANZEIGEN</fromoutcome>ANZEIGEN</fromoutcome>ANZEIGEN</from----outcomeoutcomeoutcomeoutcome>>>><<<<totototo----viewviewviewview----id>/ausgabeJSF.jsp</toid>/ausgabeJSF.jsp</toid>/ausgabeJSF.jsp</toid>/ausgabeJSF.jsp</to----viewviewviewview----idididid>>>>

</</</</navigationnavigationnavigationnavigation----casecasecasecase>>>></</</</navigationnavigationnavigationnavigation----rulerulerulerule>>>><<<<navigationnavigationnavigationnavigation----rulerulerulerule>>>><<<<fromfromfromfrom----viewviewviewview----id>/ausgabeJSF.jsp</fromid>/ausgabeJSF.jsp</fromid>/ausgabeJSF.jsp</fromid>/ausgabeJSF.jsp</from----viewviewviewview----idididid>>>><<<<navigationnavigationnavigationnavigation----casecasecasecase>>>><<<<fromfromfromfrom----outcome>EINGEBEN</fromoutcome>EINGEBEN</fromoutcome>EINGEBEN</fromoutcome>EINGEBEN</from----outcomeoutcomeoutcomeoutcome>>>><<<<totototo----viewviewviewview----id>/welcomeJSF.jsp</toid>/welcomeJSF.jsp</toid>/welcomeJSF.jsp</toid>/welcomeJSF.jsp</to----viewviewviewview----idididid>>>>

</</</</navigationnavigationnavigationnavigation----casecasecasecase>>>></</</</navigationnavigationnavigationnavigation----rulerulerulerule>>>>

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

309

Nulltes JSF-Beispiel (7/9) - Managed Bean

publicpublicpublicpublic classclassclassclass Modul Modul Modul Modul implementsimplementsimplementsimplements SerializableSerializableSerializableSerializable {{{{private private private private staticstaticstaticstatic final final final final longlonglonglong serialVersionUIDserialVersionUIDserialVersionUIDserialVersionUID = 1L;= 1L;= 1L;= 1L;private private private private intintintint nrnrnrnr;;;;private String private String private String private String namenamenamename;;;;// fehlt: // fehlt: // fehlt: // fehlt: getgetgetget---- und und und und setsetsetset----MethodenMethodenMethodenMethoden ffffüüüür Exemplarvariablenr Exemplarvariablenr Exemplarvariablenr Exemplarvariablenpublicpublicpublicpublic Modul(){}Modul(){}Modul(){}Modul(){}

publicpublicpublicpublic String String String String uebernehmenuebernehmenuebernehmenuebernehmen(){ //Action(){ //Action(){ //Action(){ //Action----MethodeMethodeMethodeMethode// Zugriff auf Exemplarvariablen m// Zugriff auf Exemplarvariablen m// Zugriff auf Exemplarvariablen m// Zugriff auf Exemplarvariablen mööööglichglichglichglichreturnreturnreturnreturn "ANZEIGEN";"ANZEIGEN";"ANZEIGEN";"ANZEIGEN";

}}}}

publicpublicpublicpublic String eingeben(){String eingeben(){String eingeben(){String eingeben(){// Zugriff auf Exemplarvariablen m// Zugriff auf Exemplarvariablen m// Zugriff auf Exemplarvariablen m// Zugriff auf Exemplarvariablen mööööglichglichglichglichreturnreturnreturnreturn "EINGEBEN";"EINGEBEN";"EINGEBEN";"EINGEBEN";

}}}}............

}}}}

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

310

Nulltes JSF-Beispiel (8/9) - faces-config.xml 2/2

<managed<managed<managed<managed----bean>bean>bean>bean><managed<managed<managed<managed----beanbeanbeanbean----name>name>name>name>modulmodulmodulmodul</managed</managed</managed</managed----beanbeanbeanbean----name>name>name>name><managed<managed<managed<managed----beanbeanbeanbean----class>class>class>class>entities.Modulentities.Modulentities.Modulentities.Modul</managed</managed</managed</managed----beanbeanbeanbean----class>class>class>class><managed<managed<managed<managed----beanbeanbeanbean----scope>request</managedscope>request</managedscope>request</managedscope>request</managed----beanbeanbeanbean----scope>scope>scope>scope>

</managed</managed</managed</managed----bean>bean>bean>bean></faces</faces</faces</faces----configconfigconfigconfig>>>><<<<servletservletservletservlet>>>><<<<servletservletservletservlet----name>Facesname>Facesname>Facesname>Faces Servlet</servletServlet</servletServlet</servletServlet</servlet----namenamenamename>>>><<<<servletservletservletservlet----class>javax.faces.webapp.FacesServletclass>javax.faces.webapp.FacesServletclass>javax.faces.webapp.FacesServletclass>javax.faces.webapp.FacesServlet</</</</servletservletservletservlet----classclassclassclass>>>><load<load<load<load----onononon----startup>1</loadstartup>1</loadstartup>1</loadstartup>1</load----onononon----startup>startup>startup>startup>

</</</</servletservletservletservlet>>>><<<<servletservletservletservlet----mappingmappingmappingmapping>>>><<<<servletservletservletservlet----name>Facesname>Facesname>Facesname>Faces Servlet</servletServlet</servletServlet</servletServlet</servlet----namenamenamename>>>><<<<urlurlurlurl----pattern>/faces/*</urlpattern>/faces/*</urlpattern>/faces/*</urlpattern>/faces/*</url----patternpatternpatternpattern>>>>

</</</</servletservletservletservlet----mappingmappingmappingmapping>>>><<<<welcomewelcomewelcomewelcome----filefilefilefile----listlistlistlist>>>><<<<welcomewelcomewelcomewelcome----file>faces/welcomeJSF.jsp</welcomefile>faces/welcomeJSF.jsp</welcomefile>faces/welcomeJSF.jsp</welcomefile>faces/welcomeJSF.jsp</welcome----filefilefilefile>>>>

</</</</welcomewelcomewelcomewelcome----filefilefilefile----listlistlistlist>>>></</</</webwebwebweb----appappappapp>>>>

in in in in web.xmlweb.xmlweb.xmlweb.xml

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

311

Nulltes JSF-Beispiel (9/9) - Projektstruktur und Ablauf

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

312

Erinnerung: Konstanten in Programmen

• schlecht returnreturnreturnreturn "ANZEIGEN";"ANZEIGEN";"ANZEIGEN";"ANZEIGEN";

• besser: Konstanten getrennt deklarierenpublicpublicpublicpublic classclassclassclass Modul Modul Modul Modul implementsimplementsimplementsimplements SerializableSerializableSerializableSerializable{{{{private final private final private final private final staticstaticstaticstatic stringstringstringstring ANZEIGEN = "ANZEIGEN";ANZEIGEN = "ANZEIGEN";ANZEIGEN = "ANZEIGEN";ANZEIGEN = "ANZEIGEN";............returnreturnreturnreturn ANZEIGEN;ANZEIGEN;ANZEIGEN;ANZEIGEN;

• Alternativ: Klasse mit Konstantenpackagepackagepackagepackage konstanten;konstanten;konstanten;konstanten;publicpublicpublicpublic classclassclassclass Navigation{Navigation{Navigation{Navigation{publicpublicpublicpublic final final final final staticstaticstaticstatic stringstringstringstring ANZEIGEN = "ANZEIGEN";ANZEIGEN = "ANZEIGEN";ANZEIGEN = "ANZEIGEN";ANZEIGEN = "ANZEIGEN";............returnreturnreturnreturn konstanten.Navigation.ANZEIGENkonstanten.Navigation.ANZEIGENkonstanten.Navigation.ANZEIGENkonstanten.Navigation.ANZEIGEN;;;;

– Entwicklungsumgebungen erlauben dann einfache Suche und Änderung (Refactoring)

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

313

Fehleingaben im nullten Beispiel (Seite bleibt)

Eingabe:

im Server-Fenster:sourceId=j_id_id16:mname[severity=(ERROR 2), sourceId=j_id_id16:mname[severity=(ERROR 2), sourceId=j_id_id16:mname[severity=(ERROR 2), sourceId=j_id_id16:mname[severity=(ERROR 2), summary=(j_id_id16:mname: summary=(j_id_id16:mname: summary=(j_id_id16:mname: summary=(j_id_id16:mname: ValidierungsValidierungsValidierungsValidierungs----FehlerFehlerFehlerFehler: Wert wird : Wert wird : Wert wird : Wert wird benbenbenbenöööötigt.), detail=(j_id_id16:mname: tigt.), detail=(j_id_id16:mname: tigt.), detail=(j_id_id16:mname: tigt.), detail=(j_id_id16:mname: ValidierungsValidierungsValidierungsValidierungs----FehlerFehlerFehlerFehler: : : : Wert wird benWert wird benWert wird benWert wird benöööötigt.)tigt.)tigt.)tigt.)

Eingabe:

im Server-Fenster:sourceIdsourceIdsourceIdsourceId=j_id_id16:mnr[severity=(ERROR 2), =j_id_id16:mnr[severity=(ERROR 2), =j_id_id16:mnr[severity=(ERROR 2), =j_id_id16:mnr[severity=(ERROR 2), summary=(j_id_id16:mnr: 'super' must be a number summary=(j_id_id16:mnr: 'super' must be a number summary=(j_id_id16:mnr: 'super' must be a number summary=(j_id_id16:mnr: 'super' must be a number consisting of one or more digits.), detail=(j_id_id16:mnr: consisting of one or more digits.), detail=(j_id_id16:mnr: consisting of one or more digits.), detail=(j_id_id16:mnr: consisting of one or more digits.), detail=(j_id_id16:mnr: 'super' must be a number between 'super' must be a number between 'super' must be a number between 'super' must be a number between ----2147483648 and 2147483648 and 2147483648 and 2147483648 and 2147483647 Example: 9346)]2147483647 Example: 9346)]2147483647 Example: 9346)]2147483647 Example: 9346)]

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

314

Direkte Validierungen - einige Möglichkeiten

<<<<bodybodybodybody> <> <> <> <f:viewf:viewf:viewf:view>>>><<<<h:formh:formh:formh:form>>>><<<<h:panelGridh:panelGridh:panelGridh:panelGrid columns="3" >columns="3" >columns="3" >columns="3" ><<<<h:outputLabelh:outputLabelh:outputLabelh:outputLabel for="mnamefor="mnamefor="mnamefor="mname" " " " value="Modulnamevalue="Modulnamevalue="Modulnamevalue="Modulname "/>"/>"/>"/><<<<h:inputTexth:inputTexth:inputTexth:inputText id="mnameid="mnameid="mnameid="mname" " " " value="#{modul.namevalue="#{modul.namevalue="#{modul.namevalue="#{modul.name}"}"}"}"

required="truerequired="truerequired="truerequired="true" size="8" " size="8" " size="8" " size="8" requiredMessage="nichrequiredMessage="nichrequiredMessage="nichrequiredMessage="nich leer"leer"leer"leer"validatorMessage="4 Zeichen">validatorMessage="4 Zeichen">validatorMessage="4 Zeichen">validatorMessage="4 Zeichen">

<<<<f:validateLengthf:validateLengthf:validateLengthf:validateLength minimum="4" maximum="4"/>minimum="4" maximum="4"/>minimum="4" maximum="4"/>minimum="4" maximum="4"/></</</</h:inputTexth:inputTexth:inputTexth:inputText>>>><<<<h:messageh:messageh:messageh:message for="mnamefor="mnamefor="mnamefor="mname" />" />" />" /><<<<h:outputLabelh:outputLabelh:outputLabelh:outputLabel for="mnrfor="mnrfor="mnrfor="mnr" " " " value="Modulnummervalue="Modulnummervalue="Modulnummervalue="Modulnummer "/>"/>"/>"/><<<<h:inputTexth:inputTexth:inputTexth:inputText id="mnrid="mnrid="mnrid="mnr" " " " value="#{modul.nrvalue="#{modul.nrvalue="#{modul.nrvalue="#{modul.nr}" }" }" }" required="truerequired="truerequired="truerequired="true" " " "

requiredMessage="machrequiredMessage="machrequiredMessage="machrequiredMessage="mach Zahl eh"size="4"Zahl eh"size="4"Zahl eh"size="4"Zahl eh"size="4"converterMessage="nomahleconverterMessage="nomahleconverterMessage="nomahleconverterMessage="nomahle Zahl"/>Zahl"/>Zahl"/>Zahl"/>

<<<<h:messageh:messageh:messageh:message for="mnrfor="mnrfor="mnrfor="mnr" />" />" />" /><<<<h:commandButtonh:commandButtonh:commandButtonh:commandButton value="Abschickenvalue="Abschickenvalue="Abschickenvalue="Abschicken" " " "

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

</</</</h:formh:formh:formh:form>>>></</</</f:viewf:viewf:viewf:view> </> </> </> </bodybodybodybody>>>>

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

315

Ausgaben beim Drücken von „Abschicken“

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

316

Globale Fehlermeldungen

publicpublicpublicpublic String String String String uebernehmenuebernehmenuebernehmenuebernehmen() {() {() {() {ifififif ((((name.equals("OOADname.equals("OOADname.equals("OOADname.equals("OOAD")) {")) {")) {")) {FacesContextFacesContextFacesContextFacesContext ctxtctxtctxtctxt = = = = FacesContext.getCurrentInstanceFacesContext.getCurrentInstanceFacesContext.getCurrentInstanceFacesContext.getCurrentInstance();();();();FacesMessageFacesMessageFacesMessageFacesMessage ms = ms = ms = ms = newnewnewnew FacesMessageFacesMessageFacesMessageFacesMessage();();();();ms.setSeverity(FacesMessage.SEVERITY_ERRORms.setSeverity(FacesMessage.SEVERITY_ERRORms.setSeverity(FacesMessage.SEVERITY_ERRORms.setSeverity(FacesMessage.SEVERITY_ERROR););););ms.setSummary("OOADms.setSummary("OOADms.setSummary("OOADms.setSummary("OOAD ist schon da");ist schon da");ist schon da");ist schon da");ms.setDetail("OOADms.setDetail("OOADms.setDetail("OOADms.setDetail("OOAD im Standard");im Standard");im Standard");im Standard");ctxt.addMessage(nullctxt.addMessage(nullctxt.addMessage(nullctxt.addMessage(null, ms);, ms);, ms);, ms);

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

}}}}

//in //in //in //in ausgabeJSF.jspausgabeJSF.jspausgabeJSF.jspausgabeJSF.jsp<<<<h:formh:formh:formh:form>>>><<<<h:messagesh:messagesh:messagesh:messages globalOnlyglobalOnlyglobalOnlyglobalOnly="true"/>="true"/>="true"/>="true"/><<<<h:outputTexth:outputTexth:outputTexth:outputText value="value="value="value="ModulnameModulnameModulnameModulname: "/>: "/>: "/>: "/>

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

317

Validierer selbst gestrickt (1/2)

packagepackagepackagepackage validatorsvalidatorsvalidatorsvalidators;;;;importimportimportimport javax.faces.application.FacesMessagejavax.faces.application.FacesMessagejavax.faces.application.FacesMessagejavax.faces.application.FacesMessage;;;;importimportimportimport javax.faces.component.UIComponentjavax.faces.component.UIComponentjavax.faces.component.UIComponentjavax.faces.component.UIComponent;;;;importimportimportimport javax.faces.context.FacesContextjavax.faces.context.FacesContextjavax.faces.context.FacesContextjavax.faces.context.FacesContext;;;;importimportimportimport javax.faces.validator.Validatorjavax.faces.validator.Validatorjavax.faces.validator.Validatorjavax.faces.validator.Validator;;;;importimportimportimport javax.faces.validator.ValidatorExceptionjavax.faces.validator.ValidatorExceptionjavax.faces.validator.ValidatorExceptionjavax.faces.validator.ValidatorException;;;;

publicpublicpublicpublic classclassclassclass OOADCheckerOOADCheckerOOADCheckerOOADChecker implementsimplementsimplementsimplements ValidatorValidatorValidatorValidator {{{{publicpublicpublicpublic OOADCheckerOOADCheckerOOADCheckerOOADChecker() { }() { }() { }() { }

publicpublicpublicpublic voidvoidvoidvoid validate(FacesContextvalidate(FacesContextvalidate(FacesContextvalidate(FacesContext contextcontextcontextcontext, , , , UIComponentUIComponentUIComponentUIComponent componentcomponentcomponentcomponent, , , , ObjectObjectObjectObject valuevaluevaluevalue) ) ) )

throwsthrowsthrowsthrows ValidatorExceptionValidatorExceptionValidatorExceptionValidatorException {{{{ifififif (((String) (((String) (((String) (((String) value).equals("OOADvalue).equals("OOADvalue).equals("OOADvalue).equals("OOAD")) ")) ")) ")) throwthrowthrowthrow newnewnewnew ValidatorExceptionValidatorExceptionValidatorExceptionValidatorException( ( ( ( newnewnewnew FacesMessageFacesMessageFacesMessageFacesMessage((((

FacesMessage.SEVERITY_ERRORFacesMessage.SEVERITY_ERRORFacesMessage.SEVERITY_ERRORFacesMessage.SEVERITY_ERROR, ", ", ", "owehowehowehoweh", "", "", "", "oleoleoleole oleoleoleole"));"));"));"));}}}}

}}}}

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

318

Validierer selbst gestrickt (2/2)

• in faces-config.xml

<<<<validatorvalidatorvalidatorvalidator>>>>

<<<<validatorvalidatorvalidatorvalidator----id>ooadCheck</validatorid>ooadCheck</validatorid>ooadCheck</validatorid>ooadCheck</validator----idididid>>>>

<<<<validatorvalidatorvalidatorvalidator----class>validators.OOADChecker</validatorclass>validators.OOADChecker</validatorclass>validators.OOADChecker</validatorclass>validators.OOADChecker</validator----classclassclassclass>>>>

</</</</validatorvalidatorvalidatorvalidator>>>>

<<<<h:inputTexth:inputTexth:inputTexth:inputText id="mnameid="mnameid="mnameid="mname" " " "

value="#{modul.namevalue="#{modul.namevalue="#{modul.namevalue="#{modul.name}"}"}"}"

required="truerequired="truerequired="truerequired="true" size="8" " size="8" " size="8" " size="8"

requiredMessage="nichrequiredMessage="nichrequiredMessage="nichrequiredMessage="nich leer">leer">leer">leer">

<<<<f:validatorf:validatorf:validatorf:validator

validatorId="ooadCheckvalidatorId="ooadCheckvalidatorId="ooadCheckvalidatorId="ooadCheck"/>"/>"/>"/>

</</</</h:inputTexth:inputTexth:inputTexth:inputText>>>>

<<<<h:messageh:messageh:messageh:message for="mnamefor="mnamefor="mnamefor="mname" />" />" />" />

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

319

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 werden soll

packagepackagepackagepackage entitiesentitiesentitiesentities;;;;publicpublicpublicpublic classclassclassclass MojoMojoMojoMojo {{{{private private private private booleanbooleanbooleanboolean jo=truejo=truejo=truejo=true;;;;publicpublicpublicpublic MojoMojoMojoMojo(){}(){}(){}(){}publicpublicpublicpublic booleanbooleanbooleanboolean getJogetJogetJogetJo() {() {() {() {returnreturnreturnreturn jojojojo;} //Name ;} //Name ;} //Name ;} //Name isJoisJoisJoisJo mmmmööööglichglichglichglichpublicpublicpublicpublic voidvoidvoidvoid setJo(booleansetJo(booleansetJo(booleansetJo(boolean jojojojo) {) {) {) {this.jothis.jothis.jothis.jo = = = = jojojojo;};};};}publicpublicpublicpublic String String String String changechangechangechange(){(){(){(){jo=!jojo=!jojo=!jojo=!jo;;;;returnreturnreturnreturn "Dableiben";"Dableiben";"Dableiben";"Dableiben";

}}}}}}}}

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

320

Standardattribut rendered (2/3) - JSF-Seite

<%@<%@<%@<%@pagepagepagepage contentType="text/htmlcontentType="text/htmlcontentType="text/htmlcontentType="text/html" pageEncoding="UTF" pageEncoding="UTF" pageEncoding="UTF" pageEncoding="UTF----8"%>8"%>8"%>8"%><%@<%@<%@<%@taglibtaglibtaglibtaglib prefix="fprefix="fprefix="fprefix="f" " " " uri="http://java.sun.com/jsf/coreuri="http://java.sun.com/jsf/coreuri="http://java.sun.com/jsf/coreuri="http://java.sun.com/jsf/core"%>"%>"%>"%><%@<%@<%@<%@taglibtaglibtaglibtaglib prefix="hprefix="hprefix="hprefix="h" " " " uri="http://java.sun.com/jsf/htmluri="http://java.sun.com/jsf/htmluri="http://java.sun.com/jsf/htmluri="http://java.sun.com/jsf/html"%>"%>"%>"%>............<<<<bodybodybodybody>>>><<<<f:viewf:viewf:viewf:view>>>><<<<h:formh:formh:formh:form id="f1">id="f1">id="f1">id="f1"><<<<h:panelGridh:panelGridh:panelGridh:panelGrid id="p1" id="p1" id="p1" id="p1" rendered="#{mo.jorendered="#{mo.jorendered="#{mo.jorendered="#{mo.jo}">}">}">}"><<<<h:outputLabelh:outputLabelh:outputLabelh:outputLabel value="FHvalue="FHvalue="FHvalue="FH rocks"/>rocks"/>rocks"/>rocks"/>

</</</</h:panelGridh:panelGridh:panelGridh:panelGrid>>>><<<<h:panelGridh:panelGridh:panelGridh:panelGrid id="p2" id="p2" id="p2" id="p2" rendered="#{!mo.jorendered="#{!mo.jorendered="#{!mo.jorendered="#{!mo.jo}">}">}">}"><<<<h:outputLabelh:outputLabelh:outputLabelh:outputLabel value="OSvalue="OSvalue="OSvalue="OS rocks"/>rocks"/>rocks"/>rocks"/>

</</</</h:panelGridh:panelGridh:panelGridh:panelGrid>>>><<<<h:commandButtonh:commandButtonh:commandButtonh:commandButton action="#{mo.changeaction="#{mo.changeaction="#{mo.changeaction="#{mo.change}" }" }" }" value="Pressvalue="Pressvalue="Pressvalue="Press"/>"/>"/>"/>

</</</</h:formh:formh:formh:form>>>></</</</f:viewf:viewf:viewf:view>>>>

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

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

321

Standardattribut rendered (3/3) - faces-config.xml

<?<?<?<?xmlxmlxmlxml version='1.0' encoding='UTFversion='1.0' encoding='UTFversion='1.0' encoding='UTFversion='1.0' encoding='UTF----8'?>8'?>8'?>8'?><<<<facesfacesfacesfaces----configconfigconfigconfig version="1.2" ...>version="1.2" ...>version="1.2" ...>version="1.2" ...><<<<managedmanagedmanagedmanaged----beanbeanbeanbean>>>><<<<managedmanagedmanagedmanaged----beanbeanbeanbean----name>mo</managedname>mo</managedname>mo</managedname>mo</managed----beanbeanbeanbean----namenamenamename>>>><<<<managedmanagedmanagedmanaged----beanbeanbeanbean----class>entities.Mojo</managedclass>entities.Mojo</managedclass>entities.Mojo</managedclass>entities.Mojo</managed----beanbeanbeanbean----classclassclassclass>>>><<<<managedmanagedmanagedmanaged----beanbeanbeanbean----scope>session</managedscope>session</managedscope>session</managedscope>session</managed----beanbeanbeanbean----scopescopescopescope>>>>

</</</</managedmanagedmanagedmanaged----beanbeanbeanbean>>>></</</</facesfacesfacesfaces----configconfigconfigconfig>>>>

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

322

Ordentliche Softwarearchitektur

• Controller auch „baking bean“ genannt

• bei DB-Nutzung greift Controller auf DB-Verwaltungsschicht zu; die verwaltet Bean-Objekte

• JPA und Security wie bei JSP

JSFJSFJSFJSF----SeiteSeiteSeiteSeite<<<<managedmanagedmanagedmanaged----beanbeanbeanbean>>>>ControllerControllerControllerController

BeanBeanBeanBean(Entit(Entit(Entit(Entitäääät)t)t)t)

#{#{#{#{controller.speicherncontroller.speicherncontroller.speicherncontroller.speichern}}}}

#{#{#{#{controller.bearbeitencontroller.bearbeitencontroller.bearbeitencontroller.bearbeiten}}}}

#{#{#{#{controller.bean.attributcontroller.bean.attributcontroller.bean.attributcontroller.bean.attribut}}}}

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

323

Verwaltung einer Modulliste (1/9) - Entität (Wdh)

@@@@EntityEntityEntityEntitypublicpublicpublicpublic classclassclassclass Modul Modul Modul Modul implementsimplementsimplementsimplements SerializableSerializableSerializableSerializable {{{{private private private private staticstaticstaticstatic final final final final longlonglonglong serialVersionUIDserialVersionUIDserialVersionUIDserialVersionUID = 1L;= 1L;= 1L;= 1L;@@@@IdIdIdId @@@@GeneratedValue(strategyGeneratedValue(strategyGeneratedValue(strategyGeneratedValue(strategy = = = = GenerationType.AUTOGenerationType.AUTOGenerationType.AUTOGenerationType.AUTO))))private private private private intintintint idididid;;;;private private private private intintintint nrnrnrnr;;;;private String private String private String private String namenamenamename;;;;@Version private @Version private @Version private @Version private intintintint versionversionversionversion;;;;publicpublicpublicpublic Modul() { }Modul() { }Modul() { }Modul() { }

publicpublicpublicpublic Modul(intModul(intModul(intModul(int nrnrnrnr, String , String , String , String namenamenamename) {) {) {) {this.nrthis.nrthis.nrthis.nr = = = = nrnrnrnr;;;;this.namethis.namethis.namethis.name = = = = namenamenamename;;;;

}}}}

// fehlen // fehlen // fehlen // fehlen getgetgetget---- und und und und setsetsetset----MethodenMethodenMethodenMethoden}}}}

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

324

Verwaltung einer Modulliste (2/9) - Seitenstruktur

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

325

Verwaltung einer Modulliste (3/9) - Datenbank• Datenbankverbindung in Form einer Data Source im Server

hinterlegt; wird durch JNDI gefunden<?<?<?<?xmlxmlxmlxml version="1.0" encoding="UTFversion="1.0" encoding="UTFversion="1.0" encoding="UTFversion="1.0" encoding="UTF----8"?>8"?>8"?>8"?><<<<persistencepersistencepersistencepersistence version="1.0" ...>version="1.0" ...>version="1.0" ...>version="1.0" ...><<<<persistencepersistencepersistencepersistence----unitunitunitunit name="JSFSpielerei5PU" name="JSFSpielerei5PU" name="JSFSpielerei5PU" name="JSFSpielerei5PU" transactiontransactiontransactiontransaction----type="JTAtype="JTAtype="JTAtype="JTA">">">"><<<<provider>org.hibernate.ejb.HibernatePersistence</providerprovider>org.hibernate.ejb.HibernatePersistence</providerprovider>org.hibernate.ejb.HibernatePersistence</providerprovider>org.hibernate.ejb.HibernatePersistence</provider>>>><jta<jta<jta<jta----datadatadatadata----source>JSFSpielerei5</jtasource>JSFSpielerei5</jtasource>JSFSpielerei5</jtasource>JSFSpielerei5</jta----datadatadatadata----source>source>source>source><<<<excludeexcludeexcludeexclude----unlistedunlistedunlistedunlisted----classes>false</excludeclasses>false</excludeclasses>false</excludeclasses>false</exclude----unlistedunlistedunlistedunlisted----classesclassesclassesclasses>>>><<<<propertiespropertiespropertiesproperties>>>><<<<propertypropertypropertyproperty name="hibernate.hbm2ddl.auto" name="hibernate.hbm2ddl.auto" name="hibernate.hbm2ddl.auto" name="hibernate.hbm2ddl.auto" value="updatevalue="updatevalue="updatevalue="update"/>"/>"/>"/>

</</</</propertiespropertiespropertiesproperties>>>></</</</persistencepersistencepersistencepersistence----unitunitunitunit>>>>

</</</</persistencepersistencepersistencepersistence>>>>

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

326

Verwaltung einer Modulliste (4/9) - faces-config.xml

<?<?<?<?xmlxmlxmlxml version='1.0' encoding='UTFversion='1.0' encoding='UTFversion='1.0' encoding='UTFversion='1.0' encoding='UTF----8'?>8'?>8'?>8'?><<<<facesfacesfacesfaces----configconfigconfigconfig version="1.2" ...>version="1.2" ...>version="1.2" ...>version="1.2" ...><<<<managedmanagedmanagedmanaged----beanbeanbeanbean>>>><<<<managedmanagedmanagedmanaged----beanbeanbeanbean----name>module</managedname>module</managedname>module</managedname>module</managed----beanbeanbeanbean----namenamenamename>>>><<<<managedmanagedmanagedmanaged----beanbeanbeanbean----classclassclassclass>>>>controller.ModuleControllercontroller.ModuleControllercontroller.ModuleControllercontroller.ModuleController

</</</</managedmanagedmanagedmanaged----beanbeanbeanbean----classclassclassclass>>>><<<<managedmanagedmanagedmanaged----beanbeanbeanbean----scope>session</managedscope>session</managedscope>session</managedscope>session</managed----beanbeanbeanbean----scopescopescopescope>>>>

</</</</managedmanagedmanagedmanaged----beanbeanbeanbean>>>><<<<navigationnavigationnavigationnavigation----rulerulerulerule>>>><<<<fromfromfromfrom----viewviewviewview----id>/welcomeJSF.jsp</fromid>/welcomeJSF.jsp</fromid>/welcomeJSF.jsp</fromid>/welcomeJSF.jsp</from----viewviewviewview----idididid>>>><<<<navigationnavigationnavigationnavigation----casecasecasecase>>>><<<<fromfromfromfrom----outcome>Hinzufuegen</fromoutcome>Hinzufuegen</fromoutcome>Hinzufuegen</fromoutcome>Hinzufuegen</from----outcomeoutcomeoutcomeoutcome>>>><<<<totototo----viewviewviewview----id>/uebersichtJSF.jsp</toid>/uebersichtJSF.jsp</toid>/uebersichtJSF.jsp</toid>/uebersichtJSF.jsp</to----viewviewviewview----idididid>>>>

</</</</navigationnavigationnavigationnavigation----casecasecasecase>>>></</</</navigationnavigationnavigationnavigation----rulerulerulerule>>>>... (zwei weitere Navigationsregeln) ... (zwei weitere Navigationsregeln) ... (zwei weitere Navigationsregeln) ... (zwei weitere Navigationsregeln)

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

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

327

Verwaltung einer Modulliste (5/9) - Startseite<<<<f:viewf:viewf:viewf:view>>>><<<<h:formh:formh:formh:form id="f1">id="f1">id="f1">id="f1"><<<<h:messagesh:messagesh:messagesh:messages globalOnly="trueglobalOnly="trueglobalOnly="trueglobalOnly="true"/>"/>"/>"/><<<<h:panelGridh:panelGridh:panelGridh:panelGrid columns="3" >columns="3" >columns="3" >columns="3" ><<<<h:outputLabelh:outputLabelh:outputLabelh:outputLabel for="mnamefor="mnamefor="mnamefor="mname" " " " value="Modulnamevalue="Modulnamevalue="Modulnamevalue="Modulname "/>"/>"/>"/><<<<h:inputTexth:inputTexth:inputTexth:inputText id="mnameid="mnameid="mnameid="mname" " " " value="#{module.modul.namevalue="#{module.modul.namevalue="#{module.modul.namevalue="#{module.modul.name}"/>}"/>}"/>}"/><<<<h:messageh:messageh:messageh:message for="mnamefor="mnamefor="mnamefor="mname" />" />" />" /><<<<h:outputLabelh:outputLabelh:outputLabelh:outputLabel for="mnrfor="mnrfor="mnrfor="mnr" " " " value="Modulnummervalue="Modulnummervalue="Modulnummervalue="Modulnummer "/>"/>"/>"/><<<<h:inputTexth:inputTexth:inputTexth:inputText id="mnrid="mnrid="mnrid="mnr" " " " value="#{module.modul.nrvalue="#{module.modul.nrvalue="#{module.modul.nrvalue="#{module.modul.nr}"/>}"/>}"/>}"/><<<<h:messageh:messageh:messageh:message for="mnrfor="mnrfor="mnrfor="mnr"/>"/>"/>"/><<<<h:commandButtonh:commandButtonh:commandButtonh:commandButton value="Abschickenvalue="Abschickenvalue="Abschickenvalue="Abschicken" " " "

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

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

</</</</f:viewf:viewf:viewf:view>>>>

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

328

Verwaltung einer Modulliste (6/9) - Controller 1/2

publicpublicpublicpublic classclassclassclass ModuleControllerModuleControllerModuleControllerModuleController {{{{@@@@PersistenceUnitPersistenceUnitPersistenceUnitPersistenceUnit private private private private EntityManagerFactoryEntityManagerFactoryEntityManagerFactoryEntityManagerFactory emfemfemfemf;;;;@@@@ResourceResourceResourceResource private private private private UserTransactionUserTransactionUserTransactionUserTransaction utxutxutxutx;;;;private private private private List<ModulList<ModulList<ModulList<Modul> > > > modulemodulemodulemodule = = = = newnewnewnew ArrayList<ModulArrayList<ModulArrayList<ModulArrayList<Modul>();>();>();>();private Modul private Modul private Modul private Modul modul=newmodul=newmodul=newmodul=new Modul();Modul();Modul();Modul();private private private private EntityManagerEntityManagerEntityManagerEntityManager emememem;;;;

publicpublicpublicpublic ModuleControllerModuleControllerModuleControllerModuleController() {}() {}() {}() {}publicpublicpublicpublic Modul Modul Modul Modul getModulgetModulgetModulgetModul() {() {() {() {returnreturnreturnreturn modulmodulmodulmodul;};};};}publicpublicpublicpublic voidvoidvoidvoid setModul(ModulsetModul(ModulsetModul(ModulsetModul(Modul modulmodulmodulmodul) {) {) {) {this.modulthis.modulthis.modulthis.modul = = = = modulmodulmodulmodul;};};};}publicpublicpublicpublic List<ModulList<ModulList<ModulList<Modul> > > > getModulegetModulegetModulegetModule() {() {() {() {returnreturnreturnreturn modulemodulemodulemodule;};};};}publicpublicpublicpublic voidvoidvoidvoid setModule(List<ModulsetModule(List<ModulsetModule(List<ModulsetModule(List<Modul> m) {> m) {> m) {> m) {this.modulethis.modulethis.modulethis.module = m;}= m;}= m;}= m;}publicpublicpublicpublic String anzeigen() {String anzeigen() {String anzeigen() {String anzeigen() {emememem = = = = emf.createEntityManageremf.createEntityManageremf.createEntityManageremf.createEntityManager();();();();modulemodulemodulemodule= (= (= (= (List<Modul>)em.createQuery("SELECTList<Modul>)em.createQuery("SELECTList<Modul>)em.createQuery("SELECTList<Modul>)em.createQuery("SELECT m FROM Modul m")m FROM Modul m")m FROM Modul m")m FROM Modul m")

....getResultListgetResultListgetResultListgetResultList();();();();em.closeem.closeem.closeem.close();();();();returnreturnreturnreturn "Anzeigen";"Anzeigen";"Anzeigen";"Anzeigen";

}}}}publicpublicpublicpublic String eingeben() {String eingeben() {String eingeben() {String eingeben() {returnreturnreturnreturn "Eingeben"; }"Eingeben"; }"Eingeben"; }"Eingeben"; }

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

329

Verwaltung einer Modulliste (7/9) - Controller 2/2

publicpublicpublicpublic String String String String uebernehmenuebernehmenuebernehmenuebernehmen() {() {() {() {FacesContextFacesContextFacesContextFacesContext ctxtctxtctxtctxt = = = = FacesContext.getCurrentInstanceFacesContext.getCurrentInstanceFacesContext.getCurrentInstanceFacesContext.getCurrentInstance();();();();FacesMessageFacesMessageFacesMessageFacesMessage ms = ms = ms = ms = newnewnewnew FacesMessage("ErfolgreichFacesMessage("ErfolgreichFacesMessage("ErfolgreichFacesMessage("Erfolgreich eingetragen");eingetragen");eingetragen");eingetragen");trytrytrytry {{{{utx.beginutx.beginutx.beginutx.begin();();();();emememem = = = = emf.createEntityManageremf.createEntityManageremf.createEntityManageremf.createEntityManager();();();();em.persist(modulem.persist(modulem.persist(modulem.persist(modul););););modulemodulemodulemodule= (= (= (= (List<Modul>)em.createQuery("SELECTList<Modul>)em.createQuery("SELECTList<Modul>)em.createQuery("SELECTList<Modul>)em.createQuery("SELECT m FROM Modul m")m FROM Modul m")m FROM Modul m")m FROM Modul m")

....getResultListgetResultListgetResultListgetResultList();();();();utx.commitutx.commitutx.commitutx.commit();();();();

} catch (} catch (} catch (} catch (ExceptionExceptionExceptionException e) {e) {e) {e) {trytrytrytry {{{{ms = ms = ms = ms = newnewnewnew FacesMessage(e.getMessageFacesMessage(e.getMessageFacesMessage(e.getMessageFacesMessage(e.getMessage());());());());utx.rollbackutx.rollbackutx.rollbackutx.rollback();();();();

} catch (} catch (} catch (} catch (ExceptionExceptionExceptionException e2) {e2) {e2) {e2) {ms = ms = ms = ms = newnewnewnew FacesMessage(e2.getMessage());FacesMessage(e2.getMessage());FacesMessage(e2.getMessage());FacesMessage(e2.getMessage());

}}}}} } } } finallyfinallyfinallyfinally {{{{ifififif ((((emememem != null) {!= null) {!= null) {!= null) {em.closeem.closeem.closeem.close();();();();

}}}}}}}}

ctxt.addMessage(nullctxt.addMessage(nullctxt.addMessage(nullctxt.addMessage(null, ms);, ms);, ms);, ms);modul=newmodul=newmodul=newmodul=new Modul();Modul();Modul();Modul();returnreturnreturnreturn """"HinzufuegenHinzufuegenHinzufuegenHinzufuegen";";";";

}}}}

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

330

Verwaltung einer Modulliste (8/9) - Ergebnisseite 1/2

<<<<f:viewf:viewf:viewf:view>>>>

<<<<h:formh:formh:formh:form id="f2">id="f2">id="f2">id="f2">

<<<<h:messagesh:messagesh:messagesh:messages globalOnly="trueglobalOnly="trueglobalOnly="trueglobalOnly="true"/>"/>"/>"/>

<<<<h:panelGridh:panelGridh:panelGridh:panelGrid rendered="#{!emptyrendered="#{!emptyrendered="#{!emptyrendered="#{!empty module.modulemodule.modulemodule.modulemodule.module}">}">}">}">

<<<<h:dataTableh:dataTableh:dataTableh:dataTable value="#{module.modulevalue="#{module.modulevalue="#{module.modulevalue="#{module.module}" }" }" }" var="mvar="mvar="mvar="m" border="8" " border="8" " border="8" " border="8"

frame="boxframe="boxframe="boxframe="box" >" >" >" >

<<<<h:columnh:columnh:columnh:column >>>>

<<<<f:facetf:facetf:facetf:facet name="headername="headername="headername="header">">">">

<<<<h:outputTexth:outputTexth:outputTexth:outputText value="Nummervalue="Nummervalue="Nummervalue="Nummer" />" />" />" />

</</</</f:facetf:facetf:facetf:facet>>>>

<<<<h:outputLabelh:outputLabelh:outputLabelh:outputLabel value="#{m.nrvalue="#{m.nrvalue="#{m.nrvalue="#{m.nr}"/>}"/>}"/>}"/>

</</</</h:columnh:columnh:columnh:column>>>>

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

331

Verwaltung einer Modulliste (9/9) - Ergebnisseite 2/2

<<<<h:columnh:columnh:columnh:column>>>>

<<<<f:facetf:facetf:facetf:facet name="headername="headername="headername="header">">">">

<<<<h:outputTexth:outputTexth:outputTexth:outputText value="Modulnamevalue="Modulnamevalue="Modulnamevalue="Modulname" />" />" />" />

</</</</f:facetf:facetf:facetf:facet>>>>

<<<<h:outputLabelh:outputLabelh:outputLabelh:outputLabel value="#{m.namevalue="#{m.namevalue="#{m.namevalue="#{m.name}"/>}"/>}"/>}"/>

</</</</h:columnh:columnh:columnh:column>>>>

</</</</h:dataTableh:dataTableh:dataTableh:dataTable>>>>

</</</</h:panelGridh:panelGridh:panelGridh:panelGrid> > > >

<<<<h:commandLinkh:commandLinkh:commandLinkh:commandLink action="#{module.eingebenaction="#{module.eingebenaction="#{module.eingebenaction="#{module.eingeben}" >}" >}" >}" >

<<<<h:outputTexth:outputTexth:outputTexth:outputText value="Zurvalue="Zurvalue="Zurvalue="Zur Moduleingabe"/>Moduleingabe"/>Moduleingabe"/>Moduleingabe"/>

</</</</h:commandLinkh:commandLinkh:commandLinkh:commandLink>>>>

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

</</</</f:viewf:viewf:viewf:view>>>>

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

332

Interessante JSF-Elemente

<<<<f:facetf:facetf:facetf:facet name="headername="headername="headername="header">">">">

<<<<h:outputTexth:outputTexth:outputTexth:outputText value="Nummervalue="Nummervalue="Nummervalue="Nummer" />" />" />" />

</</</</f:facetf:facetf:facetf:facet>>>>

• facet dient zur Ergänzung verschiedener anderer JSF-Elemente; Art der Ergänzung durch Attribut name festgelegt

<<<<h:dataTableh:dataTableh:dataTableh:dataTable value="#{mod.modulevalue="#{mod.modulevalue="#{mod.modulevalue="#{mod.module}" }" }" }" var="mvar="mvar="mvar="m" " " "

border="8" border="8" border="8" border="8" frame="boxframe="boxframe="boxframe="box" >" >" >" >

• dataTable erlaubt die Datenaufbereitung einer Collection in Tabellenform (Iterator über Daten mit getModule(); Elemente in Variable m); grundlegende Darstellungsmöglichkeiten einstellbar

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

333

GUI-Spielereien - Boolesche Checkbox

<<<<h:formh:formh:formh:form>>>><<<<h:selectBooleanCheckboxh:selectBooleanCheckboxh:selectBooleanCheckboxh:selectBooleanCheckbox title="gratisprobetitle="gratisprobetitle="gratisprobetitle="gratisprobe""""

value="#{guiKram.gratisvalue="#{guiKram.gratisvalue="#{guiKram.gratisvalue="#{guiKram.gratis}" />}" />}" />}" /><<<<h:outputTexth:outputTexth:outputTexth:outputText value="Wollenvalue="Wollenvalue="Wollenvalue="Wollen Sie es gratis?"/> <Sie es gratis?"/> <Sie es gratis?"/> <Sie es gratis?"/> <brbrbrbr>>>><<<<h:commandButtonh:commandButtonh:commandButtonh:commandButton action="saveaction="saveaction="saveaction="save" " " " value="Sichernvalue="Sichernvalue="Sichernvalue="Sichern"/>"/>"/>"/>

</</</</h:formh:formh:formh:form>>>>private private private private booleanbooleanbooleanboolean gratis;gratis;gratis;gratis;publicpublicpublicpublic voidvoidvoidvoid setGratis(booleansetGratis(booleansetGratis(booleansetGratis(boolean v){v){v){v){

gratis=vgratis=vgratis=vgratis=v; ; ; ; System.out.println("gratisSystem.out.println("gratisSystem.out.println("gratisSystem.out.println("gratis: "+gratis);}: "+gratis);}: "+gratis);}: "+gratis);}

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

334

GUI-Spielereien - selectManyCheckBox (1/2)

importimportimportimport javax.faces.model.SelectItemjavax.faces.model.SelectItemjavax.faces.model.SelectItemjavax.faces.model.SelectItem;;;;publicpublicpublicpublic classclassclassclass GUIKramGUIKramGUIKramGUIKram {{{{private private private private List<SelectItemList<SelectItemList<SelectItemList<SelectItem> list= > list= > list= > list= newnewnewnew ArrayList<SelectItemArrayList<SelectItemArrayList<SelectItemArrayList<SelectItem>();>();>();>();private String[] private String[] private String[] private String[] array={"Ute","Uwe","Urs","Utaarray={"Ute","Uwe","Urs","Utaarray={"Ute","Uwe","Urs","Utaarray={"Ute","Uwe","Urs","Uta"};"};"};"};private private private private List<SelectItemList<SelectItemList<SelectItemList<SelectItem> > > > elementeelementeelementeelemente;;;;

publicpublicpublicpublic GUIKramGUIKramGUIKramGUIKram() {() {() {() {for(Stringfor(Stringfor(Stringfor(String s:arrays:arrays:arrays:array) ) ) ) list.add(newlist.add(newlist.add(newlist.add(new SelectItem(sSelectItem(sSelectItem(sSelectItem(s));));));));

}}}}

publicpublicpublicpublic List<SelectItemList<SelectItemList<SelectItemList<SelectItem> > > > getElementegetElementegetElementegetElemente() {() {() {() {System.out.println("getSystem.out.println("getSystem.out.println("getSystem.out.println("get");");");");returnreturnreturnreturn elementeelementeelementeelemente;;;;

}}}}

publicpublicpublicpublic voidvoidvoidvoid setElemente(List<SelectItemsetElemente(List<SelectItemsetElemente(List<SelectItemsetElemente(List<SelectItem> e) {> e) {> e) {> e) {elementeelementeelementeelemente = e;= e;= e;= e;System.out.println("elementeSystem.out.println("elementeSystem.out.println("elementeSystem.out.println("elemente: "+: "+: "+: "+elementeelementeelementeelemente););););

} ...} ...} ...} ...

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

335

GUI-Spielereien - selectManyCheckBox (2/2)

<<<<h:selectManyCheckboxh:selectManyCheckboxh:selectManyCheckboxh:selectManyCheckbox id="naseid="naseid="naseid="nase" " " " value="#{guiKram.elementevalue="#{guiKram.elementevalue="#{guiKram.elementevalue="#{guiKram.elemente}">}">}">}"><<<<f:selectItemsf:selectItemsf:selectItemsf:selectItems value="#{guiKram.listvalue="#{guiKram.listvalue="#{guiKram.listvalue="#{guiKram.list}"/>}"/>}"/>}"/>

</</</</h:selectManyCheckboxh:selectManyCheckboxh:selectManyCheckboxh:selectManyCheckbox>>>><<<<h:commandButtonh:commandButtonh:commandButtonh:commandButton action="saveaction="saveaction="saveaction="save" " " " value="Sichernvalue="Sichernvalue="Sichernvalue="Sichern"/>"/>"/>"/>

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

336

GUI-Spielereien - selectManyMenu

<<<<h:selectManyMenuh:selectManyMenuh:selectManyMenuh:selectManyMenu id="nas2" id="nas2" id="nas2" id="nas2" value="#{guiKram.elementevalue="#{guiKram.elementevalue="#{guiKram.elementevalue="#{guiKram.elemente}">}">}">}">

<<<<f:selectItemsf:selectItemsf:selectItemsf:selectItems value="#{guiKram.listvalue="#{guiKram.listvalue="#{guiKram.listvalue="#{guiKram.list}"/>}"/>}"/>}"/>

</</</</h:selectManyMenuh:selectManyMenuh:selectManyMenuh:selectManyMenu>>>>

<<<<h:commandButtonh:commandButtonh:commandButtonh:commandButton action="saveaction="saveaction="saveaction="save" " " " value="Sichernvalue="Sichernvalue="Sichernvalue="Sichern"/>"/>"/>"/>

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

337

GUI-Spielereien - selectManyListBox

<<<<h:selectManyListboxh:selectManyListboxh:selectManyListboxh:selectManyListbox id="nas3" id="nas3" id="nas3" id="nas3" value="#{guiKram.elementevalue="#{guiKram.elementevalue="#{guiKram.elementevalue="#{guiKram.elemente}">}">}">}"><<<<f:selectItemsf:selectItemsf:selectItemsf:selectItems value="#{guiKram.listvalue="#{guiKram.listvalue="#{guiKram.listvalue="#{guiKram.list}"/>}"/>}"/>}"/>

</</</</h:selectManyListboxh:selectManyListboxh:selectManyListboxh:selectManyListbox>>>><<<<h:commandButtonh:commandButtonh:commandButtonh:commandButton action="saveaction="saveaction="saveaction="save" " " " value="Sichernvalue="Sichernvalue="Sichernvalue="Sichern"/>"/>"/>"/>

Komponentenbasierte Software-Entwicklung

Prof. Dr. Stephan Kleuker

338

GUI-Spielereien - selectOneRadio

<<<<h:selectOneRadioh:selectOneRadioh:selectOneRadioh:selectOneRadio id="nas4" id="nas4" id="nas4" id="nas4" value="#{guiKram.elvalue="#{guiKram.elvalue="#{guiKram.elvalue="#{guiKram.el}">}">}">}"><<<<f:selectItemsf:selectItemsf:selectItemsf:selectItems value="#{guiKram.listvalue="#{guiKram.listvalue="#{guiKram.listvalue="#{guiKram.list}" />}" />}" />}" />

</</</</h:selectOneRadioh:selectOneRadioh:selectOneRadioh:selectOneRadio>>>><<<<h:commandButtonh:commandButtonh:commandButtonh:commandButton action="saveaction="saveaction="saveaction="save" " " " value="Sichernvalue="Sichernvalue="Sichernvalue="Sichern"/>"/>"/>"/>

private String el;private String el;private String el;private String el;

publicpublicpublicpublic voidvoidvoidvoid setEl(StringsetEl(StringsetEl(StringsetEl(String el) {el) {el) {el) {

this.elthis.elthis.elthis.el = el;= el;= el;= el;

System.out.println("elSystem.out.println("elSystem.out.println("elSystem.out.println("el: "+el);: "+el);: "+el);: "+el);

}}}}

Variante: el am Anfang setzen

analog:

selectOneMenu

selectOneListbox