Tik-109.300 Tietoliikennearkkitehtuurit

Kotitehtävä 10.

 

 

 

 

 

 

 

Java Servletit

29.11.1998

Ville Kurkinen

Teknillisen fysiikan osasto

Teknillinen korkeakoulu

mailto:vkurkine@cc.hut.fi

 

 

 

 

Tiivistelmä

Javaa on jo muutaman vuoden ajan käytetty etenkin WWW- sivujen toiminnallisten ominaisuuksien paranteluun applettin avulla. Uudempi tekniikka, Java servletit, on tapa tehdä vastaava asia itse palvelimella. Java servletit ovat pieniä, laitteistoriippumattomia Java ohjelmia, joita voidaan käyttää laajentamaan WWW- palvelimen toimintaa monella eri tavalla. Pyynnöt voidaan välittää suoraan erillisessä Java virtuaalikoneessa ajettavalle servletille, joka nopeasti hoitaa kaikki tietokantakyselyt, html- sivujen generoimisen ja vaikka tiedon suodattamisen tai muuntamisen toiseen muotoon. Servletit ladataan vain kerran koneen muistiin ja niitä käytetään useiden pyyntöjen suorittamiseen tavallisia CGI- ohjelmia nopeammin. Lisäksi Javan SecurityManager kontrolloi servlettien pääsyä eri levyjärjestelmiin ja muita oikeuksia.

  1. MITÄ OVAT SERVLETIT ?
  2. Java servletit ovat pieniä, laitteistoriippumattomia Java ohjelmia, joita voidaan käyttää laajentamaan WWW- palvelimen toimintaa monella eri tavalla. Servletit ovat palvelimella vastaavia kuin appletit selaimella; ne laajentavat isäntäsovelluksen toimintamahdollisuuksia. [4] Servletit ovat moduuleja, joita ajetaan pyyntö/vastaus- tyyppisten palvelujen sisällä laajentaen niiden toimintaa jollakin tavalla [5]. Yleensä palvelu on HTTP- protokollan mukainen WWW- palvelimella pyörivä client/server- palvelu [4].

    Servletit eroavat appleteista siinä, että niitä ei ajeta selaimella eikä niillä ole graafista käyttöliittymää. Sen sijaan, servletit vuorovaikuttavat WWW- palvelimen kanssa palvelimella olevan erityisen "servlet moottorin" (servlet engine) avulla, joka servletin avulla käsittelee määrätyt pyynnöt. Käyttäjä lähettää pyynnön esim. selaimeltaan palvelimelle, jossa servlet- moottori servletin avulla käsittelee pyynnön. Lopulta servlet tulostaa vastauksen esimerkiksi HTTP- muodossa suoraan käyttäjän selaimelle. [4] Servlettien alkuperäinen käyttötarkoitus on tarjota mahdollisuus turvalliseen datan käsittelyyn web- pohjaisen sovelluksen kautta sekä dynaamisesti generoida html- sivuja ulkoisen tiedon perusteella [6].

  3. SERVLET ARKKITEHTUURI
  4. Koska servletit ovat Java- ohjelmia, ajetaan niitä Java virtuaalikoneen (JVM) sisällä. Tämän takia täytyy joko palvelin olla käynnistetty JVM: een tai sitten palvelimen tulee tukea tarvittavaa Java servlet ohjelmointirajapintaa (Java Servlet API [4]). Jälkimmäisessä tapauksessa tarvitaan palvelimen oheen erityinen servlet moottori, joka hoitaa servletin käynnistyksen, pyyntöjen välityksen ja yhteyden itse palvelimeen. Tällainen servlet moottori on esimerkiksi Live Softwaren Jrun. [2]

    Servlet API jakautuu kahteen pakkaukseen, javax.servlet ja javax.servlet.http, joista ensimmäisessä määritellään yleiset servletteihin liittyvät rajapinnat ja luokat ja jälkimmäisessä tarkemmin HTTP- protokollan mukaisten pyyntöjen käsittelemiseen tarkoitetut rajapinnat ja luokat. Servletin teknisen toteutuksen perustana on javax.servlet.Servlet rajapinta. Kaikki servletit toteuttavat tämän rajapinnan joko suoraan tai epäsuoraan perimällä jonkin luokan, joka toteuttaan ko. rajapinnan. Tällainen luokka on esimerkiksi GenericServlet, joka toimii kaikkien servlettien kantaluokkana tai HttpServlet, joka toimii perusluokkana HTTP- pyyntöjä toteuttaville servleteille. Servlet- rajapinta määrittelee metodit, joiden kautta voidaan hoitaa sekä servletin hallinta että kommunikointi servletin ja kayttäjän välillä. Palvelupyyntö välitetään servletille ServletRequest-objektin välityksellä ja vastauksen välittämiseen servlet saa ServletResponse- objektin. [5] Servletit voivat myös vuorovaikuttaa ympäristönsä kanssa suoraan ServletContext- rajapinnan toteuttavan objektin kautta. Tämä objekti määrittelee sen, miten yksittäinen servlet "näkee" servlet moottorin ja ympäristön, jossa sitä ajetaan [4].

    1. Servletin elinkaari

    Servletin elinkaari jakautuu viiteen osaan; lataaminen / intantiointi, alustus, palvelu, tuhoaminen ja roskien keruu. javax.servlet.Servlet- rajapinta määrittelee metodit, joita kutsutaan tiettyinä aikoina ja tietyssä järjestyksessä, mikä määrittelee servletin elinkaaren [4].

    Palvelimelle tulevat pyynnöt voidaan määritellä siten, että esimerkiksi tietyn tunnisteen omaavat pyynnöt ohjataan aina tietyn servletin ajettavaksi. Vaihtoehtoisesti voidaan määritellä, että tietyt servletit löytyvät aina tietystä hakemistosta yms. [6] Näin palvelin osaa servlet moottorin avulla ohjata pyynnöt oikeille servleteille.

    Servlet moottori lataa dynaamisesti uuden servlet- instanssin joko ensimmäisen ko. servletille osoitetun pyynnön saapuessa tai vaihtoehtoisesti servletit voidaan ladata ja alustaa palvelimen käynnistämisen yhteydessä. Servlet moottori hoitaan kaikkien servletin hallintaan liittyvien metodien kutsumisen ja siten ohjaa servletin eri vaiheita alusta loppuun. Servletit voidaan ladata joko paikallisesta levyjärjestelmästä, etäjärjestelmästä tai verkon yli. [6]

    Servlet moottori voi tarvittaessa ladata useampia instansseja yhdestä servletistä tai ohjata useampia pyyntöjä rinnakkain yhdelle servletille, jolloin niitä ajetaan rinnakkain omassa säikeessään mutta haluttaessa voidaan määritellä servlet luokka toteuttamaan SingleThreadModel- rajanpinta, jolloin varmistutaan siitä, että ko. servlettiä ei koskaan ajeta useammassa kuin yhdessä säikeessä. [4]

    Lataamisen jälkeen servlet alustetaan kutsumalla sen init()- metodia ja vasta onnistuneen alustamisen jälkeen servletille ohjataan pyyntöjä suoritettavaksi. Alustaminen suoritetaan lataamisen jälkeen vain kerran; seuraavan kerran alustus tehdään vasta, kun ko. servlet- instanssi on kertaalleen tuhottu ja uudelleen ladattu. Servlet moottori säilyttää viittauksen servlettiin pyyntöjen käsittelemisen jälkeenkin, joten ne voivat suorittaa useita pyyntöjä peräkkäin ilman, että niitä välillä täytyy ladata tai alustaa. Tämän vuoksi init()- metodi onkin hyvä paikka suorittaa erilaiset raskaat operaatiot, kuten yhteyden luominen tietokantaan jne. [4] [1]

    Onnistuneen alustuksen jälkeen servlet on valmis pyyntöjen käsittelemiseen. Pyynnöt ohjataan servletille service()- metodin kautta, joka saa parametreinaan ServletRequest- ja ServletResponse- rajapinnan toteuttavat objektit, joiden avulla servlet saa tietoa välitetyistä parametreista jne. Jälkimmäisen objektin avulla servlet voi asettaa palvelimelle ohjausparametreja sekä kirjoittaa suoritetun pyynnön tuloksen tai muuta dataa käyttäjälle. HttpServlet- luokka lisäksi tukee standardi HTTP- protokollan mukaisia pyyntöjä ja määrittelee metodit doGet() ja doPost()vastaavasti GET- ja POST- metodilla lähetettyjen pyyntöjen käsittelemiseksi. Metodin doDelete()avulla voidaan käsitellä HTTP DELETE- pyyntöjä. Kaikki HttpServlet- luokan oliot saavat tulosten kirjoittamista varten HttpServletRequest- luokan olion, jonka kautta voidaan servletin tulosteet kirjoittaa käyttäjän selaimelle suoraan html- muodossa tai asettaa WWW- palvelimelle HTTP- otsikkotietoja, kuten HTTP BAD_REQUEST jne. [4]

    Servlet tuhotaan kutsumalla sen destroy()- metodia. Servlet moottori päättää tämän ajankohdan ja se voi tuhota servletit milloin tahansa mutta yleensä tämä tapahtuu samalla, kun palvelinkin suljetaan. Tämän destroy()- metodin aikana servletin tulisi siis tallettaa kaikki tarvittava tieto ja vapauttaa viittaukset muihin sen käyttämiin resursseihin. Tuhoamisen jälkeen servlet moottori vapauttaa viittauksen servlettiin, jolloin Javan roskien keruu vapauttaa jossakin vaiheessa servletin varaaman muistin. Tämän jälkeen servletille ei enää voida ohjata pyyntöjä ennen kuin servlet on uudestaan ladattu ja onnistuneesti alustettu. [4][7]

  5. SERVLET VAI CGI ?
  6. Suurin ero Java servleteillä ja normaaleilla CGI- ohjelmilla on se, että servletit ladataan ja alustetaan vain yhden kerran, kun CGI- ohjelmat alustetaan erikseen jokaisen pyynnön aikana. Lisäksi, koska servletit tehdään Javalla, voidaan niitä ajaa suoraan monessa eri käyttöympäristössä riippumatta palvelimesta tai käyttöjärjestelmästä. Esimerkiksi Perlillä tämä on myös mahdollista mutta Perl- skriptit joudutaan tulkitsemaan jokaisen pyynnön aikana, mikä hidastaa pyyntöjen suorittamista. [2]

    Servlet moottori ajaa kaikki servlettejä yhdessä JVM: ssä ja lataamisen jälkeen kaikki servletit pysyvät muistissa niin kauan kunnes servlet moottori ne tuhoaa [4]. Kun lisäksi kaikki raskaammat alustusoperaatiot, kuten tietokantayhteyden avaaminen, tehdään vain kerran alustusvaiheessa, voidaan pyyntöjä käsitellä huomattavasti tavallisia CGI- ohjelmia nopeammin [3].

    Kuvassa 1 on verrattu tavallisten CGI- ja Fast-CGI- ohjelmien sekä servlettien tapaa käsitellä niille tulevia pyyntöjä. Kohdassa (a) servlet moottori on käynnistetty yhteen prosessiin, jossa kaikki pyynnöt käsitellään. Kullekin servletille tuleva pyyntö ohjataan oikean servletin käsiteltäväksi ja pyynnöt suoritetaan rinnakkan kukin omassa säikeessään. Kohdassa (b) esitetään, miten tavallisille CGI- ohjelmille tulevat pyynnöt käynnistetään jokainen omassa prosessissaan. Kohdassa (c) esitetään, miten Fast-CGI- tyyppisillä ohjelmillakin käynnistetään kokonaisia prosesseja pyyntöjen käsittelemiseen.[6]

    Kuva 1. Servlettien käsittelemät pyynnöt ajetaan yhdessä prosessissa ja jokainen pyyntö omassa säikeessään tämän yhden prosessin sisällä.

    Servlettejä voidaan myös "putkittaa" toisiinsa siten, että yksi servlet ensin hoitaa pyynnöstä oman osuutensa ja sen jälkeen ohjaa pyynnön seuraavalle servletille, joka voi sitten vaikka kirjoittaa vastauksen käyttäjälle. Servletit voivat myös vaihtaa tietoa keskenään esim. eri käyttäjien antamia parametreja ja pitempiaikaisia ajoja voidaan käynnistää erilliseen säikeeseen, jonka tilaa voidaan valvoa eri pyyntöjen välillä. [2]

  7. TURVALLISUUS
  8. Servleteillä on pääsy pyynnön lähettäjän tietoihin. Jos käytetään SSL- protokollan mukaista yhteyttä, niin käyttäjä voidaan tunnistaa luotettavasti. Serveteillä on myös pääsy HTTP- yhteyksissä käytettyjen pyyntöjen otsikkokenttien tunnistetietoihin. [6]

    Servleteillä on etunaan Javan poikkeusten käsittely; väärät muistiosoitukset eivät ole mahdollisia ja poikkeusten sattuessa viimeistään servlet moottori käsittelee kaikki poikkeukset hallitusti, joten virhetilanteet eivät pääse kaatamaan itse palvelinta.

    Turvallisuutta lisää se, että Javan SecurityManager kontrolloi servlettien oikeuksia levyjärjestelmään. Kaikki servletit ovat oletusarvoisesti "untrusted" eli niillä ei ole juuri mitään oikeuksia paikalliseen järjestelmään, jossa niitä ajetaan. Kuitenkin servlettejä voidaan digitaalisesti "allekirjoittaa", jolloin niille voidaan antaa enemmän oikeuksia. [6] Kuva 2 havainnollistaa tilannetta.

    Kuva 2. Servlettien pääsyä paikalliseen järjestelmään valvoo Javan SecurityManager.

  9. YHTEENVETO

Kaiken kaikkiaan servlettien käyttö etenkin WWW- palvelinten ominaisuuksien laajentamiseen esimerkiksi tietokantojen ja muun ulkoisen datan käytössä on huomattavasti CGI- ohjelmia nopeampaa ja helpompaa. Lisäksi servelettejä ajetaan suoraan palvelimella, joten ne eivät ole lainkaan riippuvaisia pyynnön lähettäjän ohjelmistosta tai sen versiosta. Itse asiassa servletit eivät ole riippuvaisia edes palvelimesta, jolla niitä ajetaan, sillä servlet vuorovaikuttaa palvelimen kanssa ainoastaan servlet moottorin välityksellä. Riittää, että palvelin toteuttaa vaadittavan Servet API: n. Tietysti servlet moottori on riippuvainen palvelimesta mutta servlet moottori toimiikin lähinnä vain eräänlaisena frameworkina servletpohjaisten sovellusten tukena.

# Lähdeluettelo

  1. Crawford, W., Developing Java servlets, Web Review, 10.10.1997 [viitattu 11/29/98]
  2. <http://webreview.com/97/10/10/feature/main.html>

  3. Dougherty, D., Understanging Java servlets, Webreview, 1997, 10.10.1997 [viitattu 11/29/98] 0
  4. <http://webreview.com/97/10/10/feature/colton.html>

  5. Lubling, O. & Malave, L., Developing scalable, reliable, business applications with servlets, Java Developer Connection, 25.9.1998 [viitattu 11/29/98]
  6. <http://developer.java.sun.com/developer/technicalArticles/razorfish/razor.html>

  7. Sun Microsystems Inc. Java Servlet API Specification, ver. 2.1a, November 1998, [viitattu 29.11.1998]
  8. <http://java.sun.com/products/servlet/2.1/servlet-2.1.pdf>

  9. Sun Microsystems Inc., Java Web Server 1.1 - Servlet Tutorial, 25.9.1998 [viitattu 11/29/98]
  10. <http://jeeves.javasoft.com/products/java- server/documentation/webserver1.1/servlets/servlet_tutorial.html>

  11. Sun Microsystems Inc., The Java Servlet API White Paper, 24.6.1998 [viitattu 11/29/98]
  12. <http://java.sun.com/marketing/collateral/servlets.html> 

  13. Sun Microsystems Inc., The Java Language: An overview, 25.9.1998

<http://java.sun.com/docs/overviews/java/java-overview-1.html>

 

# Lisätietoja

Servlets

Sunin sivuilla oleva lyhyt mutta kattava katsaus servletteihin.

***

Writing Java Servlets

Lyhyt selvitys servlettien ohjelmoimisesta.

***

Migrating CGI scripts to Java servlets

Artikkeli CGI skriptien ja servlettien ominaisuuksista.

***

Faster performance with servlets

WebBuilder- verkkolehden artikkeli servlettien suorituskyvystä.

***

JRun Servlet Engine

Live Softwaren Java Servlet Engine ja yrityksen muita servlettteihin liittyviä kehityssovelluksia.

***

JavaServer Architecture Overview

Sunin JavaServerin arkkitehtuurikuvaus

***

Java Web Server 1.1 - The Java Servlet API

Yleiskuvaus Java Servleteistä.