14.6 Auf Beans zurückgreifen
Eine JavaBean ist eine einfache Softwarekomponente mit einem Standard-Konstruktor und enthält nach einem Namensschema benannte Methoden. Für eine Eigenschaft XXX existieren die Methoden setXXX() oder getXXX(). Eine JSP kann Beans erzeugen, Properties lesen und schreiben und auf diese Weise Geschäftslogik anstoßen. JavaBeans stellen somit das Backend der Webapplikation dar.
14.6.1 Beans in JSPs anlegen
Die JSP-Aktion <jsp:useBean> macht in der JSP eine JavaBean-Instanz verfügbar, die über einen EL-Ausdruck oder über ein Scriptlet verwendet werden kann:
Listing 14.9: now.jsp
<jsp:useBean id="now" class="java.util.Date" />
Heute ist ${now}.
Die Aktion <jsp:useBean> erwartet zwei Attribute:
- id: Gibt den Namen der Bean an. Der Name muss ein gültiger Java-Bezeichnername sein, denn die Aktion führt zu einer lokalen Variablen im Servlet, auf die ein Scriptlet zugreifen kann.
- class: Identifiziert mit dem voll qualifizierten Klassennamen die JavaBean.
Der Ausdruck ${now} ruft automatisch die toString()-Methode der Bean auf, sodass das aktuelle Datum in der JSP erscheint.
14.6.2 Properties einer Bean im EL-Ausdruck erfragen
Mit der JSP Expression Language können nicht nur einfache Literale wie in ${12+12} verarbeitet werden, sondern es lassen sich wie zum Beispiel in ${now.year} auch JavaBeans-Properties erfragen. Dazu ist der Name der Property nach einem Punkt hinter den Bean-Namen zu setzen. Da das Date-Objekt die (deprecated) Setter/Getter setYear() und getYear() besitzt, ist für den Zugriff auf das Jahr Folgendes zu schreiben:
Listing 14.10: year.jsp
<jsp:useBean id="now" class="java.util.Date" />
Jahr: ${1900 + now.year}.
Properties beginnen immer mit einem Kleinbuchstaben!
14.6.3 Properties mit <jsp:setProperty> setzen
Die EL bietet nur Leseoperationen, sodass zum Belegen von Bean-Attributen eine andere Syntax zu wählen ist. JSP definiert zum Setzen von Properties die Aktion <jsp:setProperty>. Setzen wir ein Date-Objekt auf den 12.3.1973:
Listing 14.11: mybirthday.jsp
<jsp:useBean id="birthday" class="java.util.Date" />
<jsp:setProperty name="birthday" property="date" value="12" />
<jsp:setProperty name="birthday" property="month" value="2" />
<jsp:setProperty name="birthday" property="year" value="${ 1973 – 1900 }" />
${birthday}
Konvertierungen von String in den Property-Datentyp nimmt der Web-Container selbstständig vor – natürlich kann es zu Konvertierungsfehlern kommen. Im Attribut value sind auch EL-Ausdrücke zur Berechnung möglich, was der letzte Ausdruck zeigt.
Hinweis |
Wir haben auf die Properties mit der EL zugegriffen, aber vor JSP 2.0 kam <jsp:getProperty> mit den Attributen name und property zum Einsatz. |
14.6.4 Bean-Klasse zum Testen von E-Mail-Adressen
Wir wollen zunächst eine einfache Bean schreiben, die eine E-Mail-Adresse auf Korrektheit prüft. Dabei bedienen wir uns eines kleinen regulären Ausdrucks, der auch in Abschnitt 4.8, »Reguläre Ausdrücke«, in »Java ist auch eine Insel« zu finden ist:
Listing 14.12: com/tutego/web/EMailChecker.java
package com.tutego.web;
public class EMailChecker
{
private String email = "";
public void setEmail( String email )
{
this.email = email;
}
public String getEmail()
{
return email;
}
public boolean isValidEmail()
{
return email.matches( "[\\w|-]+@\\w[\\w|-]*\\.[a-z]{2,3}" );
}
}
Insgesamt bietet die Bean zwei Properties an:
- email: Lese-/Schreib-Property
- validEmail: Nur-Lesen-Property
Hinter der Property email stehen Setter/Getter-Methoden, die auf das private Attribut email zugreifen. Die Property validEmail bedient sich ebenfalls der internen Variablen email und wird nicht durch ein eigenes internes Attribut gestützt. (Wenn ein Wert aus einem anderen Wert hervorgeht, so nennt sich das in UML eine abgeleitete Eigenschaft – mit Vererbung hat das nichts zu tun.)
E-Mail-Bean in der JSP nutzen
Zum Testen soll eine JSP eine EMailChecker-Bean anlegen und sie mit unterschiedlichen E?Mail-Adressen füttern. Für jede E-Mail-Adresse wird dann die Property validEmail sagen, ob die E-Mail auf den ersten Blick korrekt oder nicht korrekt aussieht:
Listing 14.13: email.jsp
<jsp:useBean id="emailchecker" class="com.tutego.web.EMailChecker" />
<jsp:setProperty name="emailchecker" property="email" value="a@b.com" />
${emailchecker.validEmail}
<br>
<jsp:setProperty name="emailchecker" property="email" value="@b.com" />
${emailchecker.validEmail}
<br>
<jsp:setProperty name="emailchecker" property="email" value="a@b" />
${emailchecker.validEmail}
Hinweis |
Unsere JavaBean EMailChecker ist in einem Paket com.tutego.web und nicht im Default-Package. Tomcat akzeptiert keine JavaBeans im Default-Package und auch, wenn sie dort wäre und wir versuchen würden, sie mit <jsp:useBean id="emailchecker" class="EMailChecker"/> in der JSP bekanntzumachen, bekämen wir nur die wenig hilfreiche Meldung: org.apache.jasper.JasperException: Unable to compile class for JSP: |
14.6.5 Parameterwerte in Bean übertragen
Um die Bean mit Benutzerwerten zu füttern, ist lediglich auf einen Parameter zurückzugreifen. Wollten wir zum Beispiel eine Mail-Adresse an ein Programm emailcheck.jsp übermitteln, schreiben wir (das »@« müsste eigentlich umkodiert werden in »%40«):
http://localhost:8080/web/emailcheck.jsp?email=a@b.com
Die Bean soll die E-Mail aus dem Parameter email speichern und dann auswerten:
Listing 14.14: emailcheck.jsp
<jsp:useBean id="emailchecker" class="com.tutego.web.EMailChecker" />
<jsp:setProperty name="emailchecker" property="email" value="${param.email}" />
${emailchecker.email} ist gültig? ${emailchecker.validEmail}
Damit ergibt sich auf der Webseite:
a@b.com ist gültig? true
<jsp:setProperty> ohne value
Der Zugriff auf die Parameter einer Anfrage und das Speichern des Attributs in der Bean ist eine häufig gestellte Aufgabe. Daher haben die Entwickler eine Abkürzung vorgesehen. Hier wird bei <jsp:setProperty> einfach das Attribut value weggelassen.
<jsp:setProperty name="emailchecker" property="email" />
Damit wird der Wert direkt aus dem Parameter ausgelesen, wie üblich automatisch konvertiert und auf eine Property übertragen; dieser Vorgang trägt den gleichen Namen wie der Parameter.
Ist der Wert von property="*", werden alle Eigenschaften aus den Parametern ausgelesen und die entsprechenden setXXX()-Methoden der Bean aufgerufen.
Ihr Kommentar
Wie hat Ihnen das <openbook> gefallen? Wir freuen uns immer über Ihre freundlichen und kritischen Rückmeldungen.