Programmering

Hvordan komme i gang med server-Java

Server-side Java (SSJ), noen ganger kalt servlets eller server-side applets, er en kraftig hybrid av Common Gateway Interface (CGI) og server-API-programmering på lavere nivå - for eksempel NSAPI fra Netscape og ISAPI fra Microsoft.

Denne artikkelen gir en innføring i og trinnvise instruksjoner for Netscape-implementeringen av serversiden Java, som Netscape kaller server-side-applets (SSA).

SSA-er kan fungere som et CGI-skript. Den mottar og post ber om og returnerer en webside (vanligvis i form av HTML), men SSJ lastes dynamisk inn i serveren som NSAPI / ISAPI. Dette eliminerer oppstartsforsinkelsene vi har forventet fra CGI. Det gjør det også mulig for SSJ å opprettholde noe av tilstanden mellom henrettelser, for eksempel å holde en åpen forbindelse til en database.

SSAer utfører i sine egne Sandkasse, som gir den sikkerheten man forventer fra Java. For eksempel vil en krasjapplet ikke krasje hele serveren slik det kan skje med NSAPI / ISAPI-programmering. Denne ekstra sikkerheten gjør det også mulig å laste opp appletter for kjøring på serveren - akkurat som Java-applets på klientsiden lastes ned for utføring på klienten.

Kanskje det viktigste aspektet ved SSA er at de er skrevet i Java, iboende plattformuavhengige og objektorienterte.

Historie

Et økende antall servere støtter serversiden Java, inkludert Netscape FastTrack 2.0 og Enterprise 2.0-servere, JavaSofts Java Web Server (tidligere kalt Jeeves), World Wide Web Consortium's Jigsaw, WebLogics T3Server, Oracle's Webserver og Peak Technologies 'ExpressO. Hver av disse serverne bruker en annen Java-API på serversiden, og krever at utviklere skriver forskjellige programmer for hver server de skal bruke.

Netscape-detaljer: Forbered serveren din

Før du oppretter den første server-siden miniprogrammet for Netscapes servere, må du forberede serveren. Enterprise- og FastTrack-serverne er identiske i deres SSA-støtte.

Start med å slå på serverens Java-tolk. Dette kan gjøres fra Server Manager under "Programmer -> Java." Klikk på Ja-knappen for å aktivere Java-tolk. Serverbehandling vil be deg om en "Java-appletkatalog", som er stedet for å plassere SSA-støttefilene, samt plasseringen for alle SSA-klassefiler. Det gir en standardplassering. På Unix-maskiner er dette / usr / ns-home / plugins / java / applets. På Windows-maskiner er det det C: \ Program Files \ Netscape \ Server \ plugins \ Java \ applets (Merk: I dette inntastingsfeltet har Netscape en tendens til å blande og matche bakoverskråninger og skråstreker. Ikke bekymre deg, Netscape behandler de to typene skråstreker på samme måte.) Ta standard appletkatalog hvis mulig. Hvis du bestemmer deg for å tilpasse i stedet for å bruke standard, må du velge en katalog et sted under serverrot og at du kopierer alle filene fra standardplasseringen til din egendefinerte plassering. Lagre og bruk endringene, sørg for å stoppe serveren og starte den på nytt slik at endringene trer i kraft.

På tide å eksperimentere!

På dette tidspunktet bør du kunne eksperimentere med applets levert av Netscape. Pek nettleseren din til // servername / server-java / FormApplet? Abc = xyz & 123 = 789. Du bør se "få" dataene håndtert og returnert i HTML av skjema-appleten.

Hvis du får en serverfeil, sjekk serverens feillogg (/ usr / ns-home / httpd-hostname / logs / feil eller C: \ Program Files \ Netscape \ Server \ httpd-hostname \ logs \ feil). Hvis det står at den ikke kan starte Java-tolk, er en sannsynlig årsak at CLASSPATH forvirrer Netscape. Prøv å starte serveren i et miljø uten CLASSPATH.

En annen applet å prøve er på // servername / server-java / Connect; den skal lastes inn og vises //www.meer.net/barn/index.html. Connect-appleten oppretter en stikkontakt for å hente siden, noe som kan generere en serverfeil hvis serveren din er bak en brannmur. For det neste trinnet, la oss anta at en brannmur blokkerte kontakten. Vi redigerer Connect-appletkoden for å få tilgang til en annen side på en annen webserver.

Connect.java-filen er tilgjengelig i "Java-appletkatalogen." (Det finnes også nedenfor.) Den importerer først netscape.server.applet. *.

importer netscape.server.applet. *; 

Denne pakken inneholder grunnleggende klasser for utvikling av server-siden applets. Den viktigste klassen i denne pakken er HttpApplet, superklassen for alle applets på serversiden. Som du kan se i Connect (nedenfor), er den eneste metoden en applet på serversiden trenger å implementere løpe metode. Denne metoden påkalles hver gang appleten får et "hit". De løpe metoden for Connect åpner en stikkontakt til "verten" og henter "forespørselen" før den omdirigerer utgangen til klienten. Vi ønsker å endre "vert" -variabelen slik at den refererer til en maskin som er synlig fra webserveren vår. Vi vil også endre variasjonen "forespørsel" slik at den refererer til en side på den nye "verten."

importer netscape.server.applet. *; importer java.io.PrintStream; importere java.io.InputStream; importere java.io.OutputStream; importere java.io.DataInputStream; importere java.net.Socket; class Connect utvider HttpApplet {public void run () kaster Unntak {String host = "www.meer.net"; // endre denne int-porten = 80; Strengforespørsel = "GET /barn/index.html HTTP / 1.0 \ n"; // også dette Socket s = new Socket (vert, port); OutputStream os = s.getOutputStream (); PrintStream op = ny PrintStream (os); op.println (forespørsel); InputStream er = sam (); DataInputStream di = ny DataInputStream (er); Streng linje; if (returnNormalResponse ("text / html")) {PrintStream out = getOutputStream (); out.println ("& lth1 & gtData på" + vert + "port" + port + ""); out.println (" forespørsel: "+ forespørsel +"
"); mens ((linje = di.readLine ())! = null) ut.println (linje);}}}

Etter at du har gjort endringene "vert" og "forespørsel", er neste trinn å kompilere Connect på nytt.

Under Windows bruker du standard javac-kompilatoren din med klassesti-settet for å inkludere serv2_0.zip. javac -classpath .. \ klasser \ serv2_0.zip Connect.java.

Under Unix tilbyr Netscape en Java-kompilator (javac) i katalogen over Java-appletkatalogen. Denne javacen er faktisk et skript som ringer java sun.tools.javac.Main å gjøre kompilering. På noen systemer kan sun.tools.javac.Main kompilator bruker nye 1.1 JDK-metoder som java.lang.Character.isJavaLetterOrDigit (), som kan forårsake ganske store problemer for utviklere uten 1.1 JDK. Et helt fint alternativ er å bruke standard javac kompilatoren du alltid har brukt, javac -classpath ../classes/serv2_0.zip Connect.java. Hvis du vil bruke det medfølgende javac-skriptet, er det bare å erstatte "javac"med"../javac."

Du kan se en feil under denne samlingen som sier:

Connect.java:1: Pakke netscape.server.applet ikke funnet i importen. importer netscape.server.applet. *; ^ 1 feil 

Denne feilen er ikke noe å bekymre seg for. Klassefilen opprettes normalt og vil gå bra. Du kan unngå denne feilen hvis du fjerner jokertegn i importuttalelsene dine.

Under Unix gir Netscape en makefile i Java-appletkatalogen for å håndtere appletkompilering. Dessverre bruker makefilen jokertegnet '%', som er en utvidelse mk / nmake og ikke alltid er tilgjengelig. Problemkoden er vist nedenfor.

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

Et alternativ er å bruke en .suffixes-regel. Rediger den første linjen i den makefilen som skal være:

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

Du vil kanskje legge merke til at jeg fjernet ../ slik at makefilen vil påkalle standard javac-kompilatoren. For å teste denne nye makefilen, lagre Connect.java-filen på nytt og prøv en "make".

Hvis du skulle laste inn siden // servername / server-java / Connect akkurat nå, vil du fremdeles se "Barn" -siden. Dette er fordi Java-klassene er lastet inn på serveren ved starttid via en init-funksjon i obj.conf-filen. For å laste inn de nye endringene, må du stoppe serveren og deretter starte den på nytt. På noen systemer må du bruke Server Manager til å stoppe og starte. Kommandolinjestarter resulterer noen ganger i en "Serverfeil" for påfølgende appletforespørsler. Når du har stoppet og startet serveren, kan du prøve Connect-appleten igjen. Netscape burde ha lastet inn den nye Connect-koden for å vise siden du valgte.

La oss bli seriøse med API

Gratulerer! Du har nettopp samlet og testet din første Java-kode på serversiden. Nå for å gi noen av metodene som er tilgjengelige for deg.

Med følgende metoder kan du gjøre det meste av arbeidet ditt:

PrintStream getOutputStream () kaster IOException; 

returnerer a PrintStream, som du kan bruke til å skrive ut svaret til klienten. Det erstatter System.out.

Hashtable getFormData () kaster IOException; 

returnerer en Hashtable som lagrer navnverdiparene til HTTP-forespørselen. Verdistrengene dekodes fra deres URI-kodede form. Det kaster en IO Unntak hvis det ikke er skjemadata.

String getFormField (String fieldName) kaster IOException; 

Du kan bruke getFormField for å hente bare ett felt. Det kaster også en IO Unntak hvis det ikke er skjemadata.

boolsk returnNormalResponse (String contentType) kaster IOException; 

starter et HTTP-svar med innholdstypen som du angir med parameteren. Det blir sant hvis dette var en "get" eller "post" forespørsel og falsk hvis det var en "head" forespørsel.

offentlig boolsk returnErrorResponse (strenginnholdType, int-status, strengårsak) kaster IOException offentlig boolsk returErrorResponse (strenginnholdType, int-status) kaster IOException 

starter et HTTP-svar for å rapportere en feil. Det krever en innholdstype, en status (for eksempel HttpApplet.BAD_REQUEST, som representerer standard feilkode 400), og en valgfri streng som gir årsaken til feilen.

Det er dusinvis av andre metoder du kan bruke i utviklingen av server-siden applets. Netscape installerer en API-guide med sine servere. Du finner guiden på /usr/ns-home/bin/httpd/admin/html/manual/pg/javapi.htm under Unix eller kl C: \ Programfiler \ Netscape \ Server \ bin \ httpd \ admin \ html \ manual \ pg \ javapi.htm under Windows.

Hei Verden!

La oss nå bruke alt vi har lært å skrive (du gjettet det!) Hello World server-side applet. Følgende applet sier hei til Verden med mindre a mål feltet er gitt - i så fall sier det hei til målet i stedet.

importer netscape.server.applet.HttpApplet; importere java.io.IOException; importer java.io.PrintStream; klasse Hei utvider HttpApplet {/ * Som standard sier vi hei til "Verden" * / String helloTarget = "Verden"; / * run () påkalles for å håndtere forespørselen * / public void run () kaster Unntak {/ * getOutputStream () lar oss snakke med klienten * / PrintStream out = getOutputStream (); / * Bruk getFormField () for å finne ut om vi skal si hei til * noen andre enn "Verden". * / String formTarget = null; prøv {formTarget = getFormField ("target"); hvis (formTarget! = null) {helloTarget = formTarget; }} fange (IOException e) {/ * Vi ignorerer unntak forårsaket av en "manglende spørringsstreng" * / if (! e.getMessage (). startsWith ("manglende spørringsstreng")) {handleException (e, ut) ; }} / * Si hei * / if (returnNormalResponse ("text / html")) {prøv {out.println ("Hello," + helloTarget + "!"); } fange (Unntak e) {handleException (e, ut); }}} privat ugyldig handleException (Unntak e, PrintStream ut) {prøv {returnErrorResponse ("text / html", SERVER_ERROR, "Unntak kastet"); } fangst (IOException ioe) {} // prøv å skrive ut originalt unntak out.print ("& lth1>"); out.print (e); out.print ("\ n "); out.print (" & ltpre> "); e.printStackTrace (out); // alternativ PrintStream må spesifiseres out.print ("
"); komme tilbake; } }

Denne server-applet-underklassen fra netscape.server.applet.HttpApplet og overstyrer løpe() metode akkurat som alle server-side applets under Netscape. Det får raskt sin utgangsstrøm med en oppfordring til getOutputStream, som den vil bruke til å skrive ut "Hei" (eller bruke til å skrive ut årsaken til en feil). Det kaller getFormField for å sjekke om det er et alternativt mål å bruke, og deretter returnere et normalt "tekst / html" -svar, og til slutt utfører det faktiske arbeidet med å trykke "Hei". Legg merke til at den sjekker returverdien fra returnNormalResponse () ring og gjør ingenting hvis den returnerer falsk. Hvis du ikke gjør dette, vil du returnere data selv for hode forespørsler.

$config[zx-auto] not found$config[zx-overlay] not found