Programmering

Skriv CGI-programmer i Java

Common Gateway Interface (CGI) er en standard til skrivning af programmer, der kan interagere via en webserver med en klient, der kører en webbrowser. Disse programmer giver en webudvikler mulighed for at levere dynamisk information (normalt i form af HTML) via browseren. Et CGI-program kan skrives på ethvert sprog, inklusive Java, der kan udføres af din webserver. CGI-programmer bruges almindeligvis til at føje søgemaskiner, gæstebogapplikationer, databaseforespørgselsmotorer, interaktive brugerfora og andre interaktive applikationer til websteder.

Meget grundlæggende skal et CGI-program fortolke de oplysninger, der sendes til det, behandle oplysningerne på en eller anden måde og generere et svar, der sendes tilbage til klienten.

Det meste af input til et CGI-program sendes til det gennem miljøvariabler. Denne artikel viser, hvordan man sender disse miljøvariabler til et Java CGI-program. Resten af ​​input (hvis nogen) sendes til et CGI-program som standard input, der kan læses direkte af dit program.

Behandlingen kan være så enkel som at tilføje oplysninger til en fil eller så kompliceret som at anmode om data fra en database.

Da et CGI-program kan returnere et utal af dokumenttyper, skal et CGI-program placere en kort overskrift (ASCII-tekst) på dets output, så klienten ved, hvordan den skal fortolke den information, den genererer. Mest almindeligt genererer CGI-programmer HTML. Nedenfor finder du et bibliotek med funktioner inklusive et, der genererer den passende overskrift til HTML. Efter overskriften genererer et CGI-program simpelthen outputteksten i sin oprindelige form.

At overføre CGI-miljøet til Java-programmet

At skrive et CGI-program i Java er ret let at gøre, når du først har forstået problemerne. Først og fremmest skal du pakke udførelsen af ​​Java-programmet ind i et andet script. Så det faktiske script, der påberåbes på din webserver, vil være et Unix-shell-script eller en Windows-batchfil (eller tilsvarende), der simpelthen sender CGI-miljøvariablerne til dit Java-program.

Da Java ikke længere giver en metode til at få adgang til miljøvariabler direkte ( System.getenv () metode er blevet deaktiveret i den seneste udgivelse af JDK), foreslår jeg, at hver CGI-miljøvariabel overføres til Java-programmet ved hjælp af -D kommandolinjeparameteren på Java-tolken. Jeg viser dig, hvordan du bruger -D-parameteren nedenfor.

Biblioteket med funktioner, jeg giver nedenfor, antager, at du har brugt fremgangsmåden beskrevet ovenfor; det bruger System.getProperty () metode til at få adgang til disse kommandolinjeparametre. Hvis dit program skal bruge en af ​​CGI-miljøvariablerne, kan du få adgang til dem på samme måde. Hvis du f.eks. Vil have adgang til SERVER_NAME-miljøvariablen, kan du gøre det som følger:

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

Vær opmærksom på, at jeg ikke passerer alle af CGI-miljøvariablerne i mit Java-program. Jeg passerer kun de store. Jeg overlader inddragelsen af ​​de andre som en øvelse for læseren.

Følgende eksempel viser en Unix-scriptfil kaldet hej.cgi påkaldte et Java-program kaldet Hej. Bemærk, at -D kommandolinjeparameteren overfører CGI-miljøvariablerne til 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 $ SERVAR_name = SERVER_NAVN = server Dcgi.script_name = $ SCRIPT_NAME -Dcgi.path_info = $ PATH_INFO hej 

Denne løsning fungerer ikke godt på Windows 95- og NT-platforme, fordi der kan være begrænsninger på antallet af tegn, der er tilladt på kommandolinjen. En alternativ tilgang kan være simpelthen at skrive hver af miljøvariablerne og deres tilknyttede værdier til en midlertidig fil (med et unikt filnavn, selvfølgelig). Derefter kan du sende navnet på denne fil til dit Java-program og få den til at læse den fil og analysere miljøvariabler / værdipar. Glem ikke at slette den midlertidige fil, når du er færdig med at bruge den! Igen overlades denne øvelse til læseren.

Et Java CGI-bibliotek

For at lette den kedelige opgave at behandle CGI-input har jeg skrevet en Java-klasse (virkelig et bibliotek med funktioner), som du kan bruge til at skære ned på noget af det beskidte arbejde. Dette bibliotek forsøger at duplikere funktionaliteten i den meget populære Perl cgi-lib.pl bibliotek. Jeg har dokumenteret koden nedenfor ved hjælp af kommentarer i javadoc-stil, så du kan generere HTML-dokumentation direkte fra koden. (Brug javadoc cgi_lib.java at generere cgi_lib.html.)

Her er kildekoden og dokumentationen til biblioteket.

Skriv dit første Java CGI-program

Her er et eksempel, der viser, hvordan cgi_lib.java bibliotek kan bruges til at skrive et CGI-program. Vi skriver et simpelt program, der behandler min "Hello There" -formular. Denne enkle formular vil bede brugeren om et navn og en e-mail-adresse. Her er formularen (hej.html) som vi vil behandle:

& ltHTML> & ltHEAD> & ltTITLE & gt Hej og velkommen! & ltBODY> & ltH1 ALIGN = CENTER & gt Hej og velkommen & lthr> & ltFORM METHOD = "POST" ACTION = "/ cgi-bin / hello.cgi"> Hvad hedder du? & ltINPUT TYPE = "text" NAME = "name"> & ltp> Hvad er din e-mail-adresse? & ltINPUT SIZE = 40 TYPE = "text" NAME = "email"> & ltINPUT TYPE = "send" VALUE = "Submit" & gt. & ltP> & lthr>

Lad os skrive et Java-program til at behandle "Hello There" -formularen.

Først skal vi fortælle klienten, at vores program genererer HTML. Det Header() metode i cgi_lib.java opretter den streng, vi har brug for, så vi starter med at kalde den metode og sende strengen til standard ud ved hjælp af System.out.println systemopkald.

 // // Udskriv det krævede CGI-overskrift. // System.out.println (cgi_lib.Header ()); 

For det andet ønsker vi at behandle de formulardata, der sendes til os af browseren. Det ReadParse metode i cgi_lib.java fungerer alt det der fungerer for os og returnerer resultatet i en instans af en Hashtable. I dette tilfælde indeholder Hashtable to nøgleværdier efter parsing af formulardata. Den ene vil være "navn" indtastningsfeltet og den anden vil være "e-mail" inputfeltet. Værdierne, der er knyttet til hver af disse nøgler, er uanset hvad brugeren skrev i disse indtastningsfelter i formularen "Hej der".

 // // Parse formulardata til en Hashtable. // Hashtable form_data = cgi_lib.ReadParse (System.in); 

Nu hvor vi har analyseret formulardataene, kan vi udføre den behandling, vi gerne vil med de data, der sendes til os. Derefter kan vi generere noget HTML til at sende tilbage til brugerens browser. I dette enkle program vil vi ikke foretage nogen behandling med dataene; vi vil blot gentage de oplysninger, der leveres af brugeren. Vi skal bruge metode på Hashtable-objektet til at udtrække formværdierne i strenge, som vi kan bruge i vores program. Det følgende eksempel viser, hvordan vi udpakkede det navn, som brugeren skrev i et strengobjekt.

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

Lad os nu sætte det hele sammen i et simpelt program. Her er et Java-program, som vi kan bruge til at behandle "Hello There" -formularen (hej.java):

importer java.util. *; import java.io. *; klasse hej {public static void main (String args []) {// // Her er et minimalistisk CGI-program, der bruger cgi_lib // // // Udskriv det krævede CGI-header. // System.out.println (cgi_lib.Header ()); // // Parse formulardataene til en Hashtable. // Hashtable form_data = cgi_lib.ReadParse (System.in); // // Opret toppen af ​​den returnerede HTML-side // String name = (String) form_data.get ("name"); System.out.println (cgi_lib.HtmlTop ("Hej der" + navn + "!"); System.out.println ("& lth1 align = center & gt Hej der" + navn + "!"); System.out.println (" Her er navn / værdipar fra formularen: "); // // Udskriv navn / værdipar sendt fra browseren. // System.out.println (cgi_lib.Variables (form_data)); // // Udskriv de miljøvariabler, der er sendt fra Unix-scriptet. // System.out.println ("Her er CGI-miljøvariabler / værdipar" + "sendt fra UNIX-scriptet:") ; System.out.println (cgi_lib.Environment ()); // // Opret bunden af ​​den returnerede HTML-side for at lukke den rent. // System.out.println (cgi_lib.HtmlBot ());}} 

Konklusion

Med denne introduktion til CGI-programmering i Java skal du være på vej til en helt ny måde at programmere serversiden af ​​dine webapplikationer på. Husk, at CGI-protokollen kun giver en måde at kommunikere mellem en klientbrowser og en webserver på. World Wide Web Consortium's puslespil (se afsnittet Ressourcer nedenfor) og andre som Sun's Jeeves, kommer med bedre løsninger, som involverer at skrive Java-servlets, som du kan hænge af din webserver. Men det er et emne for en anden dag. Hav det sjovt!

Pat Durante er senior softwareingeniør hos TASC, Inc. i Reading, MA. TASC er en anvendt informationsteknologivirksomhed på 00 millioner, der specialiserer sig i udvikling og integration af avancerede informationssystemer og tjenester. Pat har konstrueret objektorienterede applikationer i fire år. Han er leder af TASCs Object Oriented Special Interest Group og medstifter af TASCs Java Interest Group. Pat's webstedsadresse er: //members.aol.com/durante.

Lær mere om dette emne

  • Oplysninger om Common Gateway Interface (CGI) kan findes på:

    //hoohoo.ncsa.uiuc.edu/cgi

  • World Wide Web Consortium's Jigsaw er beskrevet på:

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

  • For mere om Sun's Jeeves, se:

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

Denne historie, "Skriv CGI-programmer i Java", blev oprindeligt udgivet af JavaWorld.