6. javaserverfaces(jsf) -...
TRANSCRIPT
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