WWW ja servletit. Luku 10. 10.1 Johdanto



Samankaltaiset tiedostot
HSMT Web-sovellustekniikoista

WWW-sivut HTML-kielellä esitettyä hypertekstiaineistoa

ICT1TN004. Lomakkeet. Heikki Hietala

Lomake kannattaa asemoida taulukkoon: table. Silloin selitteet ja kentät saadaan sarakkeisiin. Kenttien ulkoasu voidaan määritellä tyyleillä.

Tietokantasovellus (4 op) - Web-sovellukset ja niiden toteutus

JSP (JavaServer Pages) tekniikka Lähde Arvo Lipitsäinen, JSP JavaServer Pages, 2003

T Hypermediadokumentin laatiminen. Sisältö. Tavoitteet. Mitä on www-ohjelmointi? Arkkitehtuuri (yleisesti) Interaktiivisuuden keinot

Lomakkeet HTML5. Elina Ulpovaara. Testaus: IE9 Firefox7 Opera11 Chrome

directive attr1= value1 attr2= value2 %>

Rajapinta (interface)

koodipolku iteraation muokkauksessa Dokumentti: koodipolkuesimerkki.doc Päiväys: Projekti : AgileElephant

Harjoitus Olkoon olemassa luokat Lintu ja Pelikaani seuraavasti:

WWW-ohjelmoinnin kokonaisuus. WWW-OHJELMOINTI 1 Merkkauskielet. Merkkauskielten idea. Merkkauskielet (markup languages) Merkkauskielten merkitys

JAVA-PERUSTEET. JAVA-OHJELMOINTI 3op A JAVAN PERUSTEET LYHYT KERTAUS JAVAN OMINAISUUKSISTA JAVAN OMINAISUUKSIA. Java vs. C++?

Oliosuunnitteluesimerkki: Yrityksen palkanlaskentajärjestelmä

Sisällys. JAVA-OHJELMOINTI Osa 7: Abstrakti luokka ja rajapinta. Abstraktin luokan idea. Abstrakti luokka ja metodi. Esimerkki

TIETOJENKÄSITTELY/PIKATAIVAL2 Tehtävä G

Olio-ohjelmointi Javalla

on ohjelmoijan itse tekemä tietotyyppi, joka kuvaa käsitettä

Taustaa. CGI-ohjelmointi

15. Ohjelmoinnin tekniikkaa 15.1

Digitaalisen median tekniikat xhtml - jatkuu

Digitaalisen median tekniikat xhtml - jatkuu Harri Laine 1

Metodit. Metodien määrittely. Metodin parametrit ja paluuarvo. Metodien suorittaminen eli kutsuminen. Metodien kuormittaminen

Digitaalisen median tekniikat xhtml - jatkuu

Järjestelmäarkkitehtuuri (TK081702)

2. Lisää Java-ohjelmoinnin alkeita. Muuttuja ja viittausmuuttuja (1/4) Muuttuja ja viittausmuuttuja (2/4)

Tietojen syöttäminen ohjelmalle. Tietojen syöttäminen ohjelmalle Scanner-luokan avulla

Helsingin yliopisto, TKTL Tietokantojen perusteet, s 2000 WWW-tietokantasovellukset Harri Laine 1. vapaamuotoiset tiedot

Metodien tekeminen Javalla

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Rajapinnat ja sisäluokat

Sisällys. JAVA-OHJELMOINTI Osa 6: Periytyminen ja näkyvyys. Luokkahierarkia. Periytyminen (inheritance)

Sisältö Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 26.2

Operaattoreiden ylikuormitus. Operaattoreiden kuormitus. Operaattoreiden kuormitus. Operaattoreista. Kuormituksesta

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op Taulukot & Periytyminen

2 Web-lomakkeet. HTML-lomakkeet. Lomakkeiden perusteet

Taulukot. Jukka Harju, Jukka Juslin

14. Poikkeukset 14.1

Ohjelmoinnin jatkokurssi, kurssikoe

4. Luokan testaus ja käyttö olion kautta 4.1

Salasanojen turvallinen tallentaminen KeePass ohjelmalla

1.3 Lohkorakenne muodostetaan käyttämällä a) puolipistettä b) aaltosulkeita c) BEGIN ja END lausekkeita d) sisennystä

10 Lomakkeet Kontrollit. 10 Lomakkeet

Sisällys. 14. Poikkeukset. Johdanto. Johdanto

812341A Olio-ohjelmointi Peruskäsitteet jatkoa

Tikon ostolaskujen käsittely

16. Javan omat luokat 16.1

Opintojakso TT00AA11 Ohjelmoinnin jatko (Java): 3 op. Poikkeukset ja tietovirrat: Virhetilanteiden ja syötevirtojen käsittely

Ohjelmointi 2 / 2008 Välikoe / Pöytätestaa seuraava ohjelma.

Contact Form 7 -lomakkeen yhdistäminen Timeline Manageriin

Rinnakkaisohjelmointi kurssi. Opintopiiri työskentelyn raportti

Ohjelmassa henkilön etunimi ja sukunimi luetaan kahteen muuttujaan seuraavasti:

Sisällys. 1. Omat operaatiot. Yleistä operaatioista. Yleistä operaatioista

MOBISITE-TYÖKALUN SISÄLTÄMÄT TOIMINNOT

Osoitin ja viittaus C++:ssa

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

14. Poikkeukset 14.1

7. Näytölle tulostaminen 7.1

Rajapinnasta ei voida muodostaa olioita. Voidaan käyttää tunnuksen tyyppinä. Rajapinta on kuitenkin abstraktia luokkaa selvästi abstraktimpi tyyppi.

Ohjelmoinnin perusteet Y Python

Sisältö. Johdanto. Tiedostojen lukeminen. Tiedostojen kirjoittaminen. 6.2

JavaRMI 1 JAVA RMI. Rinnakkaisohjelmoinnin projekti 1 osa C Tekijät: Taru Itäpelto-Hu Jaakko Nissi Mikko Ikävalko

Action Request System

Sisällys. 6. Metodit. Oliot viestivät metodeja kutsuen. Oliot viestivät metodeja kutsuen

1. Omat operaatiot 1.1

Sisällys. Metodien kuormittaminen. Luokkametodit ja -attribuutit. Rakentajat. Metodien ja muun luokan sisällön järjestäminen. 6.2

Tikon ostolaskujen käsittely

Sisällys. 11. Rajapinnat. Johdanto. Johdanto

15. Ohjelmoinnin tekniikkaa 15.1

Osio 4: Tietovirrat. Properties- eli ominaisuustiedostot Logger: lokitietojen käsittely

Luokka Murtoluku uudelleen. Kirjoitetaan luokka Murtoluku uudelleen niin, että murtolukujen sieventäminen on mahdollista.

WWW-PALVELUN KÄYTTÖÖNOTTO LOUNEA OY

Pedacode Pikaopas. Java-kehitysympäristön pystyttäminen

9. Periytyminen Javassa 9.1

A) on käytännöllinen ohjelmointitekniikka. = laajennetaan aikaisemmin tehtyjä luokkia (uudelleenkäytettävyys)

Sisällys. 18. Abstraktit tietotyypit. Johdanto. Johdanto

18. Abstraktit tietotyypit 18.1

815338A Ohjelmointikielten periaatteet Harjoitus 5 Vastaukset

Android. Sähköpostin määritys. Tässä oppaassa kuvataan uuden sähköpostitilin käyttöönotto Android Ice Cream Sandwichissä.

Pedacode Pikaopas. Web-sovelluksen luominen

HSMT Tietokannoista. Ville Leppänen. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2008 p.1/32

Olet tehnyt hyvän valinnan hankkiessasi kotimaisen StorageIT varmuuskopiointipalvelun.

HTML & CSS. HTML (HyperText Markup Language) Antti Koivisto. ! HTML on sivujen kuvauskieli.

AJAX-konsepti AJAX. Asynkronisuus. Nykyisten web-ohjelmien ongelmia. Asynchronous JavaScript And XML

Kompositio. Mikä komposition on? Kompositio vs. yhteyssuhde Kompositio Javalla Konstruktorit set-ja get-metodit tostring-metodi Pääohjelma

Palvelinpuolen ohjelmointi

815338A Ohjelmointikielten periaatteet

Uutisjärjestelmä. Vaatimusmäärittely. Web-palvelujen kehittäminen. Versio 1.3

JSP (JavaServer Pages) tekniikka Lähde Arvo Lipitsäinen, JSP JavaServer Pages, 2003

Uutta Remote Support Platform 3.1 -versiossa

TIEDEJUTTUKURSSI FM VILLE SALMINEN

KIURU Tietotekniikan sovellusprojekti

UCOT-Sovellusprojekti. Asennusohje

ASP ja DHTML Seppo Räsänen

Harjoituksen aiheena on tietokantapalvelimen asentaminen ja testaaminen. Asennetaan MySQL-tietokanta. Hieman linkkejä:

1 www-sivujen teko opetuksessa

JReleaser Yksikkötestaus ja JUnit. Mikko Mäkelä

Transkriptio:

Luku 10 WWW ja servletit Servletti (engl. servlet) eli palvelinsovelma on Java-kielinen olio, joka toimii WWW-palvelimen yhteydessä olevassa virtuaalikoneessa. Kaikkiin WWW-palvelimiin ei kuitenkaan ole upotettu virtuaalikonetta, joten servlettejäkään ei voida suorittaa kaikkien WWW-palvelimien yhteydessä. Seuraavaksi luvussa 10.1 kerrotaan servlettien taustasta, roolista ja yleisestä toimintaideasta. Luvussa 10.2 kerrotaan mahdollisuudesta määritellä HTML-kielisille WWW-sivuille lomakkeita, joiden avulla voidaan kutsua mm. servlettejä toimittaen niille samalla käyttäjän antamia arvoja. Tämän jälkeen luvussa 10.3 tehdään katsaus servletteihin liittyviin luokkiin (mm. Servlet, HttpServlet, Http- ServletRequest, HttpServletResponse ja Cookie) ja niiden ominaisuuksiin. Servletteihin liittyvät luokat ovat paketeissa javax.servlet ja javax.servlet.http. Luvussa 10.4 esitetään tämän jälkeen kolme esimerkkiä palvelinsovelmien käytöstä. Loppukommentteja esitetään luvussa 10.5. Servlettejä on käsitelty monissa kirjoissa, mutta useimmissa käsittely on pinnallista tai puutteellista. Tätä kirjoitettaessa paras kirja lienee edelleen Java Servlet Programming, Jason Hunter & William Crawford, 1998. Kyseinen kirja käsittelee jopa tiedostojen siirtämistä HTTP-protokollalla servlettioliolle. 10.1 Johdanto Servletti eli palvelinsovelma on siis WWW-palvelimessa suoritettavaksi tarkoitettu (tietynlainen) Javaohjelma. Servletti kuten nimikin antaa ymmärtää on tietyssä mielessä samanlainen kuin applettikin. Servlettiin ei appletin tapaan liity main -metodia, mutta appleteista poiketen sillä ei voi olla edes graafista käyttöliittymää. Servleteillä on hyvin tarkkaan määrätty rooli WWW-palvelimien yhteydessä: niiden tehtävänä on dynaamisesti generoida WWW-sivuja. Kaikki palvelimet eivät tue servlettejä. Itse asiassa servletit eivät ole edes osa JDK:ta (ei edes versiossa 1.4), vaan ne on itse asennettava kääntäjän (ja mahdollisesti WWW-palvelimen) yhteyteen. Sun on tehnyt servleteistä JSDK-kokonaisuuden, jonka voi asentaa JDK:n yhteyteen ja jonka mukana tulee jopa pienimuotoinen servlettejä tukeva WWW-palvelin. Servlettien käyttämiseen liittyvät asiat ovat valitettavasti hieman WWW-palvelinkohtaisia asioita. Servlettejä suoritetaan palvelimen oikeuksilla. Servletti voidaan luoda uudelleen jokaisen WWWpalvelimeen kohdistuvan servletin kutsun seurauksena, mutta yleensä servletit ovat luonnin jälkeen pysyvä osa palvelinta. Tämä tarkoittaa, että servletit muistavat tilansa kutsukerrasta toiseen vaikka kutsuva taho onkin palvelimen sisällä olevan virtuaalikoneen ulkopuolella. Tällainen ominaisuus on erittäin hyödyllinen raskaissa sovelluksissa servletti voi esimerkiksi käsitellä tietokantaa niin, 101

102 LUKU 10. WWW JA SERVLETIT että tietokantayhteyttä pidetään koko ajan auki. Palvelinkohtainen asia on myös servlettien luonti ja alustus yleensä luonti tapahtuu sellaisella konstruktorilla, johon ei liity parametrejä ja luomisen jälkeen niitä käyttävä taho kutsuu niiden init()-metodia (parametrien määräämistapa on palvelinkohtainen asia). WWW-palvelimen tehtävänä on välittää HTML-sivuja palvelinta käyttäville WWW-selaimille. HTML-sivujen ideahan, että ne ovat tekstimuotoisia sisältäen muotoilukomentoja ja esim. viittauksia muihin dokumentteihin. Viittaukset muihin dokumentteihin ovat johonkin palvelimeen kohdistuvia URL-osoitteita kuljettaessa linkkiä pitkin kyseinen URL-välitetään URL:ssä mainitulle palvelimelle ja WWW-palvelimen tapauksessa palvelin lähettää selaimelle takaisin HTML-sivun. Tällainen dokumenttien noutaminen tapahtuu HTTP-protokollalla käyttäen GET, POST, PUT tai muutamaa muuta komentoa. Huomaa, että HTTP-protokolla on yhteydetön tässä mielessä on merkittävää, että servletit ovat pysyviä olioita. Toinen tärkeä huomio tässä yhteydessä on, että nykyään WWW-selaimet eivät ole passiivisten HTML-sivujen varastoja, vaan sivuja usein tuotetaan eri menetelmillä lennosta, dynaamisesti. Servlettien idea on juuri dynaamisessa WWW-sivujen generoinnissa. Kuvassa 10.1 havainnollistetaan servlettien toimintaympäristöä. www palvelin kone www selain GET komento HTML sivu verkkoyhteys www palvelin prosessi POST komento HTML sivu doget() dopost() servletti olioita Kuva 10.1: Palvelinsovelmien suorittaminen. Toinen servlettihin liittyvä idea on, että sivujen tuottamiseen voi liittyä raskasta laskentaa, joka tällä tavalla annetaan palvelimen tehtäväksi. Servletit ovat omimmillaan ns. kolmitasoarkkitehtuurien (3-tier) toteuttamisen yhteydessä: servletit ovat välitaso selaimen ja tietokannan välissä. Servletit on osin tehty korvaamaan ns. CGI-ohjelmointi. Koska servlettejä kutsutaan HTML-sivuilta WWW-selaimen toimesta, niin herää kysymyksiä: (1) miten kutsun yhteydessä voidaan välittää tietoja ja (2) voiko servletti toimia yhteen WWWselaimessa suoritettavan appletin kanssa? Eräs tapa välittää tietoa WWW-palvelimelle ja sitä kautta servleteille ovat HTML-kielen FORM-määritykset, eli ns. lomakkeet. Näitä käsitellään tarkemmin kohdassa 10.2. Idea on kuitenkin se, että voidaan antaa käyttäjän täyttää joitakin lomakkeen kohtia ja samalla määritellä, mitä URL:ää kutsutaan kun lomake on täytetty. Kutsuminen tarkoittaa mm. HTTP-protokollan mukaisen GET- tai POST-komennon lähettämistä lomakkeessa täytetyt tiedot koodautuvat automaattisesti tällaisen viestin yhteyteen ja ne voidaan servletissä saada helposti selville.

10.2. LOMAKKEISTA 103 Toisen kysymyksen suhteen tilanne on valitettavasti sellainen, että servlettejä ja appletteja ei ole tehty kommunikoimaan keskenään! Perusajatus on, että servlettiä kutsutaan HTTP-protokollaa käyttäen. Voidaan toimia niin, että appletti avaa HTTP-yhteyden WWW-palvelimeen (ja jäsentää tuloksen vastauksena saamastaa HTML-sivusta), mutta tuolloin appletti tavallaan itse toimii selaimena selaimen sisällä vaikkakin mahdollista, niin kovin järkevää tällainen toiminta ei ole. Itse asiassa servletin ja appletin välille on mahdollista luoda myös soketti- ja/tai RMI-yhteys, mutta tämä ei ole kovin luonnollista ajatellen servlettien toimintaympäristöä. Tuolloin servlettejä käytettäisiin ohi niiden normaalin rajapinnan. Soketti- ja RMI-yhteyksiä ei käsitellä tässä yhteydessä. 10.2 Lomakkeista HTML-kielen lomakkeet 1 (engl. forms) ovat tapa välittää tietoa servleteille HTTP-protokollan yli. Servlettejä kutsuvat lomakkeet näyttävät HTML-koodissa seuraavalta: <FORM METHOD="POST" ACTION="http://kohdekone/servlets/OmaServletti">... määrityksiä </FORM> METHOD-kohdassa määritellään käytettävä HTTP-protokollan komento. Arvo POST ei ole ainoa mahdollinen itse asiassa GET :n merkitys on sama kuin POST :kin. Niiden ero on lähinnä tekninen ja syy osittain vanhentunut GET :n yhteydessä on aikoinaan ajateltu lähetettävän vain hyvin vähän muuta tietoa ja POST :n yhteydessä voidaan lähettää vaikka tiedostoja asiakkaalta WWWpalvelimelle. 10.2.1 FORM:n määrityksistä FORM-määrityksen sisällä on lisää määrityksiä, joiden avulla voidaan muodostaa HTML-sivulle jo tutuksi tulleita yksinkertaisia GUI-komponentteja. Näistä määrityksistä tehdään seuraavaksi selkoa. Tarkemmin asiat on määritelty HTML 4.01:n määrittelyssä (www.w3c.org). Kenttä Kenttä on määre, joka on muotoa <INPUT TYPE="tyyppi" NAME="nimi" VALUE="arvo"> Idea on, että määritellään nimi -niminen resurssi, jolla on alkuarvo arvo. Edellisessä tyypillä voi olla useita arvoja ja sen mukaan määräytyy WWW-sivulle syntyvä GUI-komponentti. Komponentin tyypin mukaan määräytyy tapa, jolla arvo voi muuttua. Mahdollisia arvoja tyypille ovat TYPE="text" Esittää tekstikenttäkomponenttia, johon voidaan kirjoittaa tekstiä. TYPE="radio" Esittää radionappulaa ja NAME:n arvo kertoo ryhmän. VALUE:lla voidaan välittää tieto siitä, mikä saman ryhmän radionappuloista painettu pohjaan. 1 Ks. http://www.w3c.org/tr/html4/interact/forms.html.

104 LUKU 10. WWW JA SERVLETIT TYPE="checkbox" Esittää valintaruutua. Toiminta on radionappuloiden tapaista, mutta NAME:a vastaava arvo esiintyy resurssina vain jos jokin kyseisen NAME-arvon omaavista valintaruuduista on painettu pohjaan. Resurssin VALUE:n arvona ovat kaikkien niiden valintaruutujen VALUE-osien arvot, joita vastaava kyseisen niminen valintaruutu on painettu pohjaan. TYPE="submit" Erityinen nappula, jota painamalla FORM:n ACTION osa käynnistyy. VALUEosalla voidaan asettaa nappulan teksti (oletusarvoisesti submit ). TYPE="reset" Tämä muodostaa myös nappulan kuten submit, mutta tarkoituksena on palauttaa painamisen seurauksena kaikkien kenttien arvo niiden alkuarvoiksi. TYPE="image" Kuten submit, mutta nappulan sisältönä kuva. TYPE="password" Kuten text, mutta esittää salasanakenttää. TYPE="file" Esittää tiedoston nimen valintatyökalua. Valittava tiedosto lähetetään HTTP-komennon mukana MIME-koodattuna, jos lomakkeen otsikossa on on seuraava määritys: ENCTYPE="multipart/mime". TYPE="hidden" Piilokenttä vakioarvon välittämiseksi. Esimerkiksi seuraava FORM-määrittely <FORM action="http://koneen-nimi/adduserservlet" method="post"> <P> First name: <INPUT type="text" name="firstname"><br> Last name: <INPUT type="text" name="lastname"><br> email: <INPUT type="text" name="email"><br> <INPUT type="radio" name="sex" value="male"> Male<BR> <INPUT type="radio" name="sex" value="female"> Female<BR> <INPUT type="submit" value="send"> <INPUT type="reset"> </P> </FORM> näyttää selaimessa seuraavalta

10.3. SERVLETTIEN TEKEMISESSÄ TARVITTAVIA LUOKKIA 105 Valintalista Valintalista on myös jo tuttu GUI-komponentti. HTML:n FORM:ien yhteydessä se määritellään seuraavasti <SELECT NAME="nimi"> <OPTION>Vaihtoehto nro1</option> <OPTION SELECTED>Vaihtoehto nro2</option> <OPTION>Vaihtoehto...</OPTION> </SELECT> Eli, kutakin vaihtoehtoa kohti määritellään <OPTION>-rivi. NAME on samassa roolissa kuin kentän yhteydessä. Tavallaan tämä on kenttä, jonka arvo valitaan annetusta joukosta. SELECTED tarkoittaa, että yksi on jo valittuna 2. Tekstialue Tekstikentän yleistys, tekstialue, on myös osana FORM:a. Sen määrittelyn muoto on pelkistetysti alla olevan muotoinen. ROWS ja COLS saavat arvokseen positiivisia kokonaislukuja. Muita <TEXTAREA NAME="nimi" ROWS="rivit" COLS="sarakkeet"> Tässä voi antaa tekstin oletusarvon. </TEXTAREA> Itse asiassa muitakin määreitä on mm. nappula, mutta niistä ei tehdä selkoa tässä yhteydessä. 10.3 Servlettien tekemisessä tarvittavia luokkia Servlettien tekemissä tarvittavat luokat eivät ole osa JDK:ta (ei edes versiossa 1.4), vaan ne löytyvät mm. Sunin JSDK-paketista 3. JSDK koostuu kahdesta paketista: javax.servlet ja javax.servlet.http. Niissä on n. 40 luokkaa tai rajapintaa. Olennaisimmat näistä ja niiden väliset perimyssuhteet on esitetty kuvassa 10.2 (italics-tyyliset ovat rajapintoja). Luokka Servlet on rajapinta, jonka toteuttavat abstraktit luokat GenericServlet ja HttpServlet. Servlet-luokalla ei ole juurikaan metodeja erityisesti ei yhtään suoraan HTTP:hen liittyvää metodia; ks. taulukko 10.1. Luokalla GenericServlet on jo aika runsaasti metodeja. Ne liittyvät lähes poikkeuksetta servlettiä kutsuvan tahon tietojen havainnointiin ja ylipäänsä hallinnollisiin asioihin. Tässäkään luokassa ei ole mitään HTTP:hen liittyvää luokan GenericServlet metodeja ei tässä yhteydessä esitetä. Taulukkoon 10.2 on kerätty joitakin luokan HttpServlet metodeja itse asiassa kaikki muut hyödylliset metodit on peritty luokan GenericServlet kautta. Jokaista HTTP-protokollan mukaista komentoa kohti on luokassa metodi. Metodien muoto on täsmälleen sama metodien semantiikasta vastaa niiden toteuttaja. Oletusarvoisesti metodit eivät tee mitään. Huomaa, että periaatteessa voisi toimia niin, että lomakkeessa kutsuu DELETE-komennolla servlettiä, mutta (tiedoston) tuhoamisen sijaan voi vapaasti määritellä, miten servlettiolio reagoi kyseiseen komentoon. Metodien semantiikan tulisi kuitenkin olla HTTP-protokollan komentojen semantiikan mukaista. 2 Itse asiassa useitakin voidaan valita; katso tarkempi SELECT:n kuvaus HTML 4.01:n määrittelystä. 3 Ks. http://java.sun.com/products/servlet/.

106 LUKU 10. WWW JA SERVLETIT ServletResponse Servlet ServletRequest GenericServlet HttpServletResponse HttpServlet HttpServletRequest Cookie Kuva 10.2: Muutamia servletteihin liittyviä luokkia ja niiden väliset perimyssuhteet. void init(servletconfig c) Servlettiolion alustus; kutsutaan vain kerran; c tulee palvelimelta. void service(servletrequest rq, ServletResponse rs) Servletin kutsu ohjataan ensin tähän metodiin. Taulukko 10.1: Joitakin rajapinnan Servlet metodeja. Seuraavaksi esittelyvuorossa on rajapinta HttpServletRequest (taulukko 10.3). Sillä on varsin runsaasti havainnointimetodeja, joiden kautta voidaan havainnoida sitä, mitä tietoa HTTP-komennon yhteydessä on servlettioliolle välitetty. Rajapinnan HttpServletResponse metodeita on lueteltu taulukossa 10.4. Lähinnä hyödyllisiä ovat muodostettavan sivun tyypin asettaminen, piparien liittäminen palautettavaan sivuun ja getwriter, jolla otetaan käyttöön tiedostovirta, jonne muodostettava sivu tulee kirjoittaa. Edellisten lisäksi hyödyllinen luokka on myös Cookie (taulukko 10.5), jolla on lähinnä konstruktori sekä metodeja pipariin (engl. Cookie) liittyvien ominaisuuksien asettamiseksi ja havainnoimiseksi. Piparin avulla palvelin voi tallettaa asiakkaaseen (siis asiakkaana olevan selainohjelman yhteyteen) tietoa itsestään ja yhteydestään tähän asiakkaaseen. Piparit ovat erittäin hyödyllisiä servlettien yhteydessä piparien tarkoitus on tarjota palvelimelle selaimesta muistipaikka, jonne se voi taltioida haluamaansa tietoa. Piparien olennaiset ominaisuudet on selitetty taulukon 10.5 yhteydessä. 10.4 Esimerkkejä 10.4.1 Esimerkki HelloServlet Esimerkissä 10.1 on esitetty HTML-tiedosto, jolla on vain yksi nappula. Nappulan painamisen seurauksena kutsutaan (bg.cs.utu.fi-koneen) servlettiä HelloServlet (ja esitetään tuloksena saatava HTMLsivu).

10.4. ESIMERKKEJÄ 107 protected void dodelete(httpservletrequest rq, HttpServletResponse rs) Käsittelee HTTPprotokollan mukaisen DELETE-komennon. protected void doget(httpservletrequest rq, HttpServletResponse rs) Käsittelee HTTPprotokollan mukaisen GET-komennon. protected void dohead(httpservletrequest rq, HttpServletResponse rs) Käsittelee HTTPprotokollan mukaisen HEAD-komennon. protected void dooptions(httpservletrequest rq, HttpServletResponse rs) Käsittelee HTTP-protokollan mukaisen OPTIONS-komennon. protected void dopost(httpservletrequest rq, HttpServletResponse rs) Käsittelee HTTPprotokollan mukaisen POST-komennon. protected void doput(httpservletrequest rq, HttpServletResponse rs) Käsittelee HTTPprotokollan mukaisen PUT-komennon. protected void dotrace(httpservletrequest rq, HttpServletResponse rs) Käsittelee HTTPprotokollan mukaisen TRACE-komennon. protected void service(httpservletrequest rq, HttpServletResponse rs) Tätä metodia varsinaisesti kutsutaan WWW-selaimen toimesta; komennon mukaan tämä kutsuu edellisiä. Taulukko 10.2: Joitakin luokan HttpServlet metodeja. String getparameter(string p) Palauttaa lomakkeelta lähetetyn parametrin p arvon. Enumeration getparameternames() Kaikkien komennon yhteydessä välittyjen parametrien nimet. Cookie[] getcookies() Palauttaa sisääntulevat piparit! ServletInputStream getinputstream() Binäärinen lukuvirta lähetettyyn dataan. BufferedReader getreader() Sama tekstipohjaisena. String getcontenttype() Kertoo missä MIME-muodossa komennon yhteydessä välitettävä data tulee. int getcontentlength() Datan pituus. getremotehost, getremoteaddr, getremoteuser, getmethod, getservername, getserverport,... Taulukko 10.3: Joitakin rajapinnan HttpServletRequest metodeja. Esimerkki 10.1 HelloServlet.html HTML-tiedosto, joka käynnistää yksinkertaisen servletin. <html> <head><title> HelloServlet </title></head> <body> <h2> HelloServlet:n käynnistävä sivu </h2> <form method="get" action="http://bg.cs.utu.fi:8080/servlet/helloservlet"> <input type=submit value="push"> </form> </body> </html>

108 LUKU 10. WWW JA SERVLETIT ServletOutputStream getoutputstream() Palauttaa binäärisen lähtevän virran. PrintWriter getwriter() Sama merkkipohjaisena; tällä toteutetaan sivujen kirjoittaminen. void setcontenttype(string c) Asettaa ulosmenevän sivun koodaukseksi c:n; esimerkiksi text/html. void senderror(int code, String msg) Palauttaa virheilmoitussivun takaisin virhekoodilla code ja viestillä msg. void addcookie(cookie c) Asettaa piparin lähtevään virtaan. Taulukko 10.4: Joitakin rajapinnan HttpServletResponse metodeja. Kuva 10.3: HelloServlet.html:n suorittaminen. Kuvassa 10.3 on esitetty tilanne, jossa selaimella suoritetaan lomakkeen sisältävää HTML-tiedostoa HelloServlet.html. Kuvassa 10.4 on vastaavasti tilanne, jossa HTML-sivun push -nappulan painamisen seurauksena on suoritettu esimerkissä 10.2 oleva servletti. Servletti on tuottanut kuvassa olevan HTML-sivun. Kuva 10.4: Tilanne HelloServlet.html:n push -nappulan painamisen jälkeen.

10.4. ESIMERKKEJÄ 109 Cookie(String name, String value) Konstruktori, joka luo piparin, jolla nimi name ja arvo value (RFC 2109). boolean getsecure() Onko turvallinen yhteys käytössä? HTTPS tai SSL. Voidaan asettaa (setxxx-metodi) ja havainnoida (getxxx-metodi) useita ominaisuuksia: kommentti (Comment) mikä on tämän piparin merkitys; voimassaoloaika (MaxAge) selain ei lähetä piparia enää takaisin, jos voimassaoloaika on mennyt umpeen; URL-polku (Path) määrittää polun palvelimen sisältä; aina kun selain pyytää jotain sivua, jonka etuliitteenä on tämä polku, lähetetään tämä pipari komennon mukana; oletusarvoisesti piparit liittyvät vain siihen sivuun, jonka yhteydessä ne ensimmäisen kerran välitettiin selaimelle; domain-nimi (Domain) edellisen laajennos, pipari voidaan välittää nyt URL:ään liittyvän domain nimen mukaan; arvo (Value) merkkijono, joka sisältää sen datan, jonka palvelin haluaa piparin mukana taltioida selaimeen; nimi (Name) piparin nimi; versionumero (Version) tuetaan versioita 0 & 1 (RFC 2109); ja turvallisuus (Secure) onko pipari välitetty turvallisen yhteyden yli. Taulukko 10.5: Joitakin luokan Cookie metodeja. Esimerkki 10.2 HelloServlet.java yksinkertainen servlettiohjelma. import javax.servlet. ; import javax.servlet.http. ; import java.io. ; public class HelloServlet extends HttpServlet { public void doget(httpservletrequest rq, HttpServletResponse rs) throws IOException, ServletException { rs.setcontenttype("text/html"); PrintWriter out = rs.getwriter(); out.println("<html>"); out.println("<title> Hello there! </title>"); out.println("<body>"); out.println("<img SRC=http://www2.cs.utu.fi/icons/slidbar.gif ALT=>"); out.println("<h1> Tervehdys! </h1>"); out.println("<img SRC=http://www2.cs.utu.fi/icons/slidbar.gif ALT=>"); out.println("</body></html>"); } // doget } // class HelloServlet

110 LUKU 10. WWW JA SERVLETIT Esimerkissä 10.2 oleva ohjelma perii HttpServlet luokalta kaikkiin HTTP-protokollan komentoihin reagoivat metodit, mutta antaa uuden toteutuksen vain yhdelle niistä: doget :lle. Huomaa, miten metodin toteutuksessa ei välitetä lainkaan siitä, mitä servlettioliolle annetaan HttpServletRequesttyyppisen parametrin kautta, vaan servletti vain vakiomuotoisesti kirjoittaa vastauksena HTML-sivun ServletResponse-tyyppiseen parametriin liittyvän tiedostovirran kautta. 10.4.2 Esimerkki hieman monimutkaisemmasta servletistä Esimerkissä 10.3 on esitetty HTML-tiedosto, jossa käytetään useita kohdassa 10.2 kuvattuja lomakkeen komponentteja.

10.4. ESIMERKKEJÄ 111 Esimerkki 10.3 LomakeServlet.html HTML-tiedosto, joka käynnistää lomakkeen tiedot vastaanottavan servletin. <html> <head> <title> Lomakkeen välittämistä... </title> </head> <body> <p> Täytä seuraavat ja paina lopuksi lähetä. </p> <form method=post ENCTYPE="multipart/mime" ACTION=http://bg.cs.utu.fi:8080/servlet/LomakeServlet> <input type=hidden name="piiloarvo" value="oletusarvo"> <p> Nimi: <input type=text name="kentta1" value=""> </p> <p> Osoite: <input type=text name="kentta2" value="osoite"> </p> <p> Salasana: <input type=password name="kentta3" value=""> </p> <p> Opinnot aloitettu: <select name="opinnot"> <option> muu </option> <option selected> 1999 </option> <option> 2000 </option> <option> 2001 </option> </select> <p> Valitse jokin: <input type=radio name="valinta" value="1999"> <input type=radio name="valinta" value="2000"> <input type=radio name="valinta" value="2001"> </p> <p> Valitse tiedosto: <input type=file name="tiedosto" accept="html"> </p> <p> <input type=reset value="resetoi"> <input type=submit value="lähetä"> </p> </form> </body> </html> Kuvassa 10.5 on esitetty tilanne, jossa selaimella suoritetaan LomakeServlet.html -tiedostoa. Kuvassa 10.6 on vastaavasti tilanne, jossa HTML-sivun lähetä -nappulan painamisen seurauksena on suoritettu esimerkissä 10.4 oleva servletti. Servletti on tuottanut kuvassa olevan HTML-sivun.

112 LUKU 10. WWW JA SERVLETIT Kuva 10.5: LomakeServlet.html:n suorittaminen. Esimerkki 10.4 Servletti, joka vain selvittää, mitä parametrien kautta sille on lähetetty. import javax.servlet. ; import javax.servlet.http. ; import java.io. ; public class LomakeServlet extends HttpServlet { public void dopost(httpservletrequest rq, HttpServletResponse rs) throws IOException, ServletException { String[] q = { "PiiloArvo", "Kentta1", "Kentta2", "Kentta3", "Opinnot", "Valinta", "Tiedosto" }; rs.setcontenttype("text/html"); PrintWriter out = rs.getwriter(); out.println("<html>"); out.println("<title> Vastaanotettiin seuraavaa </title>"); out.println("<body>"); for (int i=0; i<q.length; i++) { out.print("<p> " + q[i] + "= "); out.print(rq.getparameter(q[i])); out.println("</p>"); } out.println("</body></html>"); } // dopost } // class LomakeServlet Esimerkin 10.4 ohjelma muodostaa myös HTML-sivun, mutta esimerkistä 10.2 poiketen käyte-

10.5. LOPUKSI 113 Kuva 10.6: Tilanne LomakeServlet.html:n lähetä -nappulan painamisen jälkeen. tään hyväksi HttpServletRequest-tyyppisen parametrin kautta välitettyjen parametrien arvoja. Arvojen sisältö vain tulostetaan sivun sisällöksi. 10.5 Lopuksi Servletit ovat WWW-palvelimessa olevia olioita, joita voidaan HTTP-protokollaa käyttäen kutsua ne säilyttävät tilansa kutsusta toiseen. Koska servlettiä käytetään HTTP:n kautta, servlettien pääasiallinen toimintaidea on dynaaminen HTML-sivujen generointi ja toisaalta työn osittainen siirtäminen palvelimelle. Servlet applet -keskustelu on periaatteessa mahdollinen, esimerkiksi soketeilla ja RMI:llä (käytetään säikeitä apuna), mutta sellainen keskustelu ohittaa HTTP-protokollan. Keskustelun saa toki myös aikaan HTTP-protokollan avulla, mutta tuolloin appletti joutuu esimerkiksi jäsentämään tuloksen servletin lähettämästä HTML-sivusta (hyvin epäluonnollista). HTTP-protokollan yhteydettömyyteen saadaan ratkaisuja pipareista ja siitä, että servlettioliot säilyttävät tilansa (niin kauan kun WWW-palvelin on pystyssä). Piparit tuovat selkeästi erään ratkaisu useiden samanaikaisten käyttäjien erotteluun servletin kannalta. Usein servlettien avulla halutaan tallettaa (lomakkeen kautta syötettyjä) tietoja tietokantaan tai vastaavasti lukea joitakin tietoja tietokannasta. Tähän tarkoitukseen servletit soveltuvat erittäin hyvin. Eräs näppärä tapa toteuttaa sivusto servlettien avulla on olla kirjoittamatta lainkaan HTML-sivuja. HTML-sivut voidaan nimittäin koodata osaksi servlettiä. Voidaan toimia niin, että servletin doget - metodi palauttaa HTML-sivun, jossa on mukana lomake, joka kutsuu samaa servlettiä POST-menetelmällä, käyttäen siis sen dopost -metodia. Servletteihin liittyy läheisesti myös esimerkiksi JSP (Java Server Pages), mutta sitä ei tämä oppimateriaalin puitteissa käsitellä. Lopuksi pitää hieman harmillisesti todeta, että vaikka HTML-sivujen

114 LUKU 10. WWW JA SERVLETIT avulla on mahdollista lähettää tiedostoja MIME-koodatusti servlettioliolle, niin kyseisten tiedostojen jäsentämistä ei ole toteutettu juuri missään erityisesti Javan luokkakirjastoista ei löydy tukea asialle (tämän luvun alussa mainitussa kirjassa tosin näytetään, miten se on mahdollista tehdä).