Unsere Datenschutzrichtlinie wird in Kürze aktualisiert. Bitte sehen Sie sich die Vorschau an.

Java EE 7 Grundkurs

Daten entgegennehmen

Testen Sie unsere 2016 Kurse

10 Tage kostenlos!

Jetzt testen Alle Abonnements anzeigen
Beans nehmen in einer Webapplikation im JSF-Framework Daten entgegen und binden diese per Expression Language an die gewünschten Komponenten. Dieses Video bietet einen detaillierten Überblick über die Funktionsweise.

Transkript

Typischerweise nehmen dynamische Web-Applikationen an irgendeiner Stelle Daten entgegen und verarbeiten sie. Aus diesem Grund werden wir uns in diesem Video damit auseinandersetzen, wie wir dies anstellen können. Wir werden uns deswegen mit den wichtigsten Eingabekomponenten befassen und wir werden uns ein wenig mit der Expression Language auseinandersetzen, die eine Bindung zwischen Webseite und Verarbeitungslogik beziehungsweise ModelBean darstellt. Lassen Sie uns zunächst über die Expression Language reden. In einem MVC-Ansatz ist es ja so, dass das Model die Daten hält, der Controller die Verarbeitung vornimmt und die View vergleichsweise dumm ist. Wir müssen also eine Möglichkeit finden, dass wir solche Views gestalten können, die dann ihrerseits in der Lage sind, Daten ins Model oder an den Controller zu übergeben. Dies lässt sich mit Hilfe der Expression Language erledigen. Ein Expression-Language- Konstrukt sieht immer so aus, dass wir eine Raute haben, dann die geschweifte Klammer nach links, dann geben wir den Namen einer Bean an, gefolgt von einem Punkt und dem Namen einer Eigenschaft dieser Bean. Und dann folgt eine geschweifte Klammer nach rechts. Damit das funktionieren kann, müssen die Beans benannt sein. Dazu verwenden wir die Named-Annotation und können auf die Art und Weise dann auf die Beans zugreifen. Die Eigenschaften, die wir ansprechen, sollten für die Expression Language immer als Getter- und Setter-Paare vorliegen. Neben CDI-Beans können wir auch EJBs mit Expression Language verwenden. Auch diese müssen mit der Named-Annotation annotiert sein. Das kann dann so aussehen wie in diesem Beispiel, wo eine Stateless Session Bean definiert ist, die ihrerseits named ist und dann aus dem Code heraus angesprochen werden kann. Expression Language ist sehr mächtig im Java-EE-Umfeld, denn das Zuweisen und Abrufen von Daten erfolgt anhand der Expression- Language-Statements automatisch. Dies ist sehr angenehm, hat allerdings auch Nachteile, weil uns letztlich ein wenig die Kontrolle darüber verloren geht, welche Daten tatsächlich in irgendwelchen Beans gespeichert werden. Aus diesem Grund können wir EventListener verwenden. EventListener erlauben es uns, auf Ereignisse zu reagieren. Es gibt einige Arten von EventListener, beispielsweise ActionListener. Ein ActionListener wird eingebunden, wenn ein Button geklickt wird oder Ähnliches geschieht. Sehr häufig verwendet man einen ValueChangedListener. Beim ValueChangedListener erfolgt das Einbinden der entsprechenden Komponente, wenn sich der Wert eines Textfeldes oder die Auswahl in einer Liste geändert haben. Vorteil dieser Listenener gegenüber der direkten Zuweisung von Werten an das Model: Die Daten können einfacher überprüft werden und die Verarbeitung der Eingaben erfolgt im Controller. Das erlaubt es uns, den Setter im Model gegebenenfalls leer zu lassen oder zumindest mit weniger Logik zu versehen. Charmant ist auch, dass beim Ausführen eines ValueChangedListeners immer der originale und der neue Wert übergeben werden. Das Behandeln von Daten innerhalb der JSF geschieht über zusätzliche Komponenten, die wir in unsere Komponenten, die im Front End deklariert sind, einbinden können. Da gibt es zum Beispiel für das Formatieren von Werten und das Angeben von Wertebereichen eine Komponente namens convertNumber. Hier werden Zeichenketten, das, was wir eingeben in Formularfelder sind ja immer nur Zeichenketten, in Zahlen konvertiert und andersherum, und wir haben diverse Formatierungsoptionen. Die convertDateTime-Komponente erlaubt es uns, in oder aus Datums- und Uhrzeitwerten zu konvertieren. Mit Hilfe der converter- Komponente können wir auch eigene Logiken dort einbinden. Nun müssen wir uns natürlich die Frage stellen: Womit können wir überhaupt Eingaben entgegennehmen? Typische Komponenten sind inputText für die Eingabe von Texten, inputArea für die Eingabe von mehrzeiligen Texten, inputHidden für keine Eingabe, sondern für ein verstecktes Formularfeld, inputSecret für ein Kennwortfeld. Nun möchte man nicht immer nur Texte eingeben, sondern man möchte auch Ausgaben vornehmen können. Dies geht. Es gibt diverse vordefinierte Auswahlkomponenten. SelectBooleanCheckbox erlaubt es uns zum Beispiel, eine Ja-/Nein-Auswahl zu gewährleisten. SelectManyCheckbox erlaubt es uns, eine Liste von Checkboxen anzuzeigen. SelectManyListbox ist eine Liste mit Mehrfachauswahl. Diese kann optional mehrzeilig angezeigt werden. SelectManyMenu ist eine Liste mit Mehrfachauswahl. Diese kann aber immer nur einzeilig sein. SelectOneListbox ist eine Liste mit Einfachauswahl. Diese kann optional mehrzeilig sein. Und selectOneMenu ist eine einzeilige Liste mit Einfachauswahl. Die letzten vier Komponenten, die wir gerade eben besprochen haben, rendern im HTML letztlich in Select-Elemente. Und dann gibt es noch die selectOneRadio-Komponente. Diese stellt eine Radio-Liste, also diese bekannten Radio-Buttons, von denen nur einer aktiv sein kann, zur Auswahl eines Elements bereit. Sehen wir uns einmal an, wie wir mit diesen Komponenten arbeiten können. Wir werden im Folgenden ein Formular definieren, in dem ein Benutzer seinen Benutzernamen, ein Kennwort und sein Geschlecht hinterlegen kann. Die dort eingegebenen Informationen werden wir dann in einer Bean entgegennehmen. Wir sehen hier eine Webseite. Diese Webseite ist schon fertig programmiert. Wir werden uns im Folgenden anschauen, wie diese Webseite umgesetzt ist. Lassen Sie mich zunächst die Funktionalität demonstrieren. Wir haben hier ein Eingabeformular. Hier kann ich Werte eingeben. Wenn ich auf die Schaltfläche "übermitteln" klicke, dann werden diese Daten versandt und ich bekomme eine Meldung angezeigt, dass die Daten gespeichert worden sind. Diese Funktionalität ist komplett und vollständig mit JSF umgesetzt worden. Lassen Sie uns zunächst einen Blick auf die dahinterstehende Bean werfen. Die Daten werden nämlich in einer Bean gehalten. Die Bean, ich habe sie "NewUserBean" genannt, verfügt über eine Annotation "Named" aus dem Package "javax.inject". Damit ist diese Bean später für Expression Language sichtbar. Sie ist ebenfalls serializable. Dies wird benötigt, falls so eine Bean in irgendeiner Form zwischengespeichert werden soll. Sie verfügt darüber hinaus über die RequestScoped-Annotation aus dem javax.enterprise.context-Package. Damit ist gesagt, dass diese Bean im RequestScope liegt, das heißt bei jeder Anforderung neu erstellt wird. Diese Bean definiert vier private Felder: loginName, password, gender und ein Feld mit dem Namen "showThankYouMessage" vom Typ "boolean", dessen Standardwert "false" lautet. Zu jedem dieser Felder gibt es Getter und Setter. Soweit ist an dieser Bean gar nichts Geheimnisvolles. Die zweite Komponente, die ich Ihnen zeigen möchte, ist die Gender Enumeration. Das Geschlecht, das Sie hier auf dieser Seite zur Auswahl angezeigt bekommen, entspricht einer Aufzählung. Das haben wir in dieser enum Gender definiert. Es gibt drei Fälle: Male, Female und SomethingElse. Es gibt hier eine weitere Komponente, die für die Verarbeitung der Daten zuständig ist. Das ist der NewUserController. Die NewUserBean hält die Daten. Im MVC-Model ist sie das Model. Der NewUserController ist der Controller. Auch dieser NewUserController hat die Named-Annotation und hat einen Scope, in dem Fall "SessionScoped". Das bedeutet, er bleibt länger aktiv als die Bean selber. Wir lassen uns in diesem Controller per CDI die NewUserBean-Instanz für den aktuellen Request injizieren. Der NewUserController verfügt über eine Methode, die von außen aufgerufen wird, nämlich "handleButtonClicked". Diese Methode reagiert auf ein ActionEvent. Das bedeutet, sie wird eingebunden, wenn irgendwo an einer bestimmten Stelle ein Button geklickt wird. Im Moment ist die Funktionalität so implementiert, dass wir auf der NewUserBean die Eigenschaft "showThankYouMessage" auf "true" setzen. Weitere Verarbeitungen finden hier nicht statt. Ebenfalls wird hier im Controller die Liste der Geschlechter, die wir hier zur Auswahl stellen, Männlich, Weiblich, Unbekannt, gerendert. Das bedeutet, wir geben eine Liste vom Typ "SelectItem" zurück und die wird intern als eine ArrayList vom Typ "SelectItem" aufgebaut. Jeder Eintrag in dieser Liste wird repräsentiert über eine SelectItem-Instanz und die SelectItem-Instanz verfügt über einen Konstruktor, wo wir zum einen den Wert als Zeichenkette übergeben und zum anderen den Anzeigewert bestimmen. Auf die Art und Weise kann die außen liegende Faces-Seite die Daten korrekt darstellen und verwendet nicht die englischen Originalbegriffe. Widmen wir uns doch jetzt einmal der eigentlichen interessanten Komponente, nämlich der JSF-Seite. Diese ist zugegebenermaßen etwas umfangreicher gestaltet. Wir definieren in dieser JSF-Seite erst einmal einen Inhaltsbereich. Es gibt innerhalb dieses Inhaltsbereiches zwei divs, die beide als Pass Through Elements markiert sind. Das bedeutet, sie verfügen über ein Attribut, das mit dem Namensraum "http://xmlns.jcp.org/jsf" markiert ist. Das ist ein Attribut, das dann an eine JSF-Komponente gebunden wird. Und wir verwenden hier das Attribut "rendered". "Rendered" nimmt einen booleschen Wert entgegen, und dieser boolesche Wert gibt Auskunft darüber, ob die Komponente und ihre untergeordneten Komponenten dargestellt werden sollen oder nicht. Wir binden diesen Wert per Expression Language an die Eigenschaft "showThankYouMessage" der NewUserBean. Man beachte: Die Bean hat denselben Namen wie hier. Ausgedrückt wird das über diese Named-Annotation. Der einzige Unterschied ist: Hier bei der Klasse ist der erste Buchstabe groß, und in der JSF-Seite ist der erste Buchstabe klein. Die Eigenschaft "showThankYouMessage" wird angesprochen über den entsprechenden Getter. Das bedeutet, es wird erwartet: Es gibt einen Getter mit dem Namen "getShowThankYouMessage", den wir implementiert haben. Das gleiche gilt für die zweite Komponente, die wir hier erzeugen. Diese ist dann für das Darstellen der Danke-Nachricht zuständig. Schauen wir uns an, was in dieser ersteren Komponente passiert. Hier gibt es ein h:form-Element. Sie müssen sich angewöhnen, alle Eingabeelemente innerhalb eines h:form-Elementes zu platzieren. Sie können auch ein html:form-Element benutzen. Nur müssen Sie dann mehr Werte setzen. Die eigentlichen Eingabeelemente sind als inputText-, inputSecret- und als selectOneMenu- Eingabeelemente umgesetzt. Das inputText-Element ist gebunden, über Expression Language, an die Eigenschaft "LoginName" der NewUserBean. Und wir definieren hier per Pass-Through-Attribut den Platzhalter "Anmeldename". Das inputSecret-Element ist gebunden an die Eigenschaft "password" der NewUserBean-Instanz. Und die selectOneMenu-Instanz ist gebunden an die Eigenschaft "newUserBean.gender". Diese ist hier noch etwas interessanter. Zum einen gibt es hier ein untergeordnetes selectItems-Element, das für die Darstellung der Listenelemente zuständig ist, die im Controller generiert werden. Das ist die Eigenschaft "getGenders", die wir hier gesehen haben. Und zum zweiten ist hier ein sogenannter Converter deklariert. Man beachte, dass diese selectItems- und Converter-Elemente innerhalb des selectOneMenu-Elementes liegen. Dieser Converter ist selber wieder eine Java-Klasse. Und er hat einen relativ einfachen Aufbau. Er ist definiert in der Klasse "GenderConverter". Wichtig ist, dass im Kopf des Converters eine Annotation deklariert ist, nämlich "FacesConverter". Hier geben wir den Namen dieses Converters oder einen ID-Wert an. Über diesen ID-Wert wird der Converter dann identifiziert. So ein Converter implementiert das Interface "Converter" und muss zwei Methoden bereitstellen: getAsObject und getAsString. Und die beiden Methoden sind dafür verantwortlich, dass die entsprechenden Werte, die da hinein übergeben werden, einmal eine Zeichenkette und einmal eben das eigentliche Objekt, in die jeweils andere Repräsentation umgewandelt werden. Sie sehen: Es steckt schon Einiges an Logik in dieser Applikation. Zuletzt haben wir in diesem Bereich noch einen Command-Button. So ein Command-Button löst immer eine Aktion aus. Und dieser Comman-Button ist über das actionListener-Attribut an die Methode "handleButtonClicked" des NewUserControllers gebunden. Diese Methode haben wir ebenfalls bereits gesehen. Das ist diese Methode, in der die ThankYouMessage-Eigenschaft umgestellt wird. Wenn man das Ganze dann laufen lässt, ergibt sich eben das beschriebene und gesehene Verhalten. Ich kann hier eine Auswahl machen, klicke auf "Daten übermitteln". Die Daten werden übertragen. Und ich bekomme eine andere Anzeige. In diesem Video haben Sie gesehen, wie Sie Daten entgegennehmen können, wie Sie per Expression Language eine Bindung zwischen View und Model, beziehungsweise zwischen View und Controller, herstellen können. Dies gilt es, in Zukunft zu vertiefen.

Java EE 7 Grundkurs

Lernen Sie die Grundlagen der Programmierung mit Java EE 7 verstehen und anwenden.

6 Std. 4 min (44 Videos)
Derzeit sind keine Feedbacks vorhanden...
 

Dieser Online-Kurs ist als Download und als Streaming-Video verfügbar. Die gute Nachricht: Sie müssen sich nicht entscheiden - sobald Sie das Training erwerben, erhalten Sie Zugang zu beiden Optionen!

Der Download ermöglicht Ihnen die Offline-Nutzung des Trainings und bietet die Vorteile einer benutzerfreundlichen Abspielumgebung. Wenn Sie an verschiedenen Computern arbeiten, oder nicht den ganzen Kurs auf einmal herunterladen möchten, loggen Sie sich auf dieser Seite ein, um alle Videos des Trainings als Streaming-Video anzusehen.

Wir hoffen, dass Sie viel Freude und Erfolg mit diesem Video-Training haben werden. Falls Sie irgendwelche Fragen haben, zögern Sie nicht uns zu kontaktieren!