ANWENDUNGSGESTALTUNG


Servlets in Domino ausführen
Beispiel

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:

Sun aktualisiert JDK und JSDK regelmäßig. Lotus Domino Designer R6 unterstützt JDK 1.3 und JSDK 2.0. Die QMR-Versionen von Domino (Domino Quarterly Maintenance Releases) enthalten häufig Aktualisierungen von Sun. Daher sollten Sie die QMR-Versionshinweise prüfen, um festzustellen, welche JDK- und JSDK-Versionen unterstützt werden.

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:

EinstellungOptionen
Unterstützung von Java-ServletsKeine: (Vorgabe) Die HTTP-Task lädt nicht den Servlet-Manager oder die JVM.

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.

Servlet-URL-PfadDer Pfad in einer URL, der Domino mitteilt, dass die URL auf ein Servlet verweist. Die Vorgabe ist "/servlet".
KlassenpfadEine Liste mit einem oder mehreren Pfaden, anhand derer das Klassenladeprogramm des Servlet-Managers nach Servlets und ihren abhängigen Klassen sucht. Mit dieser Einstellung können Sie weitere Pfade hinzufügen. Sie können Verzeichnisse, JAR-Dateien und ZIP-Dateien angeben. Pfade können absolut oder relativ zum Domino-Data-Verzeichnis sein. Die Vorgabe ist "domino\servlet".

Beispiele:

Relativer Verzeichnispfad: domino\servlet

Absoluter Verzeichnispfad: c:\apps\MeineServlets

JAR-Datei: c:\javamail\mail.jar

ZIP-Datei: domino\servlet\sql.zip

Servlet-DateierweiterungenEine Liste mit URL-Dateierweiterungen, die Domino signalisieren, dass eine URL auf ein Servlet verweist. Jede Erweiterung in der Liste muss in der Datei "servlets.properties" durch eine Direktive einem bestimmten Servlet zugeordnet sein. Es sind keine Erweiterungen vorgegeben.
Die folgenden Einstellungen steuern die Laufzeit-Unterstützung der Java-Servlet-API-HttpSession-Schnittstelle des Domino Servlet-Managers. Ein Servlet, das diese Schnittstelle nicht verwendet, ist von diesen Einstellungen nicht betroffen.

Hinweis Die Unterstützung der HttpSession-Schnittstelle ist vollständig unabhängig von der Funktion für die HTTP-Sitzungs-Authentifizierung in Domino.
EinstellungOptionen
Sitzungsstatus verfolgenAktiviert: (Vorgabe) Der Servlet-Manager prüft regelmäßig die Benutzeraktivität aller HttpSession-Instanzen. Sitzungen, die sich für eine bestimmte Zeit "im Leerlauf" befanden, werden automatisch beendet. Der Servlet-Manager ruft die Methode "HttpSession.invalidate()" auf, um dem Servlet mitzuteilen, dass die Sitzung beendet wird.

Deaktiviert: Sitzungen werden nicht auf Inaktivität hin überprüft.

Zeitlimit für inaktive SitzungenDie Anzahl der Minuten, in der keine Benutzeraktivitäten stattfanden, bevor eine Sitzung beendet wird. Die Vorgabe ist 30 Minuten.
Maximale Anzahl aktiver SitzungenDie Anzahl der gleichzeitig zulässigen aktiven Sitzungen. Die Vorgabe ist 1.000 Sitzungen. Wenn diese Grenze erreicht ist, werden die Sitzungen beendet, die sich am längsten im Leerlauf befanden.
SitzungsfortbestandAktiviert: Wenn die HTTP-Task beendet wird, speichert der Servlet-Manager die Sitzungsdaten in einer Datei namens "sessdata.ser" im Domino-Data-Verzeichnis. Die Sitzungsdaten werden neu geladen, wenn die HTTP-Task wieder gestartet wird. Objekte, die das Servlet an Sitzungen gebunden hat, werden ebenfalls gespeichert, wenn sie die java.io.Serializable-Schnittstelle implementieren.

Deaktiviert: (Vorgabe) Alle Sitzungsdaten werden gelöscht, wenn die HTTP-Task beendet wird.


Servlet-Klassen mit dem JVM-Ladeprogramm laden

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:


Diese Eigenschaften werden durch Direktiven in der Datei "servlets.properties" festgelegt. Die allgemeine Syntax einer Direktive lautet wie folgt:

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