Tietokannan webbikytkentä Janne Petäjä Helsinki 7. huhtikuuta 2003 Relaatiotietokannat nyt - seminaari HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos
Tietokannan webbikytkentä Janne Petäjä Relaatiotietokannat nyt - seminaari HELSINGIN YLIOPISTO Tietojenkäsittelytieteen laitos Helsinki 7. huhtikuuta 2003, 9 sivua Internetin ja erilaisten web-sovellusta valtava kasvu on saanut aikaan tarpeen tietokannan yhdistämisestä web-sovelluksiin. Tässä seminaariraportissa käsitellään erilaisia tekniikoita, joiden avulla tietokantojen tietoihin pääsee helposti käsiksi web-sovelluksista. Käsiteltyjä tekniikoita ovat PHP: Hypertext Preprocessor (PHP), JavaServer Pages (JSP), sekä Microsoftin Active Server Pages (ASP), joista ASP käydään läpi hieman tarkemmin ja PHP sekä JSP lyhyemmin ja pintapuolisemmin. Avainsanat: tietokanta, web, WWW, CGI, PHP, ASP, JSP
Sisältö 1 Johdanto... 1 2 Tietokannat ja web... 1 3 Active Server Pages... 3 3.1 ASP ja tietokannat...3 3.2 ASP esimerkki...5 4 Muita tekniikoita... 6 4.1 PHP: Hypertext preprocessor...6 4.2 JavaServer Pages...8 6 Yhteenveto... 8 LÄHTEET... 9
1 1 JOHDANTO Internetin ja erityisesti World Wide Webin (WWW) yleistyminen on saanut aikaan tarpeen tietokantojen hyödyntämiseen web-sovellusten yhteydessä [ChR98]. Tähän tarkoitukseen on kehitetty useita erilaisia tekniikoita, kuten Sun Microsystemsin JavaServer Pages (JSP) [Sun03a], PHP: Hypertext Preprocessor (PHP) [PHP03] sekä Microsoftin Active Server Pages (ASP) [Mic03a]. Tässä seminaariesitelmässä tarkastellaan tietokantojen liittämistä web-sovelluksiin, käyttäen esimerkkinä edellä mainittuja tekniikoita. Kappaleessa kaksi tarkastellaan yleisellä tasolla tietokantojen käyttöä web-sovelluksissa. Kappaleessa kolme käydään läpi Active Server Pages-tekniikka ja kappaleessa neljä esitellään lyhyesti PHP ja JSP-tekniikat. 2 TIETOKANNAT JA WEB Tietokantoja hyödynnetään nykyisin todella monissa web-sovelluksissa. Esimerkkejä tällaisista sovelluksista ovat erilaiset verkkokaupat ja varausjärjestelmät [ElN00]. Niissä vaaditaan suurien tietomäärien tehokasta hallintaa ja käsittelyä, joka onnistuu parhaiten tietokantoja käyttämällä. Lisäksi tietokannan käyttäminen mahdollistaa rinnakkaisuuden hallinnan, mikä on olennaista web-sovelluksissa, joilla on paljon yhtäaikaisia käyttäjiä. Web-sovellukset perustuvat kuvassa 1 esitettyyn, niin kutsuttuun asiakas-palvelinarkkitehtuurin (client-server architecture). Tässä yhteydessä asiakas-palvelin-arkkitehtuurilla tarkoitetaan tilannetta, jossa suuri joukko käyttäjiä (asiakkaita) käyttää yhdellä tai useammalla KÄYTTÄJÄ KÄYTTÄJÄ KÄYTTÄJÄ KÄYTTÄJÄ Web-palvelin Tietokantapalvelin Kuva 1: Asiakas-palvelin-arkkitehtuuri
2 palvelimella sijaitsevaa web-sovellusta, joka on yhdistetty yhteen tai useampaan tietokantapalvelimeen. Nykyiset web-sovellukset perustuvat web-palvelimella sijaitseviin Hypertext Markup Language (HTML) standardin mukaisiin tiedostoihin, joista muodostettuja www-sivuja voidaan katsella selaimen (esimerkiksi Microsoftin Internet Explorer) välityksellä. WWW-sivuja ei alun perin suunniteltu käytettäväksi tietokantojen kanssa ja tästä johtuen HTML-standardi ei tarjonnut menetelmiä tietokantojen hyödyntämiseen [ChR98]. Ensimmäisiä menetelmiä tietokannan ja web-sovellusten yhdistämiseen oli Common Gateway Interface (CGI)-skriptien käyttö. CGI-skriptien ongelmana oli kuitenkin niiden valtava resurssien käyttö, sillä jokaista palvelupyyntöä varten luotiin uusi CGI-prosessi ja yhteys tietokantaan [ChR98, ElN00, PHP03]. Lisäksi CGI-skriptien käyttöön liittyy joitakin tietoturvaongelmia [ElN00]. Tietokannan tietojen ja HTML-sivujen yhdistäminen hoidetaan yleensä erilaisten skriptikieleten avulla siten, että sitä upotetaan tavallisen HTML-koodin sekaan. Oheisessa esimerkissä PHP-komentoja on upotettu HTML-tiedostoon. [PHP03]. <HTML> <BODY> <H1>Otsikko</H1> <P>Tämä on normaali tekstikappale.</p> <?php $var1 = "<P>Tämä on myös PHP:n tekstikappale.</p>"; echo "<P>Tämä on PHP:n luoma tekstikappale.</p>"; echo $var1;?> </BODY> </HTML> Web-selaimessa oleva PHP (tai JPS, ASP) tulkki muuntaa sivun HTML muotoon, siten että se näkyy sekä selaimelle (ts. selaimen HTML-tulkille) että käyttäjälle tavallisena HTML-sivuna. Yllä esitelty PHP:tä käyttävä esimerkki muunnetaan selaimessa alla olevaan muotoon. <HTML> <BODY>
3 <H1>Otsikko</H1> <P>Tämä on normaali tekstikappale.</p> <P>Tämä on PHP:n luoma tekstikappale.</p> <P>Tämä on myös PHP:n tekstikappale.</p> </BODY> </HTML> 3 ACTIVE SERVER PAGES Microsoftin kehittämä Active Server Pages tarjoaa mahdollisuuden dynaamisten HTMLsivujen luontiin Microsoft Internet Information Server (ISS)-ympäristössä [Mic03a]. ASP:n ohjelmointikieli perustuu paljolti Microsoftin Visual Basic Script-ohjelmointikieleen. Visual Basic puolestaan pohjautuu Basic-ohjelmointikieleen. Tästä johtuen ASP:n syntaksi on melko yksinkertaista verrattuna esimerkiksi C:n ja Javan syntaksiin [PHP03]. ASP-komennot erotetaan HTML-koodista <% ja %> merkein. ASP mahdollistaa myös istunnon tilan säilyttämisen, mistä on hyötyä monissa sovelluksissa. 3.1 ASP ja tietokannat ActiveX Data Objects (ADO) on ASP:n tarjoama liittymä tietokantaan [Mic03b]. ADOtietokantaliittymä perustuu oliomalleihin ja se koostuu kolmesta pääoliosta: Connection, Command ja Recordset. Connection olion kautta huolehditaan nimensä mukaisesti tietokantayhteyteen liittyvistä asioista, esimerkiksi yhteyden avaamisesta ja sulkemisesta. Lisäksi sen kautta voi suorittaa yksinkertaiset kyselyt ilman muiden ADO-olioiden käyttöönottoa. Se tarjoaa mm. seuraavat metodit: Open() (yhteyden avaaminen), Close() (yhteyden sulkeminen), Execute() (kyselyn suorittaminen), BeginTrans() (uuden transaktion aloittaminen), CommitTrans() (transaktion sitoutuminen) ja RollbackTrans() (suoritetun transaktion peruminen). Command-oliota puolestaan käytetään komentojen luomiseen ja suorittamiseen. Sitä voidaan käyttää myös tietokannan rakenteen muokkaamiseen. Kaikkien hakujen tulokset talletetaan tulosjoukko (recordset)-olioon. Tulosjoukon sisältämää tietoa voi käsitellä sen tarjoamilla metodeilla, joita ovat mm. MoveNext(), MovePrevious(), MoveFirst(), MoveLast(), AddNew(), Delete() ja Update(). Tulosjoukon voi luoda kahdella eri tavalla. Yksinkertainen tulosjoukko, jossa voidaan liikkua ainoastaan eteenpäin luodaan komennolla Set rs1 = conn1.execute( SELECT * FROM TAULU1 ). Komento luo
4 tulosjoukon rs1, joka sisältää kaikki taulu1 :en monikot. Tulosjoukon luomisessa käytetään hyväksi ennalta määriteltyä tietokantayhteyttä conn1. Mikäli tulosjoukon ominaisuuksia halutaan hallita monipuolisemmin, tulee tulosjoukko luoda eksplisiittisesti oheisen esimerkin mukaisesti. Set conn1 = Server.CreateObject( ADODB.Connection ) conn1.open DSN=123;UID=guest;PWD=demo Set rs1 = Server.CreateObject( ADODB.Recordset ) rs1.open SELECT * FROM TAULU1, conn1, adopendynamic, adlockoptimistic, _ adcmdtext ADO tarjoaa neljä erilaista kursoria ja lukkotyyppiä tulosjoukon käsittelyyn [Mic03b]. Käytettävät kursori- ja lukkotyypit tulee määritellä tulosjoukkoa avattaessa, kuten yllä olevassa esimerkissä (adopendynamic, adlockoptimistic). Seuraavaksi käydään läpi kursorit heikoimmasta voimakkaimpaan. Käytössä olevat kursorityypit riippuvat käytössä olevasta (tietokanta) palveluntarjoajasta. Eteenpäin liikkuva kursori (Forward-only cursor) on oletusarvoinen kursori, joka voi nimensä mukaisesti liikkua tulosjoukossa ainoastaan eteenpäin. Se tarjoaa parhaimman suorituskyvyn esimerkiksi tulosjoukon läpikäyntiin. Se määritellään parametrilla adopenforwardonly. Staattinen kursori (Static cursor) tarjoaa staattisen eli muuttumattoman näkymän tietokantaan. Staattisen kursorin yhteydessä voidaan käyttää kaiken tyyppisiä liikkumismetodeita, esimerkiksi metodeita MovePrevious(), MoveLast(), joita ei voi käyttää eteenpäin liikkuvan kursorin yhteydessä. Staattinen kursori määritellään parametrilla adopenstatic. KeySet-kursori eroaa kahdesta edellä esitellystä kursorista siinä, että se näkee tietokantaan kursorin käytön aikana tehdyt tietojen muutokset, mutta ei kuitenkaan lisäyksiä ja poistoja. Kaikki liikkumismetodit ovat käytettävissä. Se on lähes yhtä voimakas kuin dynaaminen kursori. Keyset-kursori määritellään parametrilla adopenkeyset. Dynaaminen kursori (Dynamic cursor) on kaikkein voimakkain ADO:n tarjoama kursori. Se näkee kaikki tietokantaan tehdyt muutokset, myös poistot ja lisäykset.
5 Kaikki erilaiset liikkumismetodit ovat luonnollisestikin käytettävissä. Dynaaminen kursori määritellään parametrilla adopendynamic. 3.2 ASP esimerkki Tarkastellaan ASP:n soveltamista oheisen esimerkin avulla. <% Set conn1 = Server.CreateObject( ADODB.Connection ) conn1.open DSN=123;UID=guest;PWD=demo q1 = SELECT * FROM Asiakas ORDER BY Nimi Set rs1 = conn1.execute(q1) %> <HTML> <BODY> <TABLE BORDER = 1> <% Response.Write <TR><TH> & rs1.fields( Etunimi ).Name & </TH> Response.Write <TH> & rs1.fields( Sukunimi ).Name & </TH></TR> do until rs1.eof Response.Write <TR> Response.Write <TD> Response.Write rs1.fields( Etunimi ).Value Response.Write </TD> Response.Write <TD> Response.Write rs1.fields( Sukunimi ).Value Response.Write </TD> Response.Write </TR> Loop rs1.close conn1.close Set conn1 = nothing %> </TABLE> </BODY> </HTML> Yllä olevassa esimerkissä luodaan HTML-sivu, joka koostuu yhdestä taulusta, jonka solujen sisältö haetaan tietokannasta. Aluksi luodaan ADODB.Connection-olion ilmentymä conn1 ja avataan se Open()-metodilla. Seuraavaksi määritellään SQL-kysely q1 ja suoritetaan se
6 Execute()-metodilla, jolloin kyselyn tulokset ovat saatavilla tulosjoukoussa (recordset) rs1. Taulun sarakkeiden otsikoiksi haetaan tietokannasta kyseisten kenttien nimet (rs1.fields.name). Seuraavaksi do until rs1.eof-silmukassa käydään läpi tulosjoukon rs1 kaikkia alkiot ja tulostetaan niistä halutut tiedot, tässä tapauksessa asiakkaan etu- ja sukunimi, taulun soluihin omille riveilleen. Silmukan suoritus lopetetaan kun kohdataan tulosjoukon loppumerkki (End Of File = EOF). Tämän jälkeen suljetaan tulosjoukko rs1 sekä yhteys tietokantaan (conn1) sekä poistetaan conn1-ilmentymän viittaus ADODB-yhteyteen. Aikaansaatu HTML-tiedosto voi tietokannan sisällöstä riippuen olla esimerkiksi tällainen: <HTML> <BODY> <TABLE BORDER = 1> <TR><TH>Etunimi</TH> <TH>Sukunimi</TH></TR> <TR><TD>Niilo<TD> <TD>Nimetön</TD></TR> <TR><TD>Pekka<TD> <TD>Peruskäyttäjä</TD></TR> </TABLE> </BODY> </HTML> 4 MUITA TEKNIIKOITA Seuraavaksi käydään läpi kaksi yleistä tekniikkaa tietokannan liittämiseksi web-sovelluksiin, PHP ja JavaServer Pages. 4.1 PHP: Hypertext preprocessor PHP on yleiskäyttöinen skriptikieli, joka on tarkoitettu pääasiassa web-sovellusten tekemiseen. [PHP03]. PHP komennot erotetaan HTML-koodista yleensä merkein <? ja?> tai <?PHP ja?>. PHP-kielen syntaksi on hyvin samankaltaista kuin C:n ja Javan syntaksi. PHP:n viimeisin versio on 4.3.1, päivätty 17 helmikuuta 2003.
7 PHP tukee kaikkia yleisimpiä tietokannanhallintajärjestelmiä (Oracle, SQL, ja IBM DB2). Tarkastellaan PHP:n käytämistä alla olevan esimerkin avulla. <HTML> <BODY> <TABLE> <?php $database = pg_connect("user=guest dbname=mydb port=12345 password=demo"); if (!$database) { exit("error"); } $result = pg_exec($database, "SELECT * FROM ASIAKAS ORDER BY SUKUNIMI"); $rivit = pg_numrows($result); $sarakkeet = pg_numfields($result); echo "<TR>\n". "<TH align='left'>etunimi</th>". "<TH align='left'>sukunimi</th>". "</TR>\n"; for ($i=0; $i<$rivit; $i++) { echo "<TR>\n"; for ($j=0; $j<$sarakkeet; $j++) { $tulos = pg_result($result,$i, $j); echo "<TD>$tulos</TD>"; } echo "</TR>\n"; }?> </TABLE> </BODY> </HTML> Esimerkissä luodaan HTML-sivu, jonka tiedot haetaan Postgres-tietokannasta. Aluksi avataan yhteys tietokantaan seuraavalla komennolla: $db = pg_connect.... Tämän jälkeen luodaan tulosjoukko komennolla $result = pg_exec($database.... Lopuksi tiedot tulostetaan taulukkoon muutamia apumuuttujia ($rivit, $sarakkeet, $tulos) avuksia käyttäen.
8 4.2 JavaServer Pages JavaServer Pages (JSP) on Sun Microsystemsin kehittämä teknologia, joka mahdollistaa WWW sivujen luomisen dynaamisesti, ennalta määriteltyjen ohjeiden perusteella [Sun03a]. Viimeisin versio on JSP:stä on 2.0. JSP tarjoaa mahdollisuuden SQL:n operaatioiden käyttämiseen javax.sql.datasource-luokan avulla [Sun03b]. JSP-koodi erotetaan HTML-koodin <% ja %> merkein [Vis03]. Alla olevassa esimerkissä on HTML-sivu, johon on upotettu JSP-koodia. JSP on peruspiirteiltään hyvin ASP:n ja PHP:n kaltainen. <html> <head> <title>my first JSP page </title> </head> <body> <%@ page language="java" %> <% out.println("hello World"); %> </body> </html> 6 YHTEENVETO Tässä seminaariesitelmässä on tarkasteltu tietokantojen käyttöä web-sovellusten yhteydessä. Edellä esitellyt tekniikat tarjoavat monipuoliset mahdollisuudet dynaamisten HTML-sivujen luomiseen. Tekniikoiden toteutustapa (HTML-koodiin upottaminen) mahdollistaa niiden käytön muiden tekniikoiden (esimerkiksi XML, CSS) yhteydessä. Tässä mielessä edellä esitellyt tekniikat ovat hyvin samankaltaisia. Merkittävin ero niiden välillä on se, että PHP ja JSP ovat avoimia tekniikoita ja toimivat lähes missä tahansa ympäristössä (Solaris, Linux, Mac OS), kun Microsoftin ASP puolestaan toimii ainoastaan Microsoft omassa ISS (Internet Information Server)-ympäristössä.
9 LÄHTEET ChR98 C.-M. Chen & N. Rishe: Development of an Open and Scalable Web-based Information Publishing System. ACM 1998. ElN00 R. Elmasri & S. B. Navathe: Fundamentals Of Database Systems, Third Edition, Addison-Wesley 2000. Sun03a Sun Microsystems, JSR-000152 JavaServer Pages TM 2.0 Specification http://jcp.org/aboutjava/communityprocess/first/jsr152/index.html [6.4.2003] Sun03b Sun Microsystems, JSR-000052 JavaServer Pages TM Standard Tag Library Specification http://jcp.org/aboutjava/communityprocess/final/jsr052/ [6.4.2003] PHP03 PHP Documentation Group, PHP Manual http://www.php.net/docs.php [6.4.2003] Mic03a Microsoft, MSDN -> MSDN Library -> Active Server Pages http://msdn.microsoft.com/library/default.asp? url=/nhp/default.asp?contentid=28000522 [6.4.2003] Mic03b Microsoft, MSDN -> MSDM Library -> Data Access -> ActiveX Data Objects 2.8 Start Page http://msdn.microsoft.com/library/default.asp? url=/library/en-us/ado270/htm/adostartpage1.asp [6.4.2003] Vis03 Visualbuilder.com: JSP Tutorial http://www.visualbuilder.com/jsp/tutorial/default.asp [6.4.2003]