Programmering

Sådan kommer du i gang med serversiden Java

Server-side Java (SSJ), undertiden kaldet servlets eller server-side applets, er en kraftfuld hybrid af Common Gateway Interface (CGI) og server-API programmering på lavere niveau - såsom NSAPI fra Netscape og ISAPI fra Microsoft.

Denne artikel giver en introduktion til og trinvise instruktioner til Netscape-implementering af serversiden Java, som Netscape kalder server-side-applets (SSA).

SSA'er kan fungere som et CGI-script. Det modtager og stolpe anmoder om og returnerer en webside (normalt i form af HTML), men SSJ indlæses dynamisk i serveren som NSAPI / ISAPI. Dette eliminerer opstartsforsinkelser, som CGI forventer. Det giver også SSJ mulighed for at opretholde noget af sin tilstand mellem henrettelser, såsom at holde en åben forbindelse til en database.

SSA'er udfører i deres egne sandkasse, som giver den sikkerhed, man forventer fra Java. For eksempel går en nedbrudt applet ikke ned på hele serveren, som det kan ske med NSAPI / ISAPI-programmering. Denne ekstra sikkerhed gør det også muligt at uploade applets til udførelse på serveren - ligesom Java-applets på klientsiden downloades til udførelse på klienten.

Måske er det vigtigste aspekt af SSA'er, at de, skrevet i Java, er iboende platformuafhængige og objektorienterede.

Historie

Et stigende antal servere understøtter Java-server på siden, inklusive Netscape FastTrack 2.0- og Enterprise 2.0-servere, JavaSofts Java-webserver (tidligere kaldet Jeeves), World Wide Web Consortium's Jigsaw, WebLogics T3Server, Oracle's Webserver og Peak Technologies 'ExpressO. Hver af disse servere bruger en anden Java-API på serversiden, hvilket kræver, at udviklere skriver forskellige programmer til hver server, de bruger.

Netscape detaljer: Forbered din server

Inden du opretter din første server-side-applet til Netscapes servere, skal du forberede serveren. Enterprise- og FastTrack-serverne er identiske i deres SSA-understøttelse.

Start med at tænde serverens Java-tolk. Dette kan gøres fra Server Manager under "Programmer -> Java." Klik på knappen Ja for at aktivere Java-tolk. Serveradministratoren beder dig om et "Java-appletkatalog", som er stedet for at placere SSA-supportfiler såvel som placeringen for alle SSA-klassefiler. Det giver en standardplacering. På Unix-maskiner er dette / usr / ns-home / plugins / java / applets. På Windows-maskiner er det C: \ Program Files \ Netscape \ Server \ plugins \ Java \ applets (Bemærk: I dette indtastningsfelt har Netscape en tendens til at blande og matche sine skråstreger og skråstreger. Bare rolig, Netscape behandler de to typer skråstreger på samme måde.) Tag standardappletmappen, hvis det er muligt. Hvis du beslutter at tilpasse i stedet for at bruge standard, skal du sørge for at vælge et bibliotek et eller andet sted under din serverrod, og at du kopierer alle filerne fra standardplaceringen til din brugerdefinerede placering. Gem og anvend dine ændringer, og sørg for at stoppe serveren og starte den igen, så ændringerne træder i kraft.

Tid til at eksperimentere!

På dette tidspunkt skal du kunne eksperimentere med de applets, der leveres af Netscape. Ret din browser til // servername / server-java / FormApplet? Abc = xyz & 123 = 789. Du skal se "få" -dataene håndteres og returneres i HTML af form-appleten.

Hvis du får en serverfejl, skal du kontrollere serverens fejllog (/ usr / ns-home / httpd-hostname / logs / fejl eller C: \ Program Files \ Netscape \ Server \ httpd-hostname \ logs \ fejl). Hvis der står, at det ikke kan starte Java-tolk, er en sandsynlig årsag, at din CLASSPATH forvirrer Netscape. Prøv at starte serveren i et miljø uden CLASSPATH.

En anden applet at prøve er på // servername / server-java / Connect; det skal indlæses og vises //www.meer.net/barn/index.html. Connect-appleten opretter en stikketforbindelse for at hente siden, hvilket kan generere en serverfejl, hvis din server er bag en firewall. Lad os antage, at en firewall til det næste trin blokerede soklen. Vi redigerer Connect-appletkoden for at få adgang til en anden side på en anden webserver.

Connect.java-filen er tilgængelig i "Java-appletmappen." (Det findes også nedenfor.) Det importerer først netscape.server.applet. *.

importer netscape.server.applet. *; 

Denne pakke indeholder de grundlæggende klasser til udvikling af server-side-applets. Den vigtigste klasse i denne pakke er HttpApplet, superklassen til alle applets på serversiden. Som du kan se i Connect (nedenfor), er den eneste metode, som en server-applet skal implementere, den løb metode. Denne metode påberåbes hver gang applet modtager et "hit". Det løb metode til Connect åbner et stik til "værten" og henter "anmodningen" inden omdirigering af output til klienten. Vi ønsker at ændre "vært" -variablen, så den henviser til en maskine, der er synlig fra vores webserver. Vi vil også gerne ændre variablen "anmodning", så den henviser til en side på den nye "vært".

importer netscape.server.applet. *; import java.io.PrintStream; importere java.io.InputStream; importere java.io.OutputStream; importere java.io.DataInputStream; import java.net.Socket; klasse Connect udvider HttpApplet {public void run () kaster undtagelse {String host = "www.meer.net"; // ændre denne int-port = 80; Strengeanmodning = "GET /barn/index.html HTTP / 1.0 \ n"; // også dette Socket s = ny Socket (vært, port); OutputStream os = s.getOutputStream (); PrintStream op = ny PrintStream (os); op.println (anmodning); InputStream er = sam (); DataInputStream di = ny DataInputStream (er); Streng linje; hvis (returnNormalResponse ("text / html")) {PrintStream out = getOutputStream (); out.println ("& lth1 & gtData på" + vært + "port" + port + ""); out.println (" anmodning: "+ anmodning +"
"); mens ((line = di.readLine ())! = null) out.println (line);}}}

Når du har foretaget ændringerne "vært" og "anmodning", er det næste trin at kompilere Connect igen.

Under Windows skal du bruge din standard javac-kompilator med klassesti-indstillingen til at inkludere serv2_0.zip. javac -classpath .. \ klasser \ serv2_0.zip Connect.java.

Under Unix leverer Netscape en Java-compiler (javac) i kataloget over Java-appletmappen. Denne javac er faktisk et script, der kalder java sun.tools.javac.Main at lave kompilering. På nogle systemer sun.tools.javac.Main compiler bruger nye 1.1 JDK-metoder som f.eks java.lang.Character.isJavaLetterOrDigit (), hvilket kan forårsage et ganske stort problem for udviklere uden 1.1 JDK. Et perfekt alternativ er at bruge den javac-standardcompiler, du altid har brugt, javac -classpath ../classes/serv2_0.zip Connect.java. Hvis du vil bruge det medfølgende javac-script, skal du bare erstatte "javac"med"../javac."

Du kan muligvis se en fejl under denne samling, der siger:

Connect.java:1: Pakke netscape.server.applet blev ikke fundet i importen. importer netscape.server.applet. *; ^ 1 fejl 

Denne fejl er ikke noget at bekymre sig om. Klassefilen oprettes normalt og kører fint. Du kan undgå denne fejl, hvis du fjerner jokertegn i dine importopgørelser.

Under Unix leverer Netscape en makefile i Java-appletmappen til håndtering af appletkompilering. Desværre bruger makefilen wildcardet '%', som er en mk / nmake-udvidelse og ikke altid er tilgængelig. Problemkoden vises nedenfor.

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

Et alternativ er at bruge en .suffixes-regel. Rediger den første linje i den makefile, der skal være:

.TILSLAG: .java .class og udskift mållinjerne% .class med .java.class: javac -classpath ../classes/serv2_0.zip $ < 

Du bemærker muligvis, at jeg fjernede ../ så makefilen påberåber standard javac-kompilatoren. For at teste denne nye makefile skal du gemme Connect.java-filen igen og prøve en "make".

Hvis du skulle genindlæse // servername / server-java / Connect-siden lige nu, ville du stadig se siden "Barn". Dette skyldes, at Java-klasser indlæses på serveren ved starttidspunktet via en init-funktion i obj.conf-filen. For at indlæse de nye ændringer skal du stoppe serveren og derefter starte den igen. På nogle systemer skal du bruge Server Manager til at stoppe og starte. Kommandolinjestarter resulterer undertiden i en "Serverfejl" for efterfølgende appletanmodninger. Når du er stoppet og startet serveren, skal du prøve Connect-applet igen. Netscape skulle have indlæst den nye Connect-kode for at få vist den side, du valgte.

Lad os blive seriøse med API

Tillykke! Du har lige kompileret og testet din første Java-kode på serversiden. Nu for at give et par af de tilgængelige metoder til dig.

Med følgende metoder kan du udføre størstedelen af ​​dit arbejde:

PrintStream getOutputStream () kaster IOException; 

returnerer a PrintStream, som du kan bruge til at udskrive dit svar til klienten. Det erstatter System.out.

Hashtable getFormData () kaster IOException; 

returnerer en Hashtable, der lagrer navn-værdiparene for HTTP-anmodningen. Værdistrengene dekodes fra deres URI-kodede form. Det kaster en IOUndtagelse hvis der ikke er nogen formulardata.

String getFormField (String fieldName) kaster IOException; 

Du kan bruge getFormField for kun at hente et felt. Det kaster også en IOUndtagelse hvis der ikke er nogen formulardata.

boolsk returnNormalResponse (String contentType) kaster IOException; 

starter et HTTP-svar med den indstillede indholdstype, som du angiver med dens parameter. Det vender tilbage, hvis dette var en "get" eller "post" anmodning og falsk, hvis det var en "head" anmodning.

offentlig boolsk returnErrorResponse (String contentType, int-status, strengårsag) kaster IOException offentlig boolsk returnErrorResponse (String contentType, int-status) kaster IOException 

starter et HTTP-svar for at rapportere en fejl. Det kræver en indholdstype, en status (f.eks HttpApplet.BAD_REQUEST, som repræsenterer standardfejlkoden 400), og en valgfri streng, der angiver årsagen til fejlen.

Der er snesevis af andre metoder, du kan bruge til udvikling af dine server-applets. Netscape installerer en API-guide med sine servere. Du kan finde vejledningen på /usr/ns-home/bin/httpd/admin/html/manual/pg/javapi.htm under Unix eller kl C: \ Program Files \ Netscape \ Server \ bin \ httpd \ admin \ html \ manual \ pg \ javapi.htm under Windows.

Hej Verden!

Lad os nu bruge alt, hvad vi har lært at skrive (du gættede det!) Hello World server-applet. Den følgende applet siger hej til Verden medmindre a mål felt er angivet - i hvilket tilfælde siger det hej til målet i stedet.

importer netscape.server.applet.HttpApplet; importere java.io.IOException; import java.io.PrintStream; klasse Hej udvider HttpApplet {/ * Som standard siger vi hej til "Verden" * / String helloTarget = "Verden"; / * run () påberåbes for at håndtere anmodningen * / public void run () kaster undtagelse {/ * getOutputStream () giver os mulighed for at tale med klienten * / PrintStream out = getOutputStream (); / * Brug getFormField () til at finde ud af, om vi skal sige hej til * nogen anden end "Verden". * / String formTarget = null; prøv {formTarget = getFormField ("target"); hvis (formTarget! = null) {helloTarget = formTarget; }} fange (IOException e) {/ * Vi ignorerer undtagelser forårsaget af en "manglende forespørgselsstreng" * / if (! e.getMessage (). startsWith ("manglende forespørgselsstreng")) {handleException (e, ud) ; }} / * Sig hej * / if (returnNormalResponse ("text / html")) {prøv {out.println ("Hej" + helloTarget + "!"); } fange (Undtagelse e) {handleException (e, ud); }}} privat ugyldigt handleException (Undtagelse e, PrintStream ud) {prøv {returnErrorResponse ("text / html", SERVER_ERROR, "Undtagelse kastet"); } fange (IOException ioe) {} // prøv at udskrive original undtagelse out.print ("& lth1>"); out.print (e); out.print ("\ n "); out.print (" & ltpre> "); e.printStackTrace (out); // alternativ PrintStream skal angives out.print ("
"); Vend tilbage; } }

Denne server-applet-underklasse fra netscape.server.applet.HttpApplet og tilsidesætter løb() metode ligesom alle server-side applets under Netscape. Det får hurtigt sin outputstrøm med et opkald til getOutputStream, som den vil bruge til at udskrive "Hej" (eller bruge til at udskrive årsagen til en fejl). Det kalder getFormField for at kontrollere, om der er et alternativt mål at bruge, og derefter returnere et normalt "tekst / html" -svar og til sidst udfører det egentlige arbejde med at udskrive "Hej". Bemærk, at den kontrollerer returværdien fra returnNormalResponse () ringer og gør intet, hvis det returnerer falsk. Hvis du ikke gør dette, returnerer du data selv for hoved anmodninger.