Web-sovelluksen rakenteesta

Harri Laine, 23.1.2006

Sisältö:

 

Selainasiakas ja palvelin

Web-sovellus on erikoistapaus hajautetusta tietojärjestelmästä. Web-sovelluksessa käyttöliittymänä toimivat selaimessa näytettävät sivut, jotka tuotetaan jollakin palvelimella ja välitetään tietoverkon kautta selaimelle. Tuotettavat sivut perustuvat yhdeltä tai useammalta palvelimelta saatavaan tietoon ja ne tuotetaan vastauksena selaimen lähettämään aineistopyyntöön.

Sivu muodostuu perusosasta ja joukosta lisäosia, esimerkiksi kuvia. Perusosa toimitetaan selaimelle alkuperäisen aineistopyynnön tuloksena. Lisäosista selain lähettää erilliset aineistopyynnöt. Tiedot tarvittavista lisäosista sisältyvät sivun perusosaan. Sivu on yleensä esitetty HTML-kielellä.

Resurssipaikannin

Aineistopyynnöt esitetään resurssipaikantimien (universal resource locator, URL) avulla Resurssipaikantimeen sisältyy

Esimerkiksi resurssipaikantimessa

http://www.cs.helsinki.fi/u/laine/tsoha/esimerkki.html

Selaimen kyvyt

Selaimet osaavat ilman täydennysosia:

Täydennysosilla (plugin) varustettuna selaimet voivat osata

 

Palvelin ja palvelu

Palvelin voi olla moniosainen usean ohjelmiston ja jopa usean laitteen kokonaisuus. Yksinkertaisimmillaan se on perinteinen www-palvelin, esimerkiksi Apache, joka ottaa vastaan aineistopyyntöjä ja osaa toimittaa asiakkaalle palvelimen tiedostojärjestelmästä valmiina löytyviä staattisia sivuja sekä käynnistää ohjelmia tuottamaan dynaamisia, ei valmiina olevia sivuja. Palvelin voi olla myös monipuolisempi sovelluspalvelin, joka edellisten toimintojen lisäksi osaa hoitaa esimerkiksi istunnonhallintaa, kuormantasausta ja oikeuksien valvontaa sekä yhteyksiä erilaisiin ulkopuolisiin tietolähteisiin kuten tietokantapalvelimiin.

Dynaamiset sivut ja palvelinohjelmat

Perinteinen tapa dynaamisten sivujen tuottamiseen on CGI-tekniikka (Common gateway interface). Tässä tekniikassa www-palvelinohjelmisto käynnistää palvelinkoneessa toimivan resurssipaikantimella identifioidun ohjelman, välittää sille aineistopyynnön yhteydessä saamansa yhteystiedot ja parametrit sekä ohjaa ohjelman tulosteet aineistoa pyytäneelle selaimelle. Ohjelma käynnistyy omana prosessinaan, joka kuolee pois kun suoritus on päättynyt.

Käynnistettävä ohjelma voi olla kirjoitettu millä ohjelmointikielellä tahansa. CGI-rajapinnan kautta ohjelma saa ympäristömuuttujien kautta käyttöönsä aineistopyynnön yhteydessä välitetyn datan. Ympäristömuuttujia ovat mm.:

Ohjelmalla on pääsy näihin tietoihin. Tapa, jolla tietoja kysytään ohjelmassa on kuitenkin ohjelmointikieli- ja myös ajoympäristökohtaista ja saattaa edellyttää jonkin ohjelmakirjaston käyttöä.

Parametrit

Dynaamisia sivuja tuottavat ohjelmat toimivat yleensä parametrien ohjaamana. Parametritietoa voidaan välittää evästeessä. HTML -lomakkeelle täytetty tieto välitetään joko ympäristömuuttujassa QUERY_STRING (jos välitystapa on GET) tai standardisyöttövirrassa erillisenä tiedostona (jos välitystapa on POST). Resurssipaikantimeen liittyvä parametriosa välitetään muuttujassa QUERY_STRING.

Kaikissa parametrien välitystavoissa parametrikokoelma esitetään merkkijonona, joka muodostuu NIMI=ARVO -pareista. Parien erotinmerkki on evästeen kohdalla eri merkki (puolipiste) kuin muissa tapauksissa (&). Sekä nimi että arvo ovat merkkijonoja. Sama nimi voi esiintyä useassa parissa. Eri ohjelmointikielet tarjoavat erilaisia keinoja NIMI=ARVO -parien käsittelyyn. Yleensä on tarjolla funktio, jolla arvo voidaan hakea nimen perusteella. Samoin on yleensä tarjolla funktiot kaikkien parametrien läpikäyntiin.

Tarkastellaan esimerkkinä HTML-koodattua linkkiä

<a href="http://ilmo.cs.helsinki.fi/ilmo?laitos=T&kieli=FI">Ilmoittautuminen</a>

Resurssipaikantimen yhteydessä annetaan 2 parametria, ja muuttujassa QUERY_STRING välitetään ohjelmalle ilmo tällöin merkkijono 'laitos=T&kieli=FI'.

Ohjelman laatija päättää parametrien nimet ja niihin liittyvän merkityksen, eli mihin ohjelma nimeen liittyviä arvoja käyttää. Arvot välitetään ohjelmalle merkkijonoina, mutta merkkijonon sisältönä voi tietenkin olla numeerista tietoa.

Parametrien yhteys HTML-lomakkeeseen

Parametreja voidaan antaa resurssipaikantimen yhteydessä, mutta yleisempää on parametriarvojen kerääminen HTML-lomakkeella. Tällöin käynnistettävä ohjelma määritellään lomakkeen käsittelijäksi. Lomakkeen vuorovaikutteisille elementeille annetut name-attribuutin arvot välitetään parametrien niminä, ja kunkin elementin value-attribuutin arvo tai syöttökenttään kirjoitettu merkkijono välitetään vastaavasti parametrin arvona.

Tarkastellaan esimerkkinä lomaketta:

<form name="esimerkkilomake" action="ohjelma" method="get">

First: <input type="text" name="first" size="20" value="Initial value 1"><br> Second: <input type="text" name="second" size="20" value=""><br> Really? <br> <input type="radio" name="third" value="yes" checked>Yes <lt;input type="radio" name="third" value="no">No<br> <input type="submit" name="submit" value="Submit"> </form>

Lomakkeella on kaksi tekstikenttää, kaksi samaan ryhmään kuuluvaa valintanappia ja lähetyspainike. Oletetaan, että lähetyspainiketta painetaan koskematta lomakkeen tietoihin. Tällöin kohteelle ohjelma (tämä olkoon suhteellinen resurssitunniste, eli polku on sama kuin lomakkeen sisältävän sivun polku) lähetetään aineistopyyntö, jonka parametrit ovat

first=Initial+value+1&second=&third=yes&submit=Submit

Oletetaan, että lomaketta on käsitelty ennen lähetyspainikkeen painamista siten, että kenttään first on kirjoitettu arvo "chaged value 1" ja kenttään second arvo "edited" sekä valintanappeja on näpläilty niin, että valittuna on "No". Tällöin aineistopyyntöön liittyvät parametrit olisivat:

first=changed+value+1&second=edited&third=no&submit=Submit

Esimerkeistä nähdään, että blankot on muutettu plus-merkeiksi (+). Myös eräät muut merkit, esimerkiksi '&','<','>' ja skandimerkit, välitetään URL-koodattuina (URL encoded). Parametrien käsittelyyn tarkoitetut ohjelmafunktiot huolehtivat koodauksen purkamisesta, joten jos parametrin first arvoa kysytään vaikkapa Javan metodilla getParameter("first") saadaan tuloksena plussista karsittu merkkijono, jälkimmäisessä tapauksessa siis "changed value 1".

Yllä olevassa esimerkissä lähetyspainikkeellekin on annettu nimi (submit). Jos lähetyspainikkeen jättää nimeämättä, ei siihen liittyvää arvoakaan lähetetä parametrina.

HTML-lomakkeessa tyypillisesti käytettyjä elementtejä ovat

Selain kokoaa lähetettävät parametrit siinä järjestyksessä, missä ne esiintyvät HTML-lomakkeella. Esiintymisjärjestykseen ei kuitenkaan pääse käsiksi kaikilla ohjelmointikielillä ja kirjastoilla. Jos usealla lomakkeen elementillä on sama nimi, voi ohjelmointiympäristö näyttää nimeen liittyvät arvot merkkijonotaulukkona. Tällöin parametriarvon yhteys ympäristöönsä saattaa kadota. Lomakkeella voisi olla esimerkiksi taulukko, jossa on yksi rivi kutakin työntekijää kohden. Jos kullakin rivillä on samannimiset elementit ja osa niistä on poimintaruutuja, voi poimintaruutuparametrien yhteys riviinsä kadota ellei yhteyttä koodata jotenkin elementin arvoon.

Web-sovellus lomakkeiden sarjana

Web-sovellusten toiminta perustuu usein monen peräkkäisen sivun ja lomakkeen sarjaan. Sarjan seuraava lomake tuotetaan lomakekäsittelijässä edellisen lomakkeen tietojen perusteella.

CGI-tekniikalla toteutetuissa web-sovelluksissa lomakkeiden käsittelijät toimivat erillisinä prosesseina, jotka päättyvät ohjelman loppuessa. Tällöin kaikki tieto, mitä oli ohjelman muistissa katoaa. Peräkkäisiin lomakkeisiin liittyy kuitenkin yleensä yhteistä tietoa, esimerkiksi tietoa käyttäjästä ja käyttäjän aiemmista tekemisistä. Sovelluspalvelimia käytettäessä voidaan joitain tietoja säilyttää palvelimen muistissa, mutta tällöinkään ei päästä suoraan jatkamaan lomakkeen tuottanutta ohjelmaa siitä tilasta, johon se jäi tuotettuaan lomakkeen. Web sovellusta toteutettaessa on myös syytä pitää mielessä, että samaan palvelinohjelmaan kohdistuvia käynnistyspyyntöjä voi tulla useasta eri lähteestä samanaikaisesti. Samastakin lähteestä voi tulla useita pyyntöjä. Esimerkiksi tilanteessa, jossa pyynnöt tulevat proxyn kautta, proxy ilmoittaa lähettäjäksi oman IP-osoitteensa eikä todellista asiakkaan osoitetta.

Jos lomakkeen käsittelijän sisäistä tietoa halutaan välittää sarjan seuraavalle käsittelijälle, ei tätä pystytä tekemään pelkästään palvelimessa, vaan jotain tietoa täytyy kierrättää selaimen kautta. Kaikkea tietoa ei tarvitse kierrättää. Jos palvelin tallentaa tiedot omaan tietokantaansa tai sovelluspalvelimen muistiin, riittää kierrättää jokin yksilöivä tieto, jonka perusteella seuraava käsittelijä pystyy hakemaan tallennetut tiedot. Tyypillinen kierrätettävä tieto on yleensä satunnaisesti generoitu istuntotunnus. Säilytettävät tiedot tallennetaan palvelimelle siten, että ne pystytään istuntotunnuksen perusteella hakemaan.

Kierrätykseen on erilaisia mahdollisuuksia:

Näiden tapojen hyviä ja huonoja puolia on käsitelty mm.Gunter Ollmannin artikkelissa: Web Based Session Management.