Java-Beans programmieren
Bisher haben wir Java-Code innerhalb von JSP Seiten geschrieben und Tomcat die Arbeit überlassen, daraus eine brauchbare Java-Class-Datei zu machen. Leider ist dieses Verfahren nun an seine Grenzen gestoßen, und wir wollen im Folgenden eine JavaBean von Hand erzeugen.
Java ist eine kompilierende Sprache. Der Sourcecode liegt in einer Datei mit der Endung .java, der Compiler erzeugt daraus sogenannten Bytecode in eine Datei .class. Nur die class-Datei wird ausgeführt; wenn die .java Datei verändert wird, müssen Sie mit dem Compiler eine neue .class Datei erzeugen, damit die Änderungen wirksam werden.
Alle .class Dateien, die ausgeführt oder bei der Ausführung benutzt (referenziert) werden, müssen von der Java Runtime Umgebung auch gefunden werden. Wenn Sie eigene Klassen benutzen, können Sie die zugehörigen .class Dateien nicht irgendwo auf Ihrem Rechner oder im Internet verteilen, sondern Sie müssen in Verzeichnissen liegen, wo sie von der Java - Laufzeitumgebung auch gefunden werden (Classpath).
Tomcat hat ein Verzeichnis, in dem er immer nach .class Dateien sucht, das ist WEB-INF/classes. Bitte wechseln Sie nach JSPKURS/web/WEB-INF und erzeugen Sie ein Verzeichnis classes, falls es noch nicht existiert. In diesem Verzeichnis werden wir unsere .class Dateien ablegen.
Jetzt brauchen wir noch einen Ort für unsere Sourcen (.java-Dateien). Die sollten nicht unterhalb des JSPKURS/web Verzeichnisses liegen, da sie anderenfalls im Web sichtbar wären, was doch ein ziemliches Sicherheitsrisiko für unseren Server darstellte. Ein potenzieller Angreifen sollte nach Möglichkeit nicht unseren Sourcecode zu sehen bekommen. Bitte legen Sie daher ein Verzeichnis JSPKURS/source, dies werden wir für unsere .java-Source Dateien benutzen.
Wir wollen nun ein etwas komplexeres Beispiel einer Online-Registrierung betrachten: Wir benutzen dazu mehrere JSP Seiten, die die Formulare für die Registrierung enthalten, sowie eine Bean, die wir in der Session halten und die für das Speichern und Verarbeiten der eingegebenen Daten zuständig ist. Betrachten wir zunächst die Bean.
Betrachten Sie die Datei RegisterData.java und machen Sie sich mit dem Sourcecode vertraut.
Code: /code2html/jspkurs/bsp/kap2/RegisterData.java.html
/* Auch wir organisieren unsere
* Klassen in Packages, um Ordnung zu halten
* und Nameskonflikte zu vermeiden.
* Die Angabe package muss stets die erste
* Codezeile in einer Datei sein. */
package jspkurs.bsp.kap2;
/* Import-Anweisungen sparen uns Schreibarbeit, weil wir
* im Code nicht den vollen Pfadnamen verwenden müssen.
* Ausserdem kann man so auf einen Blick erkennen,
* welche Klassen unser Code verwendet. */
import java.io.Serializable;
/* Kommentarte, die mit Slash zwei Sterne /**
* beginnen und direkt vor einer Klasse, einer Methode oder einem
* Feld stehen, werden vom Tool "javadoc" benutzt, um
* automatisch eine Dokumentation der Klasse zu erzeugen.
* Innerhalb dieser Kommentare können mit @ bestimmte Felder
* gekennzeichnet werden, die in der Dokumentation eine
* besondere Bedeutung haben. Einzelheiten in der Javadokumentation
* unter tooldoc/javadoc. */
/**
* Datenbean für Beispiel kap3_register1.jsp
* @author Hans Joachim Herbertz
* @created 17.01.2003
*/
public class RegisterData implements Serializable {
/**
* Feld für den Nachnamen.
* Initialisieren Sie alle Felder mit null
* oder einem leeren String. */
private String lastName = null;
/** Feld für den Vornamen*/
private String firstName = null;
/** Strasse und Hausnummer. */
private String street = null;
/** Wohnort. */
private String place = null;
/** Postleitzahl. */
private String zipcode = null;
/** Telefonnummer. */
private String phone = null;
/** E-Mail. */
private String mail = null;
/**
* Public Konstruktor ohne Parameter wie f\u00fcr
* Beans erforderlich. */
public RegisterData() {
}
/**
* Es folgen Getter und Setter Methoden,
* die wenig aufregend sind, aber ben�tigt werden,
* damit Tomcat die Bean bearbeiten kann.
* Returns the firstName.
* @return String
*/
public String getFirstName() {
return firstName;
}
/**
* Returns the lastName.
* @return String
*/
public String getLastName() {
return lastName;
}
/**
* Sets the firstName.
* @param firstName The firstName to set
*/
public void setFirstName(String firstName) {
this.firstName = firstName;
}
/**
* Sets the lastName.
* @param lastName The lastName to set
*/
public void setLastName(String lastName) {
this.lastName = lastName;
}
/**
* Returns the place.
* @return String
*/
public String getPlace() {
return place;
}
/**
* Returns the street.
* @return String
*/
public String getStreet() {
return street;
}
/**
* Returns the zipcode.
* @return String
*/
public String getZipcode() {
return zipcode;
}
/**
* Sets the place.
* @param place The place to set
*/
public void setPlace(String place) {
this.place = place;
}
/**
* Sets the street.
* @param street The street to set
*/
public void setStreet(String street) {
this.street = street;
}
/**
* Sets the zipcode.
* @param zipcode The zipcode to set
*/
public void setZipcode(String zipcode) {
this.zipcode = zipcode;
}
/**
* Returns the mail.
* @return String
*/
public String getMail() {
return mail;
}
/**
* Returns the phone.
* @return String
*/
public String getPhone() {
return phone;
}
/**
* Sets the mail.
* @param mail The mail to set
*/
public void setMail(String mail) {
this.mail = mail;
}
/**
* Sets the phone.
* @param phone The phone to set
*/
public void setPhone(String phone) {
this.phone = phone;
}
/**
* Eine Komfortmethode, um die Ergebnisse
* anzuzeigen. Versuchen Sie stets, sowenig
* Code wie m\u00f6glich in der JSP unterzubringen,
* aber vermeiden Sie es auch, Formatierungsangaben
* in der Bean zu machen.*/
public String[][] getAllInput() {
String[][] allInput = new String[][] { { "Nachname", getLastName()}, {
"Vorname", getFirstName()
}, {
" ", " " }, {
"Strasse", getStreet()
}, {
"Postleitzahl", getZipcode()
}, {
"Ort", getPlace()
}, {
" ", " " }, {
"Telefonnummer", getPhone()
}, {
"E-Mail", getMail()
}
};
return allInput;
}
/**
* Ein Dummy; Speichert Werte in der Datenbank */
public boolean save() {
boolean success = true;
// Todo: Write to database;
// Random testing implmentation meanwhile
if (Math.random() > .5) {
success = false;
}
return success;
}
}
Der erste wichtige Unterschied zu unserem vorherigen Beispiel ist die Package-Direktive:
006 package jspkurs.bsp.kap2;
Unsere Bean wird folglich als jspkurs.bsp.kap2.RegisterData referenziert. Benutzen Sie Packages, um Namenskonflikte zu vermeiden und Ordnung in Ihrem Code zu halten, indem Sie zusammengehörige Klassen in einem Package unterbringen.
Es folgen Felder (Variablen) vom Type String, die die Daten aus den JSP Formularen aufnehmen werden. Entsprechend sind die passenden Getter- und Setter-Methoden vorhanden, um die Verarbeitung durch den Container (Tomcat) zu ermöglichen. Der public Konstruktor ohne Parameter darf ebenfalls nicht fehlen.
Die Methode public void save() (Zeile 188) ist nur ein Dummy; sie kann in einer realen Implementierung den Datenbankcode aufnehmen. Darüber finden Sie eine Komfortmethode public String[][] getAllInput(), die der JSP etwas Arbeit abnimmt; Sie sollten stets versuchen, möglichst wenig Code in der JSP zu haben, da JSP Seiten schnell unübersichtlich werden und Beans leichter zu entwickeln und debuggen sind. Außerdem können Sie hier sehen, wie man ein zweidimensionales Array initialisiert.
Wir wollen nun diesen Code kompilieren, um ihn in Tomcat zu nutzen. Unser Basisverzeichnis ist jspkurs/source, wechseln Sie in dieses Verzeichnis und legen Sie darin ein Verzeichnis jspkurs und darin ein Verzeichnis bsp und dann kap2 an. Der Name des Packages unserer RegisterData-Bean wird im Dateisystem durch entsprechende Verzeichnisse widergegeben. Öffnen Sie nun die Datei RegisterData.java und speichern Sie sie unter source/jspkurs/bsp/kap2/RegisterData.java.
Öffnen Sie nun eine DOS-Box respektive eine Konsole und wechseln Sie in Ihr Source Verzeichnis JSPKURS/source.
Tippen Sie nun javac ein. Javac ist der Java Compiler, der den Sourcecode der RegisterData.java in eine ausführbare RegisterData.class verwandeln soll. Wir benutzen hier nur den Parameter -d, da wir ein spezielles Ausgabeverzeichnis wünschen, nämlich WEB-INF/classes.
Starten Sie den Compiler mit:
C:\jspkurs\source>c:\jdk1.4\bin\javac -d ../web/WEB-INF/classes jspkurs/bsp/kap2/RegisterData.java
Der Compiler zeigt bei Erfolg keine Reaktion. Im Verzeichnis WEB-INF/classes hat er Unterverzeichnisse /jspkurs/kap3 angelegt und darin die Datei RegisterData.class erzeugt. Datei ist an dieser Stelle für Tomcat sichtbar und wir könne Sie in den JSP verwenden.
Ein Java-Editor oder eine Java IDE (Integrierte Entwicklungsumgebung) kann Ihnen die Entwicklung von komplexen Java-Projekten wesentlich erleichtern. Solche Programme verwalten den CLASSPATH, starten auf Knopfdruck den Compiler oder das Runtime mit den richtigen Parametern und bieten in der Regel eine Fülle weiterer Nützlichkeiten wie Syntaxhilfen, Class Browser, automatisches Schreiben von Gettern und Settern und so weiter. Es gibt meines Erachtens auch für einen Anfänger keinen vernünftigen Grund, auf diese Vorteile zu verzichten, sobald man erst mal grundsätzlich verstanden hat, wie Java funktioniert. Allerdings sollten Sie damit rechnen, ein paar Stunden Einarbeitungszeit auf diese Programme zu verwerden. Einen Überblick über die kostenlosen Entwicklungswerkzeuge für Java finden Sie in unserem Info-Paket: „Entwicklungsumgebungen für die Java-Programmierung“ (Liegt noch nicht vor).