Ohjelmointi

Kuinka aloittaa palvelinpuolen Java

Palvelinpuolen Java (SSJ), jota joskus kutsutaan servleteiksi tai palvelinpuolen sovelmiksi, on tehokas hybridi Common Gateway Interface (CGI) ja alemman tason palvelimen API-ohjelmoinnista - kuten NSAPI Netscapesta ja ISAPI Microsoftilta.

Tässä artikkelissa on johdanto ja vaiheittaiset ohjeet palvelinpuolen Java-sovelluksen Netscape-toteutukseen, jota Netscape kutsuu palvelinpuolen sovelmiksi (SSA).

SSA: t voivat toimia kuten CGI-komentosarja. Se vastaanottaa saada ja lähettää pyytää ja palauttaa verkkosivun (yleensä HTML-muodossa), mutta SSJ ladataan dynaamisesti palvelimeen, kuten NSAPI / ISAPI. Tämä eliminoi käynnistysviiveet, joita olemme odottaneet CGI: ltä. Se antaa SSJ: n myös ylläpitää osan tilastaan ​​teloitusten välillä, kuten avoimen yhteyden pitäminen tietokantaan.

SSA: t toteuttavat omat hiekkalaatikko, joka tarjoaa Java: lta odotettavan suojauksen. Esimerkiksi kaatuva sovelma ei kaadu koko palvelinta, kuten NSAPI / ISAPI-ohjelmoinnissa voi tapahtua. Tämä lisäsuojaus mahdollistaa myös sovelmien lataamisen suoritettavaksi palvelimelle - aivan kuten asiakaspuolen Java-sovelmat ladataan suoritettaviksi asiakkaalle.

Ehkä SSA: iden tärkein näkökohta on, että Java-kielellä kirjoitetut ne ovat luonnostaan ​​alustasta riippumattomia ja olio-suuntautuneita.

Historia

Yhä useammat palvelimet tukevat palvelinpuolista Java-palvelua, mukaan lukien Netscape FastTrack 2.0- ja Enterprise 2.0 -palvelimet, JavaSoftin Java-palvelin (aiemmin nimeltään Jeeves), World Wide Web Consortiumin palapeli, WebLogicin T3Server, Oraclen Web-palvelin ja Peak Technologies ExpressO. Kukin näistä palvelimista käyttää erilaista palvelinpuolen Java-sovellusliittymää, joka vaatii kehittäjiä kirjoittamaan eri ohjelmat kullekin palvelimelle, jota he käyttävät.

Netscape-tiedot: Valmistele palvelimesi

Ennen kuin kirjoitat ensimmäisen palvelinpuolen sovelman Netscape-palvelimille, sinun on valmisteltava palvelin. Enterprise- ja FastTrack-palvelimet ovat identtisiä SSA-tuella.

Aloita käynnistämällä palvelimen Java-tulkki. Tämä voidaan tehdä Server Managerista kohdasta "Ohjelmat -> Java". Ota Java-tulkki käyttöön napsauttamalla Kyllä-painiketta. Palvelimen hallinta pyytää sinulta "Java-sovelmahakemistoa", johon SSA-tukitiedostot ja kaikkien SSA-luokkien tiedostot sijoitetaan. Se tarjoaa oletussijainnin. Unix-koneilla tämä on / usr / ns-home / plugins / java / applets. Windows-koneissa se on C: \ Program Files \ Netscape \ Server \ plugins \ Java \ applets (Huomaa: Tässä merkintäkentässä Netscape pyrkii sekoittamaan taaksepäin ja eteenpäin vinoviivat. Älä huoli, Netscape kohtelee kahta vinoviivaa samalla tavalla.) Ota oletussovellushakemisto, jos mahdollista. Jos päätät mukauttaa oletusarvon sijaan, varmista, että valitset hakemiston jonnekin palvelimen juuressa ja kopioit kaikki tiedostot oletussijainnista mukautettuun sijaintiin. Tallenna ja ota muutokset käyttöön ja pysäytä palvelin ja käynnistä se uudelleen, jotta muutokset tulevat voimaan.

Aika kokeilla!

Tässä vaiheessa sinun pitäisi pystyä kokeilemaan Netscapen tarjoamia sovelmia. Osoita selaimesi kohtaan // palvelimen nimi / palvelin-java / FormApplet? Abc = xyz ja 123 = 789. Sinun pitäisi nähdä "get" -tiedot, joita Form-sovelma käsittelee ja palauttaa HTML-muodossa.

Jos saat palvelinvirheen, tarkista palvelimesi virheloki (/ usr / ns-home / httpd-isäntänimi / lokit / virheet tai C: \ Program Files \ Netscape \ Server \ httpd-hostname \ logs \ -virheet). Jos sanotaan, ettei se voi käynnistää Java-tulkkia, todennäköinen syy on se, että CLASSPATH sekoittaa Netscape-sovellusta. Yritä käynnistää palvelin ympäristössä, jossa ei ole CLASSPATHia.

Toinen kokeiltava sovelma on osoitteessa // palvelimen nimi / palvelin-java / Connect; sen pitäisi ladata ja näyttää //www.meer.net/barn/index.html. Connect-sovelma muodostaa pistorasiayhteyden sivun noutamiseksi, mikä voi aiheuttaa palvelinvirheen, jos palvelimesi on palomuurin takana. Oletetaan seuraavaa vaihetta varten, että palomuuri esti pistorasian. Muokkaamme Connect-sovelmakoodia päästäksesi eri sivulle toisella Web-palvelimella.

Connect.java-tiedosto on saatavana Java-sovelmahakemistosta. (Se löytyy myös alla.) Se tuo ensin netscape.server.applet. *.

tuo netscape.server.applet. *; 

Tämä paketti sisältää palvelinpuolisten sovelmien kehittämisen perusluokat. Tämän paketin tärkein luokka on HttpApplet, kaikkien palvelinpuolisten sovelmien superluokka. Kuten näet Connect (alla), ainoa tapa, jonka palvelinpuolen sovelman on toteutettava, on juosta menetelmä. Tätä menetelmää käytetään aina, kun sovelma vastaanottaa "osuman". juosta Connect-menetelmä avaa liitännän "isännälle" ja hakee "pyynnön" ennen kuin ohjaa ulostulo asiakkaalle. Haluamme muuttaa isäntämuuttujaa niin, että se viittaa verkkopalvelimeltamme näkyvään koneeseen. Haluamme myös muuttaa "request" -muuttujan, jotta se viittaa uuden "host" -sivun sivuun.

tuo netscape.server.applet. *; tuo java.io.PrintStream; tuo java.io.InputStream; tuo java.io.OutputStream; tuo java.io.DataInputStream; tuo java.net.Socket; class Connect laajentaa HttpApplet {public void run () heittää poikkeuksen {String host = "www.meer.net"; // muuta tätä int-porttia = 80; Merkkijonopyyntö = "GET /barn/index.html HTTP / 1.0 \ n"; // tämäkin Socket s = uusi Socket (isäntä, portti); OutputStream os = s.getOutputStream (); PrintStream op = uusi PrintStream (os); op.println (pyyntö); InputStream on = sam (); DataInputStream di = uusi DataInputStream (on); Merkkijono; if (returnNormalResponse ("teksti / html")) {PrintStream out = getOutputStream (); out.println ("& lth1 & gtData" + isäntä + "portti" + portti + ""); out.println (" pyyntö: "+ pyyntö +"
"); while ((rivi = di.readLine ())! = null) out.println (rivi);}}}

Kun olet tehnyt muutokset "isäntä" ja "pyyntö", seuraava askel on kääntää Connect uudelleen.

Käytä Windows-käyttöjärjestelmässä tavallista javac-kääntäjääsi, kun luokan polku on asetettu sisältämään serv2_0.zip. javac -classpath .. \ class \ serv2_0.zip Connect.java.

Unixin alla Netscape tarjoaa Java-kääntäjän (javac) Java-sovelmahakemiston yläpuolella olevassa hakemistossa. Tämä javac on itse asiassa komentosarja, joka kutsuu java sun.tools.javac.Pää tehdä kääntäminen. Joissakin järjestelmissä sun.tools.javac.Pää kääntäjä käyttää uusia 1.1 JDK -menetelmiä, kuten java.lang.Character.isJavaLetterOrDigit (), mikä voi aiheuttaa melkoisen ongelman kehittäjille ilman 1.1 JDK: ta. Täysin hieno vaihtoehto on käyttää aina käyttämääsi tavallista javac-kääntäjää, javac -classpath ../classes/serv2_0.zip Connect.java. Jos haluat käyttää toimitettua javac-komentosarjaa, korvaa vain "javac" kanssa "../javac."

Tämän kokoamisen aikana saatat nähdä virheen, joka sanoo:

Connect.java:1: Pakettia netscape.server.applet ei löydy tuonnista. tuo netscape.server.applet. *; ^ 1 virhe 

Tästä virheestä ei ole mitään syytä huoleen. Luokkatiedosto luodaan normaalisti ja se toimii hyvin. Voit välttää tämän virheen, jos poistat jokerimerkit tuontilausekkeista.

Unix-sovelluksessa Netscape tarjoaa Java-sovelmahakemistossa makefile-sovelluksen, joka käsittelee sovelmien kääntämistä. Valitettavasti makefile käyttää '%' -merkkiä, joka on mk / nmake-laajennus eikä ole aina käytettävissä. Ongelmakoodi on esitetty alla.

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

Vaihtoehto on käyttää .suffixes-sääntöä. Muokkaa tiedostotiedoston ensimmäistä riviä seuraavasti:

.SUFFIXES: .java .class ja korvaa% .class -kohtaviivat .java.class: javac -classpath ../classes/serv2_0.zip $ < 

Saatat huomata, että poistin ../ jotta makefile käynnistää tavallisen javac-kääntäjän. Voit testata uuden makefailen tallentamalla Connect.java-tiedoston uudelleen ja kokeilemalla "make" -toimintoa.

Jos lataat // palvelimen nimi / palvelin-java / Connect -sivun uudelleen juuri nyt, näet silti "Lato" -sivun. Tämä johtuu siitä, että Java-luokat ladataan palvelimeen aloitushetkellä obj.conf-tiedoston init-toiminnon kautta. Uusien muutosten lataamiseksi sinun on pysäytettävä palvelin ja käynnistettävä se sitten uudelleen. Joissakin järjestelmissä sinun on käytettävä palvelimen hallintaa pysäyttämiseen ja käynnistämiseen. Komentorivin uudelleenkäynnistys johtaa joskus "palvelinvirheeseen" myöhemmille sovelmapyynnöille. Kun olet pysäyttänyt palvelimen ja käynnistänyt sen, kokeile Connect-sovelma uudelleen. Netscape olisi pitänyt ladata uuden Connect-koodin valitsemasi sivun näyttämiseksi.

Otetaan vakavasti API

Onnittelut! Olet juuri koonnut ja testannut ensimmäisen palvelinpuolen Java-koodisi. Anna nyt muutama käytettävissä olevista menetelmistä.

Seuraavilla menetelmillä voit tehdä suurimman osan työstäsi:

PrintStream getOutputStream () heittää IOExceptionin; 

palauttaa a PrintStream, jonka avulla voit tulostaa vastauksesi asiakkaalle. Se korvaa System.out.

Hashtable getFormData () heittää IOExceptionin; 

palauttaa Hashtable-tiedoston, joka tallentaa HTTP-pyynnön nimi-arvo-parit. Arvon merkkijonot dekoodataan URI-koodatusta muodostaan. Se heittää IOException jos lomaketietoja ei ole.

Merkkijono getFormField (String fieldName) heittää IOExceptionin; 

Voit käyttää getFormField vain yhden kentän hakemiseen. Se heittää myös IOException jos lomaketietoja ei ole.

boolean returnNormalResponse (String contentType) heittää IOExceptionin; 

aloittaa HTTP-vastauksen sisältötyypillä, joka määritetään parametrilla. Se palauttaa arvon tosi, jos tämä oli "get" tai "post" pyyntö ja epätosi, jos se oli "head" pyyntö.

public boolean returnErrorResponse (String contentType, int status, String reason) heittää IOExceptionin julkisen boolen returnErrorResponse (String contentType, int status) heittää IOException 

aloittaa HTTP-vastauksen ilmoittamaan virheestä. Se vaatii sisältötyypin, tilan (kuten HttpApplet.BAD_REQUEST, joka edustaa tavallista virhekoodia 400), ja valinnainen merkkijono, joka antaa virheen syyn.

Palvelimella toimivien sovelmien kehittämisessä on kymmeniä muita menetelmiä. Netscape asentaa API-oppaan palvelimiinsa. Löydät oppaan osoitteesta /usr/ns-home/bin/httpd/admin/html/manual/pg/javapi.htm alla Unix tai osoitteessa C: \ Program Files \ Netscape \ Server \ bin \ httpd \ admin \ html \ manual \ pg \ javapi.htm Windowsissa.

Hei maailma!

Käytetään nyt kaikkea mitä olemme oppineet kirjoittamaan (arvasit!) Hello World -palvelinpuolen sovelman. Seuraava sovelma sanoo hei Maailman ellei a kohde kenttä annetaan - jolloin siinä sanotaan hei kohteelle.

tuo netscape.server.applet.HttpApplet; tuo java.io.IOException; tuo java.io.PrintStream; luokka Hei laajentaa HttpApplet {/ * Oletuksena tervehdimme "Maailma" * / String helloTarget = "Maailma"; / * run () kutsutaan käsittelemään pyyntö * / public void run () heittää poikkeuksen {/ * getOutputStream () antaa meille mahdollisuuden puhua asiakkaan kanssa * / PrintStream out = getOutputStream (); / * Käytä getFormField () -sovellusta saadaksesi selville, tuleeko heitä tervehtimään * muulle kuin "Maailmalle". * / Merkkijono formTarget = null; kokeile {formTarget = getFormField ("kohde"); if (formTarget! = null) {helloTarget = formTarget; }} catch (IOException e) {/ * Ohitamme poikkeukset, jotka aiheutuvat "puuttuvasta kyselymerkkijonosta" * / if (! e.getMessage (). startsWith ("puuttuva kyselymerkkijono"))) {handleException (e, out) ; }} / * Sano hei * / if (returnNormalResponse ("text / html")) {kokeile {out.println ("Hei, + helloTarget +"! "); } catch (Poikkeus e) {handleException (e, out); }}} private void handleException (Exception e, PrintStream out) {try {returnErrorResponse ("text / html", SERVER_ERROR, "Exception thrown"); } catch (IOException ioe) {} // yritä tulostaa alkuperäinen poikkeus out.print ("& lth1>"); out.print (e); out.print ("\ n "); out.print (" & ltpre> "); e.printStackTrace (out); // vaihtoehtoinen PrintStream on määritettävä out.print ("
"); return;}}

Tämä palvelinpuolen sovelma alaluokkien netscape.server.applet.HttpApplet ja ohittaa juosta() menetelmä, kuten kaikki palvelinpuolen sovelmat Netscape-kohdassa. Se saa nopeasti lähtövirran kutsun avulla getOutputStream, jota se käyttää Hellon tulostamiseen (tai vian syyn tulostamiseen). Se kutsuu getFormField tarkistaa, onko käytettävissä vaihtoehtoinen kohde, ja palauttaa sitten normaalin "text / html" -vastauksen ja suorittaa lopuksi "Hello" -tulostuksen. Huomaa, että se tarkistaa paluuarvon returnNormalResponse () soita eikä tee mitään, jos se palauttaa väärän arvon. Jos et tee tätä, palautat tiedot jopa pää pyynnöt.