Skriv CGI-program i Java

Common Gateway Interface (CGI) är en standard för att skriva program som kan interagera via en webbserver med en klient som kör en webbläsare. Dessa program tillåter en webbutvecklare att leverera dynamisk information (vanligtvis i form av HTML) via webbläsaren. Ett CGI-program kan skrivas på vilket språk som helst, inklusive Java, som kan köras av din webbserver. CGI-program används ofta för att lägga till sökmotorer, applikationer för gästböcker, databasfrågemotorer, interaktiva användarforum och andra interaktiva applikationer till webbplatser.

I mycket grundläggande termer måste ett CGI-program tolka informationen som skickas till den, bearbeta informationen på något sätt och generera ett svar som kommer att skickas tillbaka till klienten.

Det mesta av inmatningen till ett CGI-program skickas till det via miljövariabler. Den här artikeln visar hur du skickar dessa miljövariabler till ett Java CGI-program. Resten av ingången (om någon) skickas till ett CGI-program som standardingång som kan läsas direkt av ditt program.

Behandlingen kan vara så enkel som att lägga till information i en fil eller så komplicerad som att begära data från en databas.

Eftersom ett CGI-program kan returnera en myriad av dokumenttyper måste ett CGI-program placera en kort rubrik (ASCII-text) på dess utdata så att klienten vet hur man tolkar informationen som genereras. Vanligtvis genererar CGI-program HTML. Nedan hittar du ett bibliotek med funktioner inklusive ett som genererar lämplig rubrik för HTML. Efter rubriken genererar ett CGI-program helt enkelt utmatningens kropp i sin ursprungliga form.

Skicka CGI-miljön till Java-programmet

Att skriva ett CGI-program i Java är ganska enkelt att göra när du förstår problemen. Först och främst måste du slå in körningen av Java-programmet i ett annat skript. Så det faktiska skriptet som anropas på din webbserver kommer att vara ett Unix-skalskript eller en Windows-batchfil (eller motsvarande) som helt enkelt skickar CGI-miljövariablerna till ditt Java-program.

Eftersom Java inte längre tillhandahåller en metod för att komma åt miljövariabler direkt ( System.getenv()metoden har inaktiverats i den senaste versionen av JDK) föreslår jag att du skickar varje CGI-miljövariabel till Java-programmet med -D-kommandoradsparametern på Java-tolk . Jag visar dig hur du använder -D-parametern nedan.

Funktionsbiblioteket jag tillhandahåller nedan förutsätter att du har använt den metod som beskrivs ovan; den använder System.getProperty()metoden för att komma åt dessa kommandoradsparametrar. Om ditt program behöver använda någon av CGI-miljövariablerna kan du komma åt dem på samma sätt. Om du till exempel vill komma åt miljövariabeln SERVER_NAME kan du göra det enligt följande:

 Sträng server_name = System.getProperty ("cgi.server_name"); 

Var medveten om att jag inte överför alla CGI-miljövariablerna till mitt Java-program. Jag passerar bara de större. Jag lämnar inkluderingen av de andra som en övning för läsaren.

Följande exempel visar en Unix-skriptfil som kallas att hello.cgianropa ett Java-program som heter hello. Observera att -D-kommandoradsparametern skickar CGI-miljövariablerna till Java-programmet:

#! / bin / sh java -Dcgi.content_type = $ CONTENT_TYPE -Dcgi.content_length = $ CONTENT_LENGTH -Dcgi.request_method = $ REQUEST_METHOD -Dcgi.query_string = $ QUERY_STRING -Dcgi.server_name $ SERVER_name = SERVAR_NAMN Dcgi.script_name = $ SCRIPT_NAME -Dcgi.path_info = $ PATH_INFO hej 

Denna lösning fungerar inte bra på Windows 95- och NT-plattformarna eftersom det kan finnas begränsningar för antalet tecken som tillåts på kommandoraden. Ett alternativt tillvägagångssätt kan vara att skriva var och en av miljövariablerna och deras tillhörande värden till en tillfällig fil (med ett unikt filnamn, naturligtvis). Sedan kan du skicka namnet på den här filen till ditt Java-program och låta den läsa den filen och analysera miljövariabel / värdepar. Glöm inte att ta bort den tillfälliga filen när du är klar med att använda den! Återigen lämnas denna övning åt läsaren.

Ett Java CGI-bibliotek

För att underlätta den tråkiga uppgiften att bearbeta CGI-ingångarna har jag skrivit en Java-klass (verkligen ett bibliotek med funktioner) som du kan använda för att skära ner på något av det smutsiga arbetet. Detta bibliotek försöker duplicera funktionaliteten i det mycket populära Perl- cgi-lib.plbiblioteket. Jag har dokumenterat koden nedan med hjälp av kommentarer i javadoc-stil så att du kan generera HTML-dokumentation direkt från koden. (Använd för javadoc cgi_lib.javaatt generera cgi_lib.html.)

Här är källkoden och dokumentationen för biblioteket.

Skriva ditt första Java CGI-program

Här är ett exempel som visar hur cgi_lib.javabiblioteket kan användas för att skriva ett CGI-program. Vi skriver ett enkelt program som behandlar mitt "Hello There" -formulär. Detta enkla formulär uppmanar användaren att ange ett namn och en e-postadress. Här är formuläret ( hello.html) som vi vill bearbeta:

& ltHTML> & ltHEAD> & ltTITLE & gt Hej och välkommen! & ltBODY> & ltH1 ALIGN = CENTER & gtHello och välkommen & lthr> & ltFORM METOD = "POST" ACTION = "/ cgi-bin / hello.cgi"> Vad heter du? & ltINPUT TYPE = "text" NAME = "name"> & ltp> Vad är din e-postadress? & ltINPUT SIZE = 40 TYPE = "text" NAME = "e-post"> & ltINPUT TYPE = "skicka" VALUE = "Skicka">. & ltP> & lthr>

Låt oss skriva ett Java-program för att bearbeta "Hello There" -formuläret.

Först måste vi meddela klienten att vårt program kommer att generera HTML. Den Header()metod cgi_lib.javaskapar strängen vi behöver, så vi börjar genom att anropa denna metod och skicka strängen till standard ut med hjälp av System.out.printlnsystemanrop.

// // Skriv ut önskad CGI-rubrik. // System.out.println (cgi_lib.Header ());

För det andra vill vi bearbeta formulärdata som skickas till oss av webbläsaren. Den ReadParsemetod cgi_lib.javagör allt detta arbete för oss och returnerar resultatet i en instans av en Hashtable. I det här fallet innehåller Hashtable två nyckelvärden efter analys av formulärdata. En kommer att vara inmatningsfältet "namn" och det andra inmatningsfältet "e-post". Värdena som är associerade med var och en av dessa nycklar kommer att vara vad användaren skrev i dessa inmatningsfält i "Hej där" -formuläret.

// // Analysera formulärdata till en Hashtable. // Hashtable form_data = cgi_lib.ReadParse (System.in);

Nu när vi har analyserat formulärdata kan vi göra den bearbetning vi vill med de data som skickas till oss. Sedan kan vi generera lite HTML för att skicka tillbaka till användarens webbläsare. I det här enkla programmet kommer vi inte att göra någon bearbetning med data; vi kommer helt enkelt att återge informationen från användaren. Vi kommer att använda getmetoden på Hashtable-objektet för att extrahera formvärdena i strängar som vi kan använda i vårt program. Följande exempel visar hur vi skulle extrahera namnet som användaren skrev i ett String-objekt.

 Strängnamn = (Sträng) form_data.get ("namn"); 

Låt oss nu sätta ihop allt detta i ett enkelt program. Här är ett Java-program som vi kan använda för att bearbeta formuläret "Hej där" ( hello.java):

importera java.util. *; importera java.io. *; klass hej {public static void main (String args []) {// // Här är ett minimalistiskt CGI-program som använder cgi_lib // // // Skriv ut önskad CGI-rubrik. // System.out.println (cgi_lib.Header ()); // // Analysera formulärdata till en Hashtable. // Hashtable form_data = cgi_lib.ReadParse (System.in); // // Skapa toppen av den returnerade HTML-sidan // Strängnamn = (Sträng) form_data.get ("namn"); System.out.println (cgi_lib.HtmlTop ("Hej där" + namn + "!"); System.out.println ("& lth1 align = center & gtHello där" + namn + "!"); System.out.println ("Här är namnet / värdeparen från formuläret:"); // // Skriv ut namnet / värdeparen som skickas från webbläsaren. // System.out.println (cgi_lib.Variables (form_data));// // Skriv ut miljövariablerna som skickats in från Unix-skriptet. // System.out.println ("Här är CGI-miljövariabler / värdepar" + "skickade in från UNIX-skriptet:"); System.out.println (cgi_lib.Environment ()); // // Skapa botten av den returnerade HTML-sidan för att stänga den rent. // System.out.println (cgi_lib.HtmlBot ()); }}

Slutsats

Med denna introduktion till CGI-programmering i Java borde du vara på väg till ett helt nytt sätt att programmera serversidan av dina webbapplikationer. Tänk på att CGI-protokollet bara ger ett sätt att kommunicera mellan en klientwebbläsare och en webbserver. World Wide Web Consortiums pussel (se avsnittet Resurser nedan) och andra som Sun's Jeeves, kommer med bättre lösningar, som innebär att du skriver Java-servlets som du kan hänga av din webbserver. Men det är ett ämne för en annan dag. Ha så kul!

Pat Durante är senior mjukvaruutvecklare vid TASC, Inc. i Reading, MA. TASC är ett 00 miljoner tillämpat IT-företag som specialiserar sig på utveckling och integration av avancerade informationssystem och tjänster. Pat har konstruerat objektorienterade applikationer i fyra år. Han är ledare för TASCs Object Oriented Special Interest Group och medgrundare av TASCs Java Interest Group. Pats webbplatsadress är: //members.aol.com/durante.

Läs mer om detta ämne

  • Information om Common Gateway Interface (CGI) finns på:

    //hoohoo.ncsa.uiuc.edu/cgi

  • World Wide Web Consortiums pussel beskrivs på:

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

  • För mer information om Sun's Jeeves, se:

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

Denna berättelse, "Skriv CGI-program i Java" publicerades ursprungligen av JavaWorld.