ANWENDUNGSGESTALTUNG
Servlets schreiben
Zum Schreiben eines Servlets benötigen Sie einen Java-Compiler und die Servlet-API. Beide können Sie auf der Website von Sun Microsystems unter "http://java.sun.com" beziehen. Laden Sie das Java Development Kit (JDK) herunter, das den Compiler und andere allgemeine Werkzeuge enthält. Laden Sie auch das Java Servlet Development Kit (JSDK) herunter. Dieses enthält die Servlet-API-Spezifikation, die .JAR-Datei für Servlets (jsdk.jar) sowie Beispiel-Servlets. Die Website von Sun enthält darüber hinaus Links zu anderen Servlet-Ressourcen auf dem Web.
Sie können Servlets auch mithilfe einer gängigen Java-Entwicklungsumgebung schreiben. Um Ihnen die Arbeit zu erleichtern, wurde den Installationsdateien von IBM® Lotus® Domino(TM)-Server und IBM® Lotus® Domino(TM) Designer eine Kopie von "jsdk.jar" beigefügt. Diese ist mit der von Sun in JSDK bereitgestellten Datei identisch.
Hinweis Folgende Änderungen wurden hinsichtlich des Speicherorts von Servlet-bezogenen JAR-Dateien vorgenommen, die Einfluss darauf haben, wo Sie JSDK.JAR zum Kompilieren Ihrer Servlets finden:
Servlet-Unterstützung in Domino aktivieren
Servlets werden vom Domino Java Servlet Manager geladen und aufgerufen. Dieser Manager ist ein Bestandteil der HTTP-Server-Task. Die Laufzeit-Java-Unterstützung für Servlets wird von der Domino Java Virtual Machine (JVM) bereitgestellt. Wenn die HTTP-Task gestartet wird, kann sie automatisch den Servlet-Manager starten und die JVM laden. Die HTTP-Task schreibt Statusnachrichten für diese Vorgänge in die Serverkonsole und in die Protokolldatei.
Der Servlet-Manager wird über Einstellungen im Domino-Verzeichnis-Serverdokument gesteuert. Die Einstellungen befinden sich im Register "Internetprotokolle - Domino-Web-Server" des Serverdokuments. Folgende Einstellungen sind verfügbar:
Domino Servlet-Manager: Die HTTP-Task lädt die JVM und den Servlet-Manager.
Servlet-Unterstützung durch Fremdanbieter: Die HTTP-Task lädt die JVM, aber nicht den Domino Servlet-Manager. Dadurch können Servlet-Manager von Fremdanbietern verwendet werden, wie beispielsweise der WebSphere Application Server von IBM.
Beispiele:
Relativer Verzeichnispfad: domino\servlet
Absoluter Verzeichnispfad: c:\apps\MeineServlets
JAR-Datei: c:\javamail\mail.jar
ZIP-Datei: domino\servlet\sql.zip
Hinweis Die Unterstützung der HttpSession-Schnittstelle ist vollständig unabhängig von der Funktion für die HTTP-Sitzungs-Authentifizierung in Domino.
Deaktiviert: Sitzungen werden nicht auf Inaktivität hin überprüft.
Deaktiviert: (Vorgabe) Alle Sitzungsdaten werden gelöscht, wenn die HTTP-Task beendet wird.
Das Klassenladeprogramm des Servlet-Managers lädt keine Klassen, die nativen Code verwenden, benutzerdefinierte Klassenladeprogramme erstellen oder bestimmte andere eingeschränkte Operationen durchführen. Wenn Ihr Servlet eine Klasse benötigt, die nicht vom Servlet-Manager geladen werden kann, versuchen Sie, sie mit dem Klassenladeprogramm der Domino JVM zu laden. Das JVM-Ladeprogramm ist in der Regel für das Laden von Klassen aus Standard-Java-Archiven zuständig, die zusammen mit Domino installiert werden (insbesondere die java.*- und lotus.*-Pakete). Sie können erzwingen, dass ein Servlet vom JVM- anstelle des Servlet-Manager-Ladeprogramms geladen wird, indem Sie das Servlet vom Servlet-Manager-Klassenpfad in den JVM-Klassenpfad verschieben. Der JVM-Klassenpfad wird mit der NOTES.INI-Variable "JavaUserClasses" angegeben.
Tipp Sie können auch Klassen in die NOTES.INI-Datei laden, wenn eine für Ihr Servlet erforderliche Klasse Konflikte mit Klassen in der in Domino vorhandenen Datei "LotusXSL.JAR" hervorruft. Wenn Sie ein Servlet laden und ausführen und die Nachricht "Verify Error" erhalten, entfernen Sie die JAR-Dateien für das Servlet aus dem Servlet-Manager-Klassenpfad und binden Sie sie stattdessen in der JavaUserClasses-Anweisung der NOTES.INI-Datei ein.
Eigenschaften für Servlets einstellen
Spezielle Eigenschaften für einzelne Servlets können in einer Textdatei namens "servlets.properties" eingestellt werden. Diese Datei befindet sich im Domino-Data-Verzeichnis. Folgende Eigenschaften können festgelegt werden:
servlet(s).<Name>.<Eigenschaft>=<Wert(e)>
Bei Direktiven wird die Groß-/Kleinschreibung beachtet. Die Datei "servlets.properties" kann auch Leerzeilen und Kommentarzeilen enthalten, die mit dem Zeichen "#" beginnen. Die Datei "servlets.properties" ist optional. Die vorgegebenen Eigenschaften für Servlets sind: kein Alias, keine Initialisierungsargumente, keine Erweiterungszuordnung und Laden von Servlets bei Bedarf.
Servlet-Aliasnamen
Die Aliasdirektive hat folgende Syntax:
servlet.<Aliasname>.code=<Klassenname>
Beispiel:
servlet.SQLQuery.code=sql.database.query.Servlet
Als Sicherheitsmaßnahme lässt Domino keine Servlet-Namen, die Punkte enthalten, in einer Servlet-URL zu. Dadurch werden böswillige Benutzer daran gehindert, willkürlich Java-Paket-Klassen durch den Servlet-Manager zu laden. Wenn Ihr Servlet einen Paketnamen besitzt, müssen Sie ihm einen Alias zuordnen. Bei obigem Beispiel darf das servlet sql.database.query.Servlet von einer URL wie "http://acme.com/servlet/SQLQuery?Monat=Juni" aufgerufen werden. Aliasnamen sind ferner nützlich, um die tatsächlichen Namen der Servlets vor Benutzern zu verbergen.
Sie können einem Servlet mehrere Aliasnamen zuweisen. Der Servlet-Manager erstellt eine neue Instanz des Servlets, wenn er die erste URL erhält, die auf jeden Alias verweist. Er ruft die init()-Methode des Servlets auf, wenn eine neue Instanz erstellt wird. Da der Aliasname in anderen Direktiven in der Eigenschaftsdatei verwendet werden kann, können die Instanzen verschiedene Eigenschaften haben. Sie könnten beispielsweise eine separate Initialisierungsargument-Direktive für jeden Alias angeben. Da außerdem die Servlet-Klassen nur einmal geladen werden, auch wenn mehrere Instanzen erstellt werden, können die Instanzen des Servlets Daten gemeinsam durch Verwendung von statischen Klassenvariablen nutzen.
Wenn Sie einem Servlet einen Aliasnamen geben, kann aus Sicherheitsgründen nicht direkt anhand seines Klassennamens in einer URL auf das Servlet verwiesen werden. So können Sie den tatsächlichen Namen des Servlets verbergen.
Initialisierungsargumente
Sie können die Anfangsdaten eines Servlets in der Eigenschaftsdatei festlegen. Das Servlet kann mit der Methode "ServletConfig.getInitParameter" auf die Daten zugreifen. Die Initialisierungs-Direktive hat folgende Syntax:
servlet.<Alias oder Klassenname>.initArgs=<Name1=Wert1>,<Name2=Wert2>,...
Mehrere Argumente müssen durch Kommas getrennt werden. Beispiel:
servlet.SQLQuery.initArgs=target=db2,user=Domino,cacheSize=30
Zuordnung von URL-Erweiterungen
Die Zuordnungsdirektive für URL-Erweiterungen hat folgende Syntax:
servlet.<Alias oder Klassenname>.extension=<Erweiterung> <Erweiterung> ...
Sie können einem Servlet mehrere Erweiterungen zuweisen. Trennen Sie diese durch ein Leerzeichen. Alle Erweiterungen müssen auch den Einstellungen "Servlet-Dateierweiterungen" im Serverdokument hinzugefügt werden. Um beispielsweise Domino zu veranlassen, das SQLQuery-Servlet aufzurufen, wenn eine URL die Erweiterung "sql" oder "sq" enthält, fügen Sie "sql,sq" zur Servereinstellung hinzu und fügen Sie die folgende Direktive zur Eigenschaftsdatei hinzu:
servlet.SQLQuery.extension=sql sq
Dadurch kann ein Benutzer das Servlet mit einer URL wie der folgenden aufrufen:
http://acme.com/query.sql?Monat=Juni
Beim Starten laden
Standardmäßig lädt der Servlet-Manager die Klassendateien eines Servlets in den Arbeitsspeicher, wenn er zum ersten Mal eine URL empfängt, die auf das Servlet verweist. Sie können jedoch angeben, dass ein oder mehrere Servlets sofort geladen werden sollen, wenn der Servlet-Manager gestartet wird. So müssen Benutzer nicht mit Verzögerungen rechnen, wenn Servlets zum ersten Mal von URLs angefordert werden.
Die Start-Direktive hat folgende Syntax:
servlets.startup=<Alias oder Klassenname> <Alias oder Klassenname> ...
Beachten Sie, dass "servlets" im Plural steht und dass Servlet-Namen durch Leerzeichen getrennt werden müssen.
Wenn Sie einem Servlet einen oder mehrere Aliasnamen zugewiesen haben, können Sie diese zur Start-Direktive hinzufügen. Dies veranlasst den Servlet-Manager, die Servlet-Klassen zu laden und anschließend eine Instanz für jeden Alias zu erstellen.
Nachdem der Servlet-Manager die Servlet-Klassen geladen hat, bleiben diese im Arbeitsspeicher, bis die Domino-HTTP-Task vom Konsolenbefehl "tell http quit" gestoppt oder vom Konsolenbefehl "tell http restart" neu gestartet wird. Bevor er ein Servlet entlädt, ruft der Servlet-Manager die destroy-Methode für jede Instanz des Servlets auf, um ihr die Möglichkeit zu geben, Ressourcen zu löschen.
Eine Klasse, die vom JVM-Klassenladeprogramm geladen wurde, bleibt im Arbeitsspeicher, bis die HTTP-Task gestoppt wird. Der Befehl "tell http restart" führt nicht zu einem Entladen der Klasse.
Beispiel einer Eigenschaftsdatei
Folgendes Beispiel zeigt eine "servlets.properties"-Datei:
# Eigenschaften für das SQL-Servlet servlet.SQLQuery.code=sql.database.query.Servlet servlet.SQLQuery.initArgs=cache=30 servlet.SQLQuery.extension=sql # Eigenschaften für das Mail-Servlet servlet.MailServlet.initArgs=mime=enabled,smime=disabled # Beide Servlets sollen bei Start geladen werden servlets.startup=SQLQuery MailServlet # Ende der Datei Beispiel Siehe auch