Erste Schritte mit serverseitigem Java

Serverseitiges Java (SSJ), manchmal auch als Servlets oder serverseitige Applets bezeichnet, ist eine leistungsstarke Mischung aus CGI (Common Gateway Interface) und Server-API-Programmierung auf niedrigerer Ebene - wie NSAPI von Netscape und ISAPI von Microsoft.

Dieser Artikel enthält eine Einführung und schrittweise Anweisungen für die Netscape-Implementierung von serverseitigem Java, das Netscape als serverseitige Applets (SSA) bezeichnet.

SSAs können sich wie ein CGI-Skript verhalten. Es empfängt getund postfordert eine Webseite an und gibt sie zurück (normalerweise in Form von HTML), aber SSJ wird wie NSAPI / ISAPI dynamisch auf den Server geladen. Dies eliminiert die Startverzögerungen, die wir von CGI erwarten. Außerdem kann der SSJ einen Teil seines Status zwischen den Ausführungen beibehalten, z. B. eine offene Verbindung zu einer Datenbank.

SSAs werden in ihrer eigenen Sandbox ausgeführt, die die von Java erwartete Sicherheit bietet. Beispielsweise stürzt ein abstürzendes Applet nicht den gesamten Server ab, wie dies bei der NSAPI / ISAPI-Programmierung der Fall sein kann. Diese zusätzliche Sicherheit ermöglicht auch das Hochladen von Applets zur Ausführung auf dem Server - genau wie clientseitige Java-Applets zur Ausführung auf dem Client heruntergeladen werden.

Der vielleicht wichtigste Aspekt von SSAs ist, dass sie in Java geschrieben von Natur aus plattformunabhängig und objektorientiert sind.

Geschichte

Eine wachsende Anzahl von Servern unterstützt serverseitiges Java, einschließlich der Netscape FastTrack 2.0- und Enterprise 2.0-Server, des Java Web Server von JavaSoft (früher Jeeves genannt), des Jigsaw des World Wide Web Consortium, des T3Servers von WebLogic, des Webservers von Oracle und des ExpressO von Peak Technologies. Jeder dieser Server verwendet eine andere serverseitige Java-API, sodass Entwickler für jeden Server, den sie verwenden, unterschiedliche Programme schreiben müssen.

Netscape-Details: Bereiten Sie Ihren Server vor

Bevor Sie Ihr erstes serverseitiges Applet für die Server von Netscape erstellen, müssen Sie den Server vorbereiten. Die Server von Enterprise und FastTrack sind in ihrer SSA-Unterstützung identisch.

Schalten Sie zunächst den Java-Interpreter des Servers ein. Dies kann über den Server-Manager unter "Programme -> Java" erfolgen. Klicken Sie auf die Schaltfläche Ja, um den Java-Interpreter zu aktivieren. Der Server-Manager fragt Sie nach einem "Java-Applet-Verzeichnis", in dem die SSA-Unterstützungsdateien sowie der Speicherort für alle SSA-Klassendateien abgelegt werden. Es bietet einen Standardspeicherort. Auf Unix-Computern ist dies / usr / ns-home / plugins / java / applets . Auf Windows-Computern ist dies C: \ Programme \ Netscape \ Server \ Plugins \ Java \ Applets(Hinweis: In diesem Eingabefeld tendiert Netscape dazu, die Schrägstriche und Schrägstriche zu mischen und anzupassen. Keine Sorge, Netscape behandelt die beiden Schrägstriche auf die gleiche Weise.) Verwenden Sie nach Möglichkeit das Standard-Applet-Verzeichnis. Wenn Sie sich entscheiden, die Standardeinstellung anzupassen, anstatt sie zu verwenden, stellen Sie sicher, dass Sie ein Verzeichnis unter Ihrem Serverstamm auswählen und alle Dateien vom Standardspeicherort an Ihren benutzerdefinierten Speicherort kopieren. Speichern und übernehmen Sie Ihre Änderungen. Stoppen Sie den Server und starten Sie ihn erneut, damit die Änderungen wirksam werden.

Zeit zum Experimentieren!

Zu diesem Zeitpunkt sollten Sie in der Lage sein, mit den von Netscape bereitgestellten Applets zu experimentieren. Zeigen Sie mit Ihrem Browser auf // Servername / Server-Java / FormApplet? Abc = xyz & 123 = 789. Sie sollten sehen, dass die "get" -Daten vom Formular-Applet in HTML verarbeitet und zurückgegeben werden.

Wenn Sie einen Serverfehler erhalten, überprüfen Sie das Fehlerprotokoll Ihres Servers ( / usr / ns-home / httpd-Hostname / logs / error oder C: \ Programme \ Netscape \ Server \ httpd-Hostname \ logs \ error ). Wenn der Java-Interpreter nicht gestartet werden kann, ist es wahrscheinlich, dass Ihr CLASSPATH Netscape verwirrt. Versuchen Sie, den Server in einer Umgebung ohne CLASSPATH zu starten.

Ein weiteres Applet, das Sie ausprobieren sollten, ist // Servername / Server-Java / Connect; Es sollte //www.meer.net/barn/index.html laden und anzeigen. Das Connect-Applet stellt eine Socket-Verbindung her, um die Seite abzurufen. Dies kann zu einem Serverfehler führen, wenn sich Ihr Server hinter einer Firewall befindet. Nehmen wir für den nächsten Schritt an, dass eine Firewall den Socket blockiert hat. Wir bearbeiten den Connect-Applet-Code, um auf eine andere Seite auf einem anderen Webserver zuzugreifen.

Die Datei Connect.java ist im "Java-Applet-Verzeichnis" verfügbar. (Es ist auch unten zu finden.) Zuerst wird netscape.server.applet importiert. *.

import netscape.server.applet. *; 

Dieses Paket enthält die Basisklassen für die Entwicklung serverseitiger Applets. Die wichtigste Klasse in diesem Paket ist HttpAppletdie Oberklasse für alle serverseitigen Applets. Wie Sie in Connect (unten) sehen können, ist die einzige Methode, die ein serverseitiges Applet implementieren muss, die runMethode. Diese Methode wird jedes Mal aufgerufen, wenn das Applet einen "Treffer" erhält. Die runMethode für Connect öffnet einen Socket für den "Host" und ruft die "Anfrage" ab, bevor die Ausgabe an den Client umgeleitet wird. Wir möchten die Variable "host" so ändern, dass sie auf einen Computer verweist, der von unserem Webserver aus sichtbar ist. Wir möchten auch die Variable "request" so ändern, dass sie auf eine Seite auf dem neuen "host" verweist.

import netscape.server.applet. *; import java.io.PrintStream; import java.io.InputStream; import java.io.OutputStream; import java.io.DataInputStream; import java.net.Socket; Klasse Connect erweitert HttpApplet {public void run () löst eine Ausnahme aus {String host = "www.meer.net"; // ändere diesen int port = 80; String request = "GET /barn/index.html HTTP / 1.0 \ n"; // auch dies Socket s = neuer Socket (Host, Port); OutputStream os = s.getOutputStream (); PrintStream op = neuer PrintStream (os); op.println (Anfrage); InputStream ist = sam (); DataInputStream di = neuer DataInputStream (is); String line; if (returnNormalResponse ("text / html")) {PrintStream out = getOutputStream (); out.println ("& lth1 & gtData on" + host + "port" + port + ""); out.println ("Anfrage:" + Anfrage + "
   
"); while ((line = di.readLine ())! = null) out.println (line);}}}

Nachdem Sie die Änderungen "Host" und "Anforderung" vorgenommen haben, besteht der nächste Schritt darin, Connect neu zu kompilieren.

Verwenden Sie unter Windows Ihren Standard-Javac-Compiler mit dem Klassenpfad serv2_0.zip. javac -classpath ..\classes\serv2_0.zip Connect.java.

Unter Unix stellt Netscape einen Java-Compiler (javac) im Verzeichnis über dem Java-Applet-Verzeichnis bereit. Dieser Javac ist eigentlich ein Skript, das java sun.tools.javac.Mainzum Kompilieren aufruft . Auf einigen Systemen verwendet der sun.tools.javac.MainCompiler neue 1.1 JDK-Methoden wie java.lang.Character.isJavaLetterOrDigit(), was für Entwickler ohne 1.1 JDK ein ziemliches Problem darstellen kann. Eine perfekte Alternative ist die Verwendung des Standard-Javac-Compilers, den Sie immer verwendet haben javac -classpath ../classes/serv2_0.zip Connect.java. Wenn Sie das bereitgestellte Javac-Skript verwenden möchten, ersetzen Sie einfach " javac" durch " ../javac."

Möglicherweise wird während dieser Kompilierung ein Fehler angezeigt, der besagt:

Connect.java:1: Paket netscape.server.applet beim Import nicht gefunden. import netscape.server.applet. *; ^ 1 Fehler

Dieser Fehler ist kein Grund zur Sorge. Die Klassendatei wird normal erstellt und läuft einwandfrei. Sie können diesen Fehler vermeiden, wenn Sie Platzhalter in Ihren Importanweisungen entfernen.

Unter Unix stellt Netscape im Java-Applet-Verzeichnis ein Makefile für die Applet-Kompilierung bereit. Leider verwendet das Makefile den Platzhalter '%', eine mk / nmake-Erweiterung, die nicht immer verfügbar ist. Der Problemcode wird unten angezeigt.

% .class:% .java ../javac -classpath ../classes/serv2_0.zip $ *. java 

Eine Alternative ist die Verwendung einer .suffixes-Regel. Bearbeiten Sie die erste Zeile des Makefiles wie folgt:

.SUFFIXES: .java .class und ersetzen Sie die% .class-Zielzeilen durch .java.class: javac -classpath ../classes/serv2_0.zip $ < 

Möglicherweise stellen Sie fest, dass ich das entfernt ../habe, damit das Makefile den Standard-Javac-Compiler aufruft. Um dieses neue Makefile zu testen, speichern Sie die Datei Connect.java erneut und versuchen Sie es mit einem "make".

Wenn Sie jetzt die Seite // Servername / Server-Java / Connect neu laden würden, würden Sie immer noch die Seite "Scheune" sehen. Dies liegt daran, dass die Java-Klassen beim Start über eine Init-Funktion in der Datei obj.conf auf den Server geladen werden. Um die neuen Änderungen zu laden, müssen Sie den Server stoppen und dann erneut starten. Auf einigen Systemen müssen Sie den Server-Manager zum Stoppen und Starten verwenden. Befehlszeilen-Neustarts führen manchmal zu einem "Serverfehler" für nachfolgende Applet-Anforderungen. Versuchen Sie das Connect-Applet erneut, nachdem Sie den Server gestoppt und gestartet haben. Netscape sollte den neuen Connect-Code geladen haben, um die ausgewählte Seite anzuzeigen.

Let's get serious about API

Congratulations! You`ve just compiled and tested your first server-side Java code. Now to give a few of the methods available to you.

With the following methods you can do the majority of your work:

PrintStream getOutputStream() throws IOException; 

returns a PrintStream, which you can use to print your response to the client. It replaces System.out.

Hashtable getFormData() throws IOException; 

returns a Hashtable storing the name-value pairs of the HTTP request. The value strings are decoded from their URI-encoded form. It throws an IOException if there is no form data.

String getFormField(String fieldName) throws IOException; 

You can use getFormField for retrieving just one field. It too throws an IOException if there is no form data.

boolean returnNormalResponse(String contentType) throws IOException; 

starts an HTTP response with the content type set as you specify with its parameter. It returns true if this was a "get" or "post" request and false if it was a "head" request.

public boolean returnErrorResponse(String contentType, int status, String reason) throws IOException public boolean returnErrorResponse(String contentType, int status) throws IOException 

starts an HTTP response to report an error. It takes a content type, a status (such as HttpApplet.BAD_REQUEST, which represents the standard error code 400), and an optional string giving the reason for the error.

There are dozens of other methods you can use in the development of your server-side applets. Netscape installs an API guide with its servers. You can find the guide at /usr/ns-home/bin/httpd/admin/html/manual/pg/javapi.htm under Unix or at C:\Program Files\Netscape\Server\bin\httpd\admin\html\manual\pg\javapi.htm under Windows.

Hello World!

Now let's use everything we've learned to write the (you guessed it!) Hello World server-side applet. The following applet says hello to World unless a target field is given -- in which case it says hello to the target instead.

import netscape.server.applet.HttpApplet; import java.io.IOException; import java.io.PrintStream; class Hello extends HttpApplet { /* By default, we say hello to "World" */ String helloTarget = "World"; /* run() is invoked to handle the request */ public void run() throws Exception { /* getOutputStream() allows us to talk to the client */ PrintStream out = getOutputStream(); /* Use getFormField() to find out if we are to say hello to * someone other than "World". */ String formTarget = null; try { formTarget = getFormField("target"); if (formTarget != null) { helloTarget = formTarget; } } catch (IOException e) { /* We'll ignore exceptions caused by a "missing query string" */ if (! e.getMessage().startsWith("missing query string")) { handleException(e, out); } } /* Say the hello */ if (returnNormalResponse("text/html")) { try { out.println("Hello, " + helloTarget + "!"); } catch (Exception e) { handleException(e, out); } } } private void handleException(Exception e, PrintStream out) { try { returnErrorResponse("text/html", SERVER_ERROR, "Exception thrown"); } catch (IOException ioe) {} // try to print original exception out.print("&lth1>"); out.print(e); out.print("\n"); out.print("&ltpre>"); e.printStackTrace(out); // alternative PrintStream must be specified out.print("
"); Rückkehr; } }

Dieses serverseitige Applet untergeordnet zu netscape.server.applet.HttpApplet und überschreibt die run()Methode wie alle serverseitigen Applets unter Netscape. Es erhält schnell seinen Ausgabestream mit einem Aufruf von getOutputStream, mit dem es das "Hallo" druckt (oder den Grund für einen Fehler druckt). Es ruft getFormFieldauf, um zu überprüfen, ob ein alternatives Ziel zu verwenden ist, gibt dann eine normale "Text / HTML" -Antwort zurück und erledigt schließlich die eigentliche Arbeit des Druckens von "Hallo". Beachten Sie, dass der Rückgabewert des returnNormalResponse()Aufrufs überprüft wird und nichts unternommen wird, wenn false zurückgegeben wird. Wenn Sie dies nicht tun, geben Sie Daten auch für headAnfragen zurück.