Programavimas

Kaip pradėti naudotis serverio „Java“

Serverio pusė „Java“ (SSJ), kartais vadinama servletais arba serverio programėlėmis, yra galingas „Common Gateway Interface“ (CGI) ir žemesnio lygio serverio API programavimo hibridas, pavyzdžiui, „NSAPI“ iš „Netscape“ ir „ISAPI“ iš „Microsoft“.

Šiame straipsnyje pateikiama įvadinė ir nuoseklios „Netscape“ diegimo serverio „Java“, kurią „Netscape“ vadina serverio programėlėmis (SSA), diegimas.

SSA gali veikti kaip CGI scenarijus. Jis gauna gauti ir paštu prašo ir grąžina tinklalapį (paprastai HTML pavidalu), tačiau SSJ dinamiškai įkeliamas į serverį, pvz., NSAPI / ISAPI. Tai pašalina paleidimo vėlavimą, kurio tikėjomės iš CGI. Tai taip pat leidžia SSJ išlaikyti dalį būsenos tarp egzekucijų, pavyzdžiui, palaikyti atvirą ryšį su duomenų baze.

SSA vykdo savo smėlio dėžė, kuris suteikia saugumą, kurio tikimasi iš „Java“. Pvz., Sugedusi programėlė nesužlugs viso serverio, kaip gali nutikti programuojant NSAPI / ISAPI. Šis papildomas saugumas taip pat leidžia programėles įkelti vykdyti serveryje - kaip kliento Java programėlės yra atsisiunčiamos vykdyti klientui.

Bene svarbiausias SSA aspektas yra tas, kad jie, parašyti Java kalba, iš esmės yra nepriklausomi nuo platformos ir orientuoti į objektus.

Istorija

Vis daugiau serverių palaiko serverio „Java“, įskaitant „Netscape FastTrack 2.0“ ir „Enterprise 2.0“ serverius, „JavaSoft“ „Java“ serverį (anksčiau vadintą „Jeeves“), „World Wide Web Consortium“ „Jigsaw“, „WebLogic“ „T3Server“, „Oracle“ tinklo serverį ir „Peak Technologies“ „ExpressO“. Kiekvienas iš šių serverių naudoja skirtingą serverio „Java“ API, reikalaujant, kad kūrėjai kiekvienam naudojamam serveriui parašytų skirtingas programas.

Išsami „Netscape“ informacija: Paruoškite savo serverį

Prieš sudarydami savo pirmąją serverio programėlę „Netscape“ serveriams, turite paruošti serverį. „Enterprise“ ir „FastTrack“ serveriai yra identiški savo SSA palaikymu.

Pradėkite įjungdami serverio „Java“ vertėją. Tai galima padaryti iš serverio tvarkyklės skiltyje „Programos -> Java“. Spustelėkite mygtuką Taip, kad įgalintumėte „Java“ vertėją. Serverio tvarkyklė paprašys jūsų „Java programėlių katalogo“, kur galite įdėti SSA palaikymo failus, taip pat visų SSA klasės failų vietą. Čia pateikiama numatytoji vieta. „Unix“ mašinose tai yra / usr / ns-home / plugins / java / applets. „Windows“ mašinose taip yra C: \ Program Files \ Netscape \ Server \ plugins \ Java \ applets (Pastaba: Šiame įrašo lauke „Netscape“ yra linkęs maišyti ir suderinti pasviruosius ir pasviruosius brūkšnelius. Nesijaudinkite, „Netscape“ vienodai traktuoja dviejų tipų brūkšnius.) Jei įmanoma, paimkite numatytąjį programėlių katalogą. Jei nuspręsite tinkinti, o ne naudoti numatytąjį, įsitikinkite, kad pasirinkote katalogą kažkur po serverio šaknimi ir visus failus nukopijuokite iš numatytosios vietos į pasirinktinę vietą. Išsaugokite ir pritaikykite pakeitimus, būtinai sustabdykite serverį ir paleiskite jį iš naujo, kad pakeitimai įsigaliotų.

Laikas eksperimentuoti!

Šiuo metu turėtumėte mokėti eksperimentuoti su „Netscape“ teikiamomis programėlėmis. Nukreipkite naršyklę į // servername / server-java / FormApplet? Abc = xyz & 123 = 789. Turėtumėte pamatyti „gavimo“ duomenis, kuriuos HTML programa tvarko ir grąžina formos programėlė.

Jei gaunate serverio klaidą, patikrinkite savo serverio klaidų žurnalą (/ usr / ns-home / httpd-hostname / logs / klaidos arba C: \ Program Files \ Netscape \ Server \ httpd-hostname \ logs \ klaidos). Jei teigiama, kad jis negali paleisti „Java“ vertėjo, tikėtina priežastis yra ta, kad jūsų CLASSPATH klaidina „Netscape“. Pabandykite paleisti serverį aplinkoje, kurioje nėra CLASSPATH.

Kitas bandomasis programėlis yra // servername / server-java / Connect; jis turėtų būti įkeltas ir rodomas //www.meer.net/barn/index.html. „Connect“ programėlė sukuria lizdo jungtį, kad būtų galima gauti puslapį, o tai gali sukelti serverio klaidą, jei jūsų serveris yra už ugniasienės. Tarkime, kad ugniasienė blokavo lizdą. Redaguosime „Connect“ programėlės kodą, kad pasiektumėte kitą puslapį kitame žiniatinklio serveryje.

Failas „Connect.java“ yra „Java programėlių kataloge“. (Tai taip pat rasite žemiau.) Pirmiausia jis importuoja „netscape.server.applet“. *

importuoti „netscape.server.applet“. *; 

Šiame pakete yra pagrindinės klasės serverio programėlių kūrimui. Svarbiausia šio paketo klasė yra „HttpApplet“, superklase, skirta visoms serverio programėlėms. Kaip matote „Connect“ (žemiau), vienintelis būdas, kurį turi įdiegti serverio pusės programėlė, yra paleisti metodas. Šis metodas naudojamas kiekvieną kartą, kai programėlė gauna „įvykį“. paleisti „Connect“ metodas atidaro lizdą „pagrindiniam kompiuteriui“ ir pateikia „užklausą“ prieš nukreipdamas išvestį į klientą. Norime pakeisti „host“ kintamąjį, kad jis nurodytų mašiną, matomą iš mūsų žiniatinklio serverio. Taip pat norėsime pakeisti kintamąjį „užklausa“, kad jis nurodytų naujo „pagrindinio kompiuterio“ puslapį.

importuoti „netscape.server.applet“. *; importuoti java.io.PrintStream; importuoti java.io.InputStream; importuoti java.io.OutputStream; importuoti java.io.DataInputStream; importuoti java.net.Socket; „Class Connect“ pratęsia „HttpApplet“ {public void run () meta išimtį {String host = "www.meer.net"; // pakeisti šį int prievadą = 80; Eilutės užklausa = "GET /barn/index.html HTTP / 1.0 \ n"; // tai taip pat Socket s = new Socket (host, port); „OutputStream“ os = s.getOutputStream (); „PrintStream“ op = nauja „PrintStream“ (os); op.println (prašymas); „InputStream“ yra = sam (); DataInputStream di = nauja DataInputStream (yra); Styginių linija; if (returnNormalResponse ("text / html")) {PrintStream out = getOutputStream (); out.println ("& lth1 & gtData" + pagrindiniame + "prievade" + prievadas + ""); out.println (" prašymas: "+ prašymas +"
"); while ((line = di.readLine ())! = null) out.println (eilutė);}}}

Atlikę „pagrindinio kompiuterio“ ir „užklausos“ pakeitimus, kitas žingsnis yra „Connect“ perkompiliavimas.

Jei naudojate „Windows“, naudokite standartinį „javac“ kompiliatorių su nustatytu „classpath“, kad įtrauktumėte serv2_0.zip. javac -classpath .. \ class \ serv2_0.zip Connect.java.

Pagal „Unix“ „Netscape“ pateikia „Java“ kompiliatorių („javac“) kataloge virš „Java“ programėlių katalogo. Šis „javac“ yra scenarijus, kuris skambina java sun.tools.javac.Pagrindinis atlikti kompiliavimą. Kai kuriose sistemose saulė.įrankiai.javacas.Pagrindinis kompiliatorius naudoja naujus 1.1 JDK metodus, tokius kaip java.lang.Character.isJavaLetterOrDigit (), kuris gali sukelti nemenką problemą kūrėjams be 1.1 JDK. Puiki alternatyva yra naudoti standartinį „javac“ kompiliatorių, kurį visada naudojote, javac -classpath ../classes/serv2_0.zip Connect.java. Jei norite naudoti pateiktą „javac“ scenarijų, tiesiog pakeiskitejavac" su "../javac."

Šio kompiliavimo metu galite pamatyti klaidą, kurioje sakoma:

„Connect.java:1“: paketas „netscape.server.applet“ nerastas importuojant. importuoti „netscape.server.applet“. *; ^ 1 klaida 

Dėl šios klaidos nereikia jaudintis. Klasės failas yra sukurtas įprastai ir veiks gerai. Šios klaidos galite išvengti, jei importavimo ataskaitose pašalinsite pakaitos simbolius.

Pagal „Unix“ „Netscape“ pateikia „Java“ programėlių kataloge „makefile“, kad galėtų tvarkyti programėlių kompiliavimą. Deja, „makefile“ naudoja pakaitos simbolį „%“, kuris yra „mk / nmake“ plėtinys ir ne visada prieinamas. Problemos kodas parodytas žemiau.

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

Alternatyva yra naudoti .suffixes taisyklę. Redaguokite pirmąją makefile eilutę:

.SUFFIXES: .java .class ir pakeiskite% .class tikslines eilutes .java.class: javac -classpath ../classes/serv2_0.zip $ < 

Galite pastebėti, kad pašalinau ../ kad makefile iškvies standartinį javac kompiliatorių. Norėdami išbandyti šį naują failą, iš naujo išsaugokite failą Connect.java ir pabandykite padaryti „make“.

Jei dabar iš naujo įkeltumėte puslapį // servername / server-java / Connect, vis tiek pamatytumėte „Barn“ puslapį. Taip yra todėl, kad „Java“ klasės įkeliamos į serverį pradžios metu naudojant failo obj.conf pradžios funkciją. Norėdami įkelti naujus pakeitimus, turite sustabdyti serverį ir paleisti jį iš naujo. Kai kuriose sistemose turite naudoti serverio tvarkyklę, kad sustabdytumėte ir paleistumėte. Paleidus iš naujo komandinę eilutę, kartais atsiranda „Serverio klaida“ kitoms programėlių užklausoms. Sustabdę ir paleidę serverį, dar kartą išbandykite „Connect“ programėlę. „Netscape“ turėjo būti įkėlęs naują „Connect“ kodą, kad būtų rodomas jūsų pasirinktas puslapis.

Susimąstykime apie API

Sveikiname! Jūs ką tik sukūrėte ir išbandėte savo pirmąjį serverio „Java“ kodą. Dabar pateikite keletą jums prieinamų metodų.

Naudodamiesi šiais metodais, galite atlikti didžiąją savo darbo dalį:

„PrintStream getOutputStream“ () išmeta „IOException“; 

grąžina a „PrintStream“, kurį galite naudoti atspausdindami savo atsakymą klientui. Jis pakeičia System.out.

„Hashtable getFormData“ () išmeta „IOException“; 

grąžina „Hashtable“, kuriame saugomos HTTP užklausos pavadinimo ir vertės poros. Vertės eilutės yra iškoduojamos iš jų URI koduojamos formos. Tai išmeta IOException jei nėra formos duomenų.

Eilutė „getFormField“ („String fieldName“) išmeta „IOException“; 

Tu gali naudoti „getFormField“ už tik vieno lauko paiešką. Tai irgi išmeta IOException jei nėra formos duomenų.

boolean returnNormalResponse (String contentType) išmeta IOException; 

pradeda HTTP atsakymą su nustatytu turinio tipu, kaip nurodote jo parametru. Tai teisinga, jei tai buvo užklausa „gauti“ arba „paskelbti“, ir klaidinga, jei tai buvo „galvos“ užklausa.

public boolean returnErrorResponse (String contentType, int status, String reason) meta IOException viešoji loginė returnErrorResponse (String contentType, int status) meta IOException 

pradeda HTTP atsakymą pranešti apie klaidą. Tam reikalingas turinio tipas, būsena (pvz., HttpApplet.BAD_REQUEST, kuris žymi standartinį klaidos kodą 400) ir pasirinktinę eilutę, nurodančią klaidos priežastį.

Yra dešimtys kitų metodų, kuriuos galite naudoti kurdami savo serverio programėles. „Netscape“ su savo serveriais įdiegia API vadovą. Vadovą galite rasti /usr/ns-home/bin/httpd/admin/html/manual/pg/javapi.htm pagal „Unix“ arba adresu C: \ Program Files \ Netscape \ Server \ bin \ httpd \ admin \ html \ manual \ pg \ javapi.htm pagal „Windows“.

Labas pasauli!

Dabar panaudokime viską, ko išmokome, kad parašytume (atspėjote!) „Hello World“ serverio programėlę. Ši programėlė sako „labas“ Pasaulis nebent a taikinys pateikiamas laukas - tokiu atveju jis sako „labas“ taikiniui.

importuoti „netscape.server.applet.HttpApplet“; importuoti java.io.IOException; importuoti java.io.PrintStream; „Hello“ klasė pratęsia „HttpApplet“ {/ * Pagal numatytuosius nustatymus, mes sveikiname „World“ * / String helloTarget = „World“; / * run () yra iškviečiamas tvarkyti užklausą * / public void run () meta Išimtį {/ * getOutputStream () leidžia mums kalbėtis su klientu * / PrintStream out = getOutputStream (); / * Naudokite getFormField (), kad sužinotumėte, ar norime pasisveikinti * kitam nei „Pasaulis“. * / String formTarget = null; pabandykite {formTarget = getFormField ("target"); if (formTarget! = null) {helloTarget = formTarget; }} catch (IOException e) {/ * Mes nepaisysime išimčių, kurias sukelia „trūkstama užklausos eilutė“ * / if (! e.getMessage (). startsWith („trūksta užklausos eilutės“))) {handleException (e, out) ; }} / * Pasisveikinkite * / if (returnNormalResponse ("text / html")) {bandykite {out.println ("Sveiki," + labasTarget + "!"); } gaudyti (išimtis e) {rankException (e, out); }}} private void handleException („Exception e“, „PrintStream out“) {pabandykite {returnErrorResponse ("text / html", SERVER_ERROR, "Išmetama išimtis"); } catch (IOException ioe) {} // pabandykite atspausdinti originalią išimtį.print ("& lth1>"); out.print (e); out.print ("\ n "); out.print (" & ltpre> "); e.printStackTrace (out); // turi būti nurodyta alternatyvi„ PrintStream “out.print ("
"); grąžinti;}}

Šis serverio pusės programėlių poklasis iš netscape.server.applet.HttpApplet ir nepaiso paleisti () metodas, kaip ir visos serverio pusės programėlės, esančios „Netscape“. Jis greitai gauna savo išvesties srautą su skambučiu „getOutputStream“, kurią ji naudos atsispausdindama „Labas“ (arba naudos gedimo priežastį atsispausdinti). Tai ragina „getFormField“ patikrinti, ar yra alternatyvus taikinys, kurį reikia naudoti, tada pateikia įprastą atsakymą „text / html“ ir pagaliau atlieka tikrąjį „Hello“ spausdinimo darbą. Atkreipkite dėmesį, kad jis tikrina grąžinimo vertę iš returnNormalResponse () skambučio ir nieko nedaro, jei jis pateikia klaidingą. Jei to nepadarysite, grąžinsite duomenis net už galva prašymus.