Schreiben Sie CGI-Programme in Java

Das Common Gateway Interface (CGI) ist ein Standard zum Schreiben von Programmen, die über einen Webserver mit einem Client interagieren können, auf dem ein Webbrowser ausgeführt wird. Mit diesen Programmen kann ein Webentwickler dynamische Informationen (normalerweise in Form von HTML) über den Browser bereitstellen. Ein CGI-Programm kann in jeder Sprache geschrieben werden, einschließlich Java, die von Ihrem Webserver ausgeführt werden kann. CGI-Programme werden häufig verwendet, um Suchmaschinen, Gästebuchanwendungen, Datenbankabfrage-Engines, Foren für interaktive Benutzer und andere interaktive Anwendungen zu Websites hinzuzufügen.

Grundsätzlich muss ein CGI-Programm die an es gesendeten Informationen interpretieren, die Informationen auf irgendeine Weise verarbeiten und eine Antwort generieren, die an den Client zurückgesendet wird.

Der größte Teil der Eingabe in ein CGI-Programm wird über Umgebungsvariablen an dieses übergeben. Dieser Artikel zeigt, wie diese Umgebungsvariablen an ein Java CGI-Programm gesendet werden. Der Rest der Eingabe (falls vorhanden) wird als Standardeingabe an ein CGI-Programm übergeben, das direkt von Ihrem Programm gelesen werden kann.

Die Verarbeitung kann so einfach wie das Anhängen von Informationen an eine Datei oder so komplex wie das Anfordern von Daten aus einer Datenbank sein.

Da ein CGI-Programm eine Vielzahl von Dokumenttypen zurückgeben kann, muss ein CGI-Programm einen kurzen Header (ASCII-Text) in seine Ausgabe einfügen, damit der Client weiß, wie die von ihm generierten Informationen zu interpretieren sind. Am häufigsten generieren CGI-Programme HTML. Im Folgenden finden Sie eine Bibliothek mit Funktionen, einschließlich einer, die den entsprechenden Header für HTML generiert. Nach dem Header generiert ein CGI-Programm einfach den Hauptteil der Ausgabe in seiner nativen Form.

Übergabe der CGI-Umgebung an das Java-Programm

Das Schreiben eines CGI-Programms in Java ist ziemlich einfach, sobald Sie die Probleme verstanden haben. In erster Linie müssen Sie die Ausführung des Java-Programms in ein anderes Skript einbinden. Das eigentliche Skript, das auf Ihrem Webserver aufgerufen wird, ist also ein Unix-Shell-Skript oder eine Windows-Batchdatei (oder eine gleichwertige Datei), die die CGI-Umgebungsvariablen einfach an Ihr Java-Programm übergibt.

Da Java keine Methode mehr bietet, um direkt auf Umgebungsvariablen zuzugreifen (die System.getenv()Methode wurde in der neuesten Version des JDK deaktiviert), schlage ich vor, jede CGI-Umgebungsvariable mithilfe des Befehlszeilenparameters -D auf dem Java-Interpreter an das Java-Programm zu übergeben . Ich werde Ihnen unten zeigen, wie Sie den Parameter -D verwenden.

In der unten aufgeführten Funktionsbibliothek wird davon ausgegangen, dass Sie den oben beschriebenen Ansatz verwendet haben. Es verwendet die System.getProperty()Methode, um auf diese Befehlszeilenparameter zuzugreifen. Wenn Ihr Programm eine der CGI-Umgebungsvariablen verwenden muss, können Sie auf dieselbe Weise darauf zugreifen. Wenn Sie beispielsweise auf die Umgebungsvariable SERVER_NAME zugreifen möchten, können Sie dies wie folgt tun:

 String server_name = System.getProperty ("cgi.server_name"); 

Beachten Sie, dass ich nicht alle CGI-Umgebungsvariablen an mein Java-Programm übergebe. Ich komme nur an den großen vorbei. Ich überlasse die Einbeziehung der anderen als Übung dem Leser.

Das folgende Beispiel zeigt eine Unix-Skriptdatei namens hello.cgiAufrufen eines Java-Programms namens hello. Beachten Sie, dass der Befehlszeilenparameter -D die CGI-Umgebungsvariablen an das Java-Programm übergibt:

#! / bin / sh java -Dcgi.content_type = $ CONTENT_TYPE -Dcgi.content_length = $ CONTENT_LENGTH -Dcgi.request_method = $ REQUEST_METHOD -Dcgi.query_string = $ QUERY_STRING -Dver_ser_ Dcgi.script_name = $ SCRIPT_NAME -Dcgi.path_info = $ PATH_INFO Hallo 

Diese Lösung funktioniert auf den Windows 95- und NT-Plattformen nicht gut, da die Anzahl der in der Befehlszeile zulässigen Zeichen möglicherweise begrenzt ist. Ein alternativer Ansatz könnte einfach darin bestehen, jede der Umgebungsvariablen und ihre zugehörigen Werte in eine temporäre Datei zu schreiben (natürlich mit einem eindeutigen Dateinamen). Anschließend können Sie den Namen dieser Datei an Ihr Java-Programm übergeben und diese Datei lesen lassen und die Umgebungsvariablen / Wert-Paare analysieren. Vergessen Sie nicht, die temporäre Datei zu löschen, wenn Sie damit fertig sind! Auch diese Übung bleibt dem Leser überlassen.

Eine Java CGI Bibliothek

Um die mühsame Verarbeitung der CGI-Eingaben zu vereinfachen, habe ich eine Java-Klasse (eigentlich eine Bibliothek von Funktionen) geschrieben, mit der Sie einige der schmutzigen Arbeiten reduzieren können. Diese Bibliothek versucht, die Funktionalität in der sehr beliebten Perl- cgi-lib.plBibliothek zu duplizieren . Ich habe den folgenden Code mit Kommentaren im Javadoc-Stil dokumentiert, damit Sie HTML-Dokumentation direkt aus dem Code generieren können. ( javadoc cgi_lib.javaZum Generieren verwenden cgi_lib.html.)

Hier finden Sie den Quellcode und die Dokumentation für die Bibliothek.

Schreiben Sie Ihr erstes Java CGI-Programm

Hier ist ein Beispiel, das zeigt, wie die cgi_lib.javaBibliothek zum Schreiben eines CGI-Programms verwendet werden kann. Wir werden ein einfaches Programm schreiben, das mein "Hallo" -Formular verarbeitet. Dieses einfache Formular fordert den Benutzer zur Eingabe eines Namens und einer E-Mail-Adresse auf. Hier ist das Formular ( hello.html), das wir verarbeiten möchten:

& ltHTML> & ltHEAD> & ltTITLE & gtHallo und Willkommen! & ltBODY> & ltH1 ALIGN = CENTER & gtHello und Willkommen & lthr> & ltFORM METHOD = "POST" ACTION = "/ cgi-bin / hello.cgi"> Wie heißt du? & ltINPUT TYPE = "text" NAME = "name"> & ltp> Wie lautet Ihre E-Mail-Adresse? & ltINPUT SIZE = 40 TYPE = "text" NAME = "email"> & ltINPUT TYPE = "submit" VALUE = "Submit">. & ltP> & lthr>

Schreiben wir ein Java-Programm, um das Formular "Hallo" zu verarbeiten.

Zuerst müssen wir den Client wissen lassen, dass unser Programm HTML generiert. Die Header()Methode in cgi_lib.javaerstellt die Zeichenfolge, die wir benötigen. Wir beginnen also damit, diese Methode aufzurufen und die Zeichenfolge mithilfe des System.out.printlnSystemaufrufs an standard out zu senden .

// // Den erforderlichen CGI-Header drucken. // System.out.println (cgi_lib.Header ());

Zweitens möchten wir die vom Browser an uns gesendeten Formulardaten verarbeiten. Die ReadParseMethode in cgi_lib.javaerledigt alles, was für uns funktioniert, und gibt das Ergebnis in einer Instanz einer Hashtabelle zurück. In diesem Fall enthält die Hashtabelle nach dem Parsen der Formulardaten zwei Schlüsselwerte. Eines ist das Eingabefeld "Name" und das andere das Eingabefeld "E-Mail". Die mit jedem dieser Schlüssel verknüpften Werte entsprechen den Werten, die der Benutzer in diese Eingabefelder im Formular "Hallo" eingegeben hat.

// // Analysiere die Formulardaten in eine Hashtabelle. // Hashtable form_data = cgi_lib.ReadParse (System.in);

Nachdem wir die Formulardaten analysiert haben, können wir mit den an uns gesendeten Daten jede gewünschte Verarbeitung durchführen. Dann können wir HTML generieren, um es an den Browser des Benutzers zurückzusenden. In diesem einfachen Programm werden wir keine Verarbeitung mit den Daten durchführen. Wir werden einfach die vom Benutzer bereitgestellten Informationen zurückgeben. Wir werden die getMethode für das Hashtable-Objekt verwenden, um die Formularwerte in Zeichenfolgen zu extrahieren, die wir in unserem Programm verwenden können. Das folgende Beispiel zeigt, wie wir den Namen extrahieren, den der Benutzer in ein String-Objekt eingegeben hat.

 String name = (String) form_data.get ("name"); 

Lassen Sie uns dies alles in einem einfachen Programm zusammenfassen. Hier ist eine Java-Anwendung, mit der wir das Formular "Hallo" (( hello.java)) verarbeiten können:

import java.util. *; import java.io. *; Klasse Hallo {public static void main (String args []) {// // Hier ist ein minimalistisches CGI-Programm, das cgi_lib verwendet // // // Den erforderlichen CGI-Header drucken. // System.out.println (cgi_lib.Header ()); // // Analysiere die Formulardaten in eine Hashtabelle. // Hashtable form_data = cgi_lib.ReadParse (System.in); // // Erstelle den Anfang der zurückgegebenen HTML-Seite // String name = (String) form_data.get ("name"); System.out.println (cgi_lib.HtmlTop ("Hallo" + Name + "!")); System.out.println ("& lth1 align = center & gtHello There" + name + "!"); System.out.println ("Hier sind die Name / Wert-Paare aus dem Formular:"); // // Drucke die vom Browser gesendeten Name / Wert-Paare. // System.out.println (cgi_lib.Variables (form_data));// // Drucke die vom Unix-Skript gesendeten Umgebungsvariablen. // System.out.println ("Hier sind die CGI-Umgebungsvariablen / Wertepaare" + ", die vom UNIX-Skript übergeben wurden:"); System.out.println (cgi_lib.Environment ()); // // Erstelle den unteren Rand der zurückgegebenen HTML-Seite, um sie sauber zu schließen. // System.out.println (cgi_lib.HtmlBot ()); }}

Fazit

Mit dieser Einführung in die CGI-Programmierung in Java sollten Sie auf dem Weg zu einer völlig neuen Art der Programmierung der Serverseite Ihrer Webanwendungen sein. Beachten Sie, dass das CGI-Protokoll nur eine Möglichkeit zur Kommunikation zwischen einem Client-Browser und einem Webserver bietet. Das Jigsaw des World Wide Web Consortium (siehe Abschnitt Ressourcen unten) und andere wie Suns Jeeves entwickeln bessere Lösungen, bei denen Java-Servlets geschrieben werden, die Sie von Ihrem Webserver hängen können. Aber das ist ein Thema für einen anderen Tag. Habe Spaß!

Pat Durante ist Senior Software Engineer bei TASC, Inc. in Reading, MA. TASC ist ein 00 Millionen Unternehmen für angewandte Informationstechnologie, das sich auf die Entwicklung und Integration fortschrittlicher Informationssysteme und -dienste spezialisiert hat. Pat entwickelt seit vier Jahren objektorientierte Anwendungen. Er ist Leiter der objektorientierten Interessengruppe von TASC und Mitbegründer der Java-Interessengruppe von TASC. Die Website-Adresse von Pat lautet: //members.aol.com/durante.

Erfahren Sie mehr über dieses Thema

  • Informationen zum Common Gateway Interface (CGI) finden Sie unter:

    //hoohoo.ncsa.uiuc.edu/cgi

  • Das Puzzle des World Wide Web Consortium wird beschrieben unter:

    //www.w3.org/pub/WWW/Jigsaw

  • Weitere Informationen zu Sun's Jeeves finden Sie unter:

    //www.javasoft.com/products/jeeves/index.html

Diese Geschichte "Schreiben Sie CGI-Programme in Java" wurde ursprünglich von JavaWorld veröffentlicht.