TEKSTI: PASI KOVANEN "Taas uusi tekniikka dynaamisten webbisivujen tekoon?!", parahtavat naavapartaiset Perl- ja asp-gurut ja kääntävät sivua. Malttakaa kuitenkin hetki, sillä JavaServer Pages tarjoaa lukuisia parannuksia vanhempiin tekniikoihin. JavaServer Pages Dynaamista PC WORLD web-ohjelmointia Sunin määrittelemä JSP 1.1 (javaserver pages) yhdistää Microsoftin ASP:n (active server pages) ja wwwpalvelimella ajettavien Java-ohjelmien eli servletien parhaat puolet. Siinä missä ASP on tulkattava kieli, perustuu JSP tavallisiin käännettyihin servleteihin. Tämän ansiosta JSP on huomattavasti ASP:tä suorituskykyisempi. Www-sivujen suunnittelijalle JSP-sivu näyttää ASP-sivun kaltaiselta. Ohjelmakoodin tunnisteena käytetään samoja <% %> -tageja, joten sivujen muokkaus onnistuu myös vaikka Dreamweaver-editorilla. Mutta siihen yhtäläisyydet oikeastaan loppuvatkin. Palvelimelle määritellään tiedostopäätteet, jotka sisältävät JSP-koodia. Yleensä päätteenä käytetään.jsp:tä. Kun web-palvelimelta pyydetään tällaista sivua ensimmäisen kerran, käy niin sanottu JSP container -sovellus sivun läpi ja generoi siitä tavallista java-koodia, joka käännetään servletiksi. Koodi tallennetaan erityiseen cache-hakemistoon, josta sitä voi tarkastella. Tarvittaessa JSP-sivuilla voidaan käyttää Javan sijasta muitakin ohjelmointikieliä, mikä tosin on harvinaista. Nirso JSP-parseri ymmärtää vain JSP-tageja ja päästää kaikki muut merkit läpi tulostamalla ne yksinkertaisesti out.print()- metodilla. JSP-tagien sisällä oleva koodi taas kopioidaan sellaisenaan servletiin generoidun koodin sekaan. JSP-tekniikkaa voidaankin käyttää lähes minkälaisten sivujen generointiin tahansa, mukaanlukien xml ja wml. Sitä voi hyödyntää myös tavallisten tekstitiedostojen päivittämisen automatisointiin. JSP-sivun ensimmäinen lataus kestää servletin koodin generointiin ja java-tavukoodiksi kääntämiseen menevän ajan, yleensä joitakin sekunteja. Seuraavilla kerroilla palvelin vertaa sivun ja siitä generoidun servletin aikaleimoja toisiinsa. Niiden ollessa samat hoitaa valmis palvelinohjelma pyynnön käsittelyn. Sivun muuttuessa osaa palvelin ottaa uuden servletin automaattisesti käyttöön. TARKKAA HOMMAA Nykyiset html-editorit eivät osaa tarkistaa sivujen JSP-osuuksia. Yksikin virhe estää generoidun servletin kääntämisen, mikä ilmenee keskeytyksenä ja kutsupinon tulostumisena. Virheiden etsimiseen joutuu usein käyttämään web-palvelimen lokia, jonne käännösvaiheen virheet tulostuvat. Virhetilanteiden vaikutusta käyttäjille voi vähentää erillisillä virhesivuilla, joille suoritus siirretään, jos sivun käsittelyssä tapahtuu virhe. Käännösvirheiden lisäksi generoitu servlet tai sen kutsumat beanit voivat aiheuttaa myös ajonaikaisia virheitä. Niiden metsästäminen saattaa joskus olla haastavaa, mutta apuna voi käyttää servletien debuggaamiseen tarkoitettuja ohjelmistoja. PAPUPATA PORISEMAAN JavaBeansit eli beanit ovat Java-luokkia, jotka noudattavat määriteltyä nimeämiskäytäntöä. Alunperin rajapinta luotiin käyttöliittymäkomponenttien käsittelyä yhtenäistämään, mutta se soveltuu mainiosti myös JSP:n kaltaisiin tekniikoihin. Yksinkertaisimmillaan beania käytetään pelkästään tiedon säilyttämiseen. Ohjelmakoodin listauksessa 1 oleva KahviPapubean sisältää yhden luokkamuuttujan "laatu" ja ns. getter-metodin muuttujan arvon lukemiseen (getlaatu()) sekä setter-metodin arvon asettamiseen (setlaatu()). Boolean-totuusarvojen lukemiseen voidaan käyttää lisäksi issuodatinkarkeus()-nimeämistä. Metodit voisi toki nimetä poikkeavastikin, mutta JSP tarjoaa suoran tuen tätä muotoa noudattaville beaneille. Jättämällä pois getter- tai setter-metodi voidaan arvon lukeminen tai muuttaminen estää. Tällainen esimerkki löytyy listauksesta 2, josta kaikessa epäloogisuudessaan on jätetty pois eurojen määrän asettaminen. Sen sijaan beanin arvoa "markat" kutsutaan liipaisinarvoksi (trigger property), koska sen muuttaminen aiheuttaa automaattisesti myös vastaavan eurojen määrän laskemisen. Beanit toteuttavat usein Serializable-rajapinnan. Sen avulla 54 MikroPC 5 / 2001 W W W. M I K R O P C. N E T
L I S T A U K S E T 1 J A 2 L I S T A U S 1 Yksinkertainen JavaBean package fi.mikropc.jspdemo; import java.io.serializable; public class KahviPapu implements Serializable { private String laatu = ""; public String getlaatu() { return laatu; public void setlaatu(string laatu) { this.laatu = laatu; L I S T A U S 2 Markat euroiksi muuntava bean package fi.mikropc.jspdemo; import java.io.serializable; public class Euromuunnin implements Serializable { private double markat = 0; private double eurot = 0; public double getmarkat() { return markat; public void setmarkat(double markat) { this.markat = markat; this.eurot = markat / 5.94573; public double geteurot() { return eurot; ja beanin arvoa muutetaan tagilla: <jsp:setproperty name="omapapu" property="laatu" value="espresso"/> JSP osaa automaattisesti kutsua oikeaa getter- tai setter-metodia. getproperty-esimerkki voitaisiin korvata myös seuraavalla javakoodin pätkällä: <% out.print(omapapu.getlaatu()); %> Tagimuoto on kuitenkin selkeämpi lukea ja se erottaa esityksen toteutuksesta: valittuun kohtaan sivua halutaan beanin "omapapu" arvo "laatu". Sivun kannalta ei ole kiinnostavaa, että arvo saadaan itse asiassa kutsumalla beanin metodia getlaatu(). Lisäksi BeanInfo-luokan avulla itse pyyntö voikin olla konepellin alla ohjattu aivan toiselle metodille. Tagimuodolla on lisäksi vielä yksi valttikortti: automaattiset tyyppimuunnokset. JSP huolehtii jsp:getpropertyn palauttaman tyypin muuttamisesta String-olioksi. Vastaavasti se muuntaa jsp:setpropertyn value-arvon kyseisen setter-metodin tietotyyppiä vastaavaksi. Sivuille voi sijoittaa myös lausekkeiden (expression) arvoja: <%= omapapu.getlaatu() %> Lausekkeita voi käyttää esimerkiksi edellä esitettyyn tapaan sisällyttämään metodikutsun paluuarvon sivulle. Lauseke voi kuitenkin olla mikä tahansa Java-lauseke ja sisältää jopa kommentteja: <%= 40 * 5.94573 /* 40 euroa markkoina */ %> palvelin voi tallettaa beanin levylle tai lähettää sen esimerkiksi toiselle palvelimelle kuormanjakoa varten. VAIN MUUTAMAN TAGIN TÄHDEN Beanien käsittelyyn JSP tarjoaa kolme tagia, joissa käytetään xml-standardin mukaista esitysmuotoa. Beanin määrittelyyn käytetään tagia: JSP huolehtii myös lausekkeiden tyyppimuunnoksista. Huomaa, että lausekkeen perässä ei ole puolipistettä. Beaniin voi kuulua lisäksi indeksoituja arvoja. Esimerkiksi arvo viikonpaivat voisi sisältää seitsemän arvoa. Tagit eivät tar- Sanasto <jsp:usebean id="omapapu" class="fi.mikropc.jspdemo.kahvipapu"/> Tagin jälkeen voidaan sivulla hyödyntää fi.mikropc. jspdemo.kahvipapu-luokkaan kuuluvaa oliota tunnisteella "omapapu". Koska koko komento sisältyy tagiin, suljetaan tagi sen lopussa olevalla kauttaviivalla. Komennon lopettamiseen voitaisiin käyttää myös erillistä sulkutagia </jsp:usebean>. usebean-komento kuuluu jsp-nimiavaruuteen. Xml:n määrittelemät nimiavaruudet estävät nimeämiskonflikteja. Bean täytyy sijoittaa web-palvelimen classpath-polkuun, jotta palvelin sen löytäisi. Beania muutettaessa täytyy palvelin uudelleenkäynnistää, jotta uusi versio beanista tulee käyttöön. Listauksen 1 beanin ainoa arvo haetaan sivulle tagilla: <jsp:getproperty name="omapapu" property="laatu"/> Servlet ASP JSP JavaBeans IIS JavaScript Scripletti Www-palvelimessa toimiva java-ohjelma. (active server pages) Microsoftin IIS-www-palvelimissa käytetty ohjelmistotekniikka. Mahdollistaa dynaamiset sivustot ja yhteydet tietokantaan. (JavaServer Pages). Helposti käyttöönotettava ASP:n tapainen skiptauskieli dynaamisten web-sivujen tekoon. Java-luokkia, jotka noudattavat määriteltyä nimeämiskäytäntöä. (Internet Information Server) Microsoftin wwwpalvelinohjelmisto. Java-sovellusten toimintaa ohjaava pienohjelma, joka on upotettu www-sivulle. Www-sivu, jossa on dynaamisella html:llä koodattuja ja skriptikielellä ohjattavia osia. W W W. M I K R O P C. N E T MikroPC 5 / 2001 55
L I S T A U K S E T 3, 4, 5 J A 6 L I S T A U S 3 euromuunnin.html Lomake, joka pyytää käyttäjältä markkamäärän ja lähettää sen eurot.jsp-sivun käsiteltäväksi: <form action="eurot.jsp"> Anna markkamäärä: <input type="text" name="markat"><br> <input type="submit" value="muunna"> </form> L I S T A U S 4 eurot.jsp Euromuunnin ilman beania (kutsutaan euromuunnin.html-lomakkeen kautta): <%= request.getparameter("markat")%> markkaa on:<br> <strong><%= Integer.parseInt(request.getParameter("markat")) / 5.94573 %></strong> euroa. <jsp:setproperty name="omapapu" property="markat" param="markat"/> </jsp:usebean> <jsp:getproperty name="omapapu" property="markat"/> markkaa on:<br> <strong><jsp:getproperty name="omapapu" property="eurot"/></strong> euroa. L I S T A U S 6 eurotaulukko.jsp Taulukon generointi ja toistorakenteen käyttäminen JSP-sivulla: <jsp:usebean id="omapapu" class="fi.mikropc. jspdemo.euromuunnin"/> <table> <tr><td>markkoja</td><td>euroja</td></tr> <% for (int i = 1; i <= 20; i++) { omapapu.setmarkat(i); %> <tr><td><jsp:getproperty name="omapapu" property="markat"/></td> <td><jsp:getproperty name="omapapu" property="eurot"/></td></tr> <% %> </table> L I S T A U S 5 eurot.jsp Euromuunnin beanin avulla (kutsutaan euromuunnin.html-lomakkeen kautta): <jsp:usebean id="omapapu" class="fi.mikropc.jspdemo.euromuunnin"> joa kuitenkaan mahdollisuutta indeksin välittämiseen, joten tällaisten arvojen käsittely pitää tehdä java-koodilla: <% omapapu.setviikonpaivat(0, "maanantai"); %> Muuttujien arvojen käsittelyn lisäksi beanit voivat tietysti sisältää minkälaisia ja -nimisiä metodeja tahansa. KEVÄÄN MUOTIKAMPAUS SCRIPLETTI Suoraan JSP-sivulle kirjoitettua ohjelmakoodia kutsutaan scripletiksi. Listaus 4 näyttää, miten listauksen 3 mukaisen html-sivun lomakkeen tiedot käsitellään kirjoittamalla koodi suoraan lomakkeen käsittelevälle JSP-sivulle. Request-olio sisältää sivulle saapuneen http-pyynnön, josta annettu markkamäärä luetaan. Koska scripletien sisältö kopioidaan sellaisenaan servletiin, voi scripletejä hyödyntää monipuolisesti. Kannattaa kuitenkin käyttää harkintaa, sillä suuret määrät ohjelmakoodia, monimutkaiset toistorakenteet ja etenkin out.print-komentojen sisällä olevat html-ohjauskoodit tekevät sivun rakenteesta sekavan. Ohjelmakoodi on syytä sijoittaa mahdollisuuksien mukaan beaneihin. Vastaava euromuunnin on toteutettu listauksessa 5 ai- 56 MikroPC 5 / 2001 W W W. M I K R O P C. N E T
emmin esiteltyä listauksen 2 beania käyttäen. Listauksessa 6 on scripleteillä tehty taulukko. Sivu luo taulukon, jossa on 1 20 markan arvot euroina. Saman voisi toteuttaa myös lisäämällä beaniin taulukon palauttavan metodin generoi- Taulukko(). Tämä tekisi sivusta huomattavasti selkeämmän lukea mutta piiskaa sille, joka moisen metodin koodaa. Jos myöhemmin haluttaisiin muuttaa mitä tahansa, esimerkiksi korvata "markat" lyhenteellä mk tai "eurot" (euromerkki!)-symbolilla, pitäisi muutokset tehdä suoraan beaniin. PULLEAT PUSKURIT Toisin kuin hätäinen voisi luulla, JSP-sivulle sijoitettu komento <% out.print("veijo was here"); %> ei suinkaan tuo välittömästi Veijon puumerkkiä selaimen näyttöön. JSP:n out-olio kuuluu javax.servlet.jsp.jspwriter-luokkaan, ja tämän olion kautta tehtävä tulostus tapahtuu normaalisti puskuroituna. Puskurin oletuskoko on kahdeksan kilotavua, mutta sitä voi tarvittaessa kasvattaa tai puskurin voi poistaa käytöstä kokonaan. Puskuroinnin ansiosta sivulla voidaan muuttaa http-vastauksen (response) otsaketietoja tai siirtää suoritus toiselle sivulle, kunhan puskuria ei vielä ole kertaakaan tyhjennetty. Suoritus siirretään toiselle sivulle tagilla: SCOPE-ARVON VAIKUTUS BEANIN ELINIKÄÄN Scopen arvo Beanin elinikä Page Vain sivu, jossa bean määritellään <jsp:usebean>-tagilla. Request Sivu, jossa bean määritellään ja kaikki mahdolliset sivut, joita siihen sisällytetään tai joille suoritus siirretään. Session Nykyinen ja kaikki tulevat kutsut session eliniän aikana. Application Nykyinen ja kaikki tulevat kutsut, jotka kuuluvat samaan sovellukseen. Sovellus sisältää sivut, jotka ovat nykyisen sivun hakemistossa tai jossain sen alihakemistossa. Esimerkiksi /acme/tuotteet/hilavitkutin.jsp kuuluu samaan sovellukseen kuin /acme/tilaus.jsp. <jsp:forward page="uusisivu.jsp"/> JSP-sivulle voidaan myös sisällyttää toisen tiedoston sisältö: <jsp:directive.include file="mainosbanneri.html"/> Toiminnaltaan tagi vastaa C:n esiprosessoijan #include-komentoa. Include-tagien määrää sivulla ei ole rajoitettu. Tiesitkö, että maailman käytetyin raportointiohjelmisto on Crystal Reports? Nyt julkistettu uusi versio 8.5 perustuu entistä vahvemmin webraportointiin. Yksi uusista parannuksista on täydellinen yhteensopivuus myös XML-tietokantaan. Näin WAP-raportit tulivat mahdollisiksi suoraan tietokannastasi. Voit halutessasi asettaa raportit päivittymään automaattisesti! Crystal Reportsin virallinen maahantuoja Datium Oy on erikoistunut Crystal Decisionsin tuotteilla tehtäviin raportointiprojekteihin. Jos haluat uudistaa yrityksesi raportoinnin, voimme tehdä sen teille alusta loppuun. rationalize your future Tutustu myös koulutustarjontaamme ja tarkista jälleenmyyjäsi osoitteessa www.datium.fi. Datium Oy, Ohjelmakaari 1, 40500 Jyväskylä / puh: 014-445 1700 / fax: 014-445 1701 / www.datium.fi / sales@datium.fi
TÄYSISTUNTOJA Html:n siirtämiseen käytetty http ei tarjoa minkäänlaista tilatietoisuutta. Selain ottaa yhteyden palvelimeen, pyytää siltä haluamansa sivun ja sen saatuaan röyhkeästi katkaisee yhteyden edes hyvästelemättä. Istuntojen (session) hallinta on kuitenkin oleellinen osa useita web-sovelluksia. Esimerkiksi käyttäjän tehdessä ostoksia webbikaupassa ostoskorin sisältö säilytetään istuntotietojen avulla. Onneksi istuntojen hallinta on toteutettu JSP:ssä esimerkillisesti. Yksinkertaisimmillaan riittää beanin eliniän (scope) määrittely usebean-tagin yhteydessä, ja JSP huolehtii muusta automaattisesti. Mahdollisuudet eliniän määrittelyyn on esitelty oheisessa taulukossa. Beanin elinikä määritellään esimerkiksi seuraavasti: <jsp:usebean id="omapapu" class="fi.mikropc.jspdemo.kahvipapu" scope="session"/> Ilman eksplisiittistä määrittelyä beanin eliniäksi asetetaan arvo "page". Normaalisti istuntoja hallitaan hyödyntämällä käyttäjän koneella säilytettäviä evästeitä (cookies). Jos evästeet eivät ole käytössä tai esim. selain ei niitä tue, voidaan session tunniste säilyttää myös linkkien osoitteiden perässä (url rewriting), mutta tämä tekniikka vaatii jokaisen linkin muokkaamista. JSP tarjoaa sivulle HttpSession-luokkaan kuuluvan olion session, johon voidaan sisällyttää muita olioita setattribute()-metodilla. Olioita voidaan myöhemmin pyytää saman session-olion getattribute()-metodilla. Palvelin huolehtii tietojen assosioimisesta oikeisiin istuntoihin. Istuntojen vanhenemisajan asettamiseen käytetään session-olion setmaxinactiveinterval()-metodia. Linkkejä lisätiedon lähteille Dynaamisten webtekniikoiden kehitys Kymmenisen vuotta sitten esiteltiin html-kieli ja internetiin ilmestyi nopeasti runsaasti etenkin opiskelijoiden tekemiä nopeasti vanhenevia kotisivuja. Samaan aikaan alkoi syntyä myös dynaamisempia sivustoja. Hakupalvelujen, kauppapaikkojen ja sääsivujen tiedot generoitiin joko käyttäjän tai ulkoisen lähteen antamien tietojen perusteella. Silloiset www-palvelimet tarjosivat sivujen dynaamiseen muodostamiseen ainoastaan erittäin yksinkertaisen cgi-rajapinnan (common gateway interface). Lomakkeen käsittelyyn kirjoitettiin usein Perl-kielinen ohjelma, joka luki lomakkeessa annetut tiedot ja generoi käyttäjälle sivun vastaukseksi. Käyttäjän painettua lomakkeen lähetyspainiketta palvelin käynnisti Perl-tulkin omassa prosessissaan. Perl-ohjelma muodosti valmiin html-sivun ja palautti sen sisällön palvelimelle. Uuden prosessin luomisen raskaus ja tulkatun Perlin hitaus aiheutti monille palvelimille skaalautuvuusongelmia, kun käyttäjien määrä kasvoi. Lisäksi vastinesivut olivat karuja, kun html-koodi kirjoitettiin suoraan ohjelmaan. Pienenkin muutoksen tekeminen vaati aina muutoksia ohjelmaan. FastCGI ja mod_perl -tekniikoiden avulla Perl-ohjelmien suorituskykyä on saatu sittemmin huomattavasti parannettua. www.jspinsider.com/ Kattava kokoelma JSP-tietoa ja -linkkejä. jakarta.apache.org/ Ilmainen JSP- ja servlet-container. www.jguru.com/jguru/faq/ Runsaasti paljon kysyttyjä faq-vastauksia JSP-ongelmiin. java.sun.com/products/jsp/ Sunin viralliset JSP-sivut, joista löytyy mm. JSP:n määritykset. java.sun.com/products/javabeans/ Sunin viralliset JavaBeans-sivut. KAHVIA KONEESEEN Sun esitteli Java-ohjelmointikielen viitisen vuotta sitten. Saman ohjelman toimiminen eri ympäristöissä, C++:sta tuttu syntaksi ja monet edistyneet ominaisuudet tekivät Javasta nopeasti suositun. Alkuaikoina ohjelmien suorituskyky jätti tosin toivomisen varaa. Alussa Java-ohjelmat olivat lähinnä selaimissa toimivia yksinkertaisia pelejä tai graafisia efektejä. Innostus sovelmiin (applet) kuitenkin laantui nopeasti. Sovelmien käynnistyminen kesti kauan, suoritus oli hidasta ja selainten Java-ympäristöt olivat bugisia. Nykyisin sovelmia käytetään vähän, mutta Java-ohjelmat ovat siirtyneet selaimista palvelimiin, missä niitä kutsutaan servleteiksi. Servletit eivät kuitenkaan poistaneet suurta ongelmaa: edelleen htmlkoodi generoitiin ohjelmallisesti. Lisäksi tulkattavien Perl-ohjelmien muokkaukseen riitti tekstieditori, mutta servletit piti muokkauksen jälkeen kääntää vielä Java-tavukoodiksi. TIETO JA KUKKASET ERIKSEEN Kaiken kukkuraksi sivun lopullisen ulkoasun näkeminen suoraan Perlkoodista vaatisi ennustajan. Lisäksi samaa tietoa pitäisi voida hyödyntää useissa yhteyksissä, esimerkiksi web- ja wap-sivuilla. Avuksi on kehitetty erilaisia wwwpalvelinlaajennuksia ja sovelluspalvelimia, jotka osaisivat suorittaa htmlsivuille sijoitetun ohjelmakoodin ennen sivun lähettämistä sen pyytäjälle. Tällä hetkellä ehkä yleisimmin käytössä oleva tekniikka on Microsoftin ASP. ASP:ssa ohjelmointikielenä käytetään yleensä Visual Basiciin perustuvaa VB Scriptiä. Suuremmat projektit kootaan ActiveX-komponenteista. ASP:n suosion ansiosta muihinkin kuin windowsilla pyöriviin palvelimiin on lisätty ASP-tuki. ActiveXkomponentit toimivat yleensä vain windowsissa. Microsoftin.NET-arkkitehtuuri sisältää uuden ASP-version ASP+. Se parantaa huomattavasti ohjelmien suorituskykyä, koska ASP+-sivut käännetään JSP:n tavoin tavukoodimuotoon. 58 MikroPC 5 / 2001 W W W. M I K R O P C. N E T