1(27) JSP (JavaServer Pages) tekniikka Lähde Arvo Lipitsäinen, JSP JavaServer Pages, 2003 mahdollistaa dynaamisen web-sisällön luonnin eli HTML-.DHTML-, XHTML- ja XML-dokumentit luodaan palvelimella dynaamisesti ennen dokumenttien lähettämistä käyttäjän-ohjelmistolle tiedosto tallennetaan jsp-loppuisena jsp-sivuun upotettu koodi suoritetaan palvelimella ennen kuin sivu lähetetään selaimeen Web-palvelin JSP-Container HTTP-pyyntö HTML-sivu käännös selain ajo Web-palvelimessa on JSP-Container alusta, joka tekee JSP-sivusta servletin, jonka se kääntää ja käynnistää. Java-serveltti JSP-sivun kääntäminen serveletiksi tapahtuu ensimmäisellä JSP-sivun kutsukerralla, seuraavan kutsun yhteydessä JSP- Container kutsuu valmista servlettiä. Jos jsp-tiedosto muuttuu, Container-alusta kääntää sen uudelleen serveltiksi. JSP-tiedosto
2(27) EL (Excression Language) ja JSTL Lähde: Arvo Lipitsäinen, JSTL- JavaSrver Pages Standard Library, 2004 JSTL on JSP:n standardi tagikirjasto JSTL 1.0 kuvaus valmistui 2002 Päämäärä helpottaa JSP-sivujen kirjoittamista Sisältää neljä tagikirjastoa: o Ydinkirjasto o XML:n käsittely o Kansainvälistäminen o Relaatitietokannan käsittely Sisältää EL (Expression Language)-lausekielen
3(27) Esimerkki: <?xml version = "1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd"> <%@ page isthreadsafe="true"%> <%@page import="java.util.*" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <html xmlns="http://www.w3.org/1999/xhtml"> <html> <body> <h3>jstl-toimintoja</h3> <p> <c:out value="hyvää Päivää!" /><br><br> Pieni yhteenlasku EL-kielellä: <c:out value=" 1 + 2 = ${1 + 2}" /><br><br> Kertolasku muuttujilla luku1 = 5 ja luku2 = 9<br> <c:set var="luku1" value="5" /> <c:set var="luku2" value="9" /> luku1 * luku2 = <c:out value=" ${luku1 * luku2}" /> </p> </body> </html> tulostuu:
4(27) EL-kielen literaalit Literaalit ovat eri tyyppisten vakioiden merkitsemistapoja. Tyyppi Boolean true tai false. Esim. true, false Kuvaus Kokonaisluku Numeroita 0-9, joita voi edeltää etumerkki ( + tai - ). Esim. 123, -29 Desimaaliluku Numeroita 0-9, joiden välissä voi olla piste erottamassa kokonaisosan desimaaleista. Numeroiden edessä voi olla etumerkki ( + tai - ) ja numeroiden jäljessä voi olla e tai E - kirjaimella erotettu eksponentti, joka on kokonaisluku. Esim. 52.99, -10.0, 1.2e5 Merkkijono Lainausmerkkien (") tai hipsukoiden (') sisällä. Esim. "Ville", 'Veera'. Merkkijonossa esiintyvää "- ja \-merkkiä edeltää \-merkki. Esim. "C:\\levy", "Nimi \"Matti\" on yleinen" Null-osoite null
5(27) Operaattorit Operaattori Kuvaus. ominaisuuden haku [] taulukko () lausekkeiden ryhmittely + yhteenlasku - vähennyslasku tai negatiivinen etumerkki / tai div jakaminen % tai mod jakojäännös == tai eq yhtäsuuruus!= tai ne eri suuruus < tai lt pienempi kuin > tai gt suurempi kuin <= tai le pienempi tai yhtä suuri kuin >= tao ge suurempi tai yhtä suuri kuin && tai and looginen and-operaatio tai or looginen or-operaatio! tai not komplementti empty tyhjä arvo (null, tyhjä merkkijono tai tyhjä taulukko) Operaattorit: [ ] ja. Olion ominaisuuteen voi viitata joko piste-operaattorin avulla tai taulukon nimettynä alkiona eli oikeasti kutsutaan ko. olion getattribuutti-metodia: tuotex.koodi tuotex[ koodi ]
6(27) Esimerkki. <?xml version = "1.0"?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/tr/xhtml1/dtd/xhtml1-strict.dtd"> <%@ page isthreadsafe="true"%> <%@ page import="java.util.*" %> <%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%> <html xmlns="http://www.w3.org/1999/xhtml"> <body> <h3>tuote</h3> <p> <c:out value="${tuotex.koodi}" /><br> <c:out value="${tuotex.nimi}" /><br> <c:out value="${tuotex.hinta}" /><br><br> <c:out value="${tuotex['koodi']}" /><br> <c:out value="${tuotex['nimi']}" /><br> <c:out value="${tuotex['hinta']}" /><br> </p> </body> </html> tulostuu Tuote 123 Backgammon 14.50 123 edellyttää että: Ohjelman pääserveltti on lähettänyt attribuutin tuotex, joka on Tuoteluokan olio ja jolla on getkoodi(),getnimi() ja gtehinta() metodit. Backgammon 14.50
7(27) EL tuntee seuraavat sisäiset objektit: Sisäinen objekti pagescope requestscope sessionscope applicationscope param paramvalues header headervalues initparam cookie pagecontext Kuvaus sisältää kaikki oliot, joiden näkyvyys on sivu (page) sisältää kaikki oliot, joiden näkyvyys on pyyntö (request) sisältää kaikki oliot, joiden näkyvyys on istunto (session) sisältää kaikki oliot, joiden näkyvyys on sovellus (application) sisältää pyynnön parametrit sisältää pyynnön parametrit merkkijonotaulukkona sisältää http-pyynnön otsikkotiedot sisältää http-pyynnön otsikkotiedot merkkijonotaulukkona sisältää init-paramterit, jotka annetaan esim. web.xmlkuvaimessa sisältää cookie-tiedot sisältää javax.servlet.jsppagecontext-olion
8(27) Esim. <html xmlns="http://www.w3.org/1999/xhtml"> <body> <h3>muuttujan näkyvyys</h3> <p> <c:set var="tunnus" value="abc" scope="page" /> <c:set var="tunnus" value="kissa" scope="request" /> <c:set var="tunnus" value="kävelee" scope="session" /> <c:set var="tunnus" value="tikapuita" scope="application" /> <c:set var="tunnusx" value="taivaaseen!" scope="session" /> tunnus: <c:out value="${tunnus}" /><br> pagescope.tunnus: <c:out value="${pagescope.tunnus}" /><br> requestscope.tunnus: <c:out value="${requestscope.tunnus}" /><br> sessionscope.tunnus: <c:out value="${sessionscope.tunnus}" /><br> applicationscope.tunnus:<c:out value="${applicationscope.tunnus}" /><br> tunnusx: <c:out value="${tunnusx}" /><br> </p> </body> </html> Tulostaa:
9(27) Esim. <html xmlns="http://www.w3.org/1999/xhtml"> <body> <h3>header</h3> <c:out value="user-agent: ${header['user-agent']}" /><br> <c:out value="accept-encoding: ${header['accept-encoding']}" /><br> <c:out value="accept-language: ${header['accept-language']}" /><br> <c:out value="accept-charset: ${header['accept-charset']}" /><br> <c:out value="accept: ${header['accept']}" /><br> </body> </html>
10(27) Yleiskäyttöiset tagit (Core tag library) <c:out> syntaksi: toiminto laskee lausekkeen arvon, muuttaa sen merkkimuotoon ja kirjoittaa tuloksen JspWriter-tyyppiseen out-tietovirtaan <c:out value= arvo [escapexml= {true false} ] [default= oletusarvo] /> tai <c:out value= arvo [escapexml= {true false} ] oletusarvo <c:out> value= arvo tulostettava lauseke escapexml= {true false} default= oletusarvo muutetaanko merkit: <,>,&, ja vastaaviksi merkkientiteeteiksi: <,>,&,' ja " Oletusarvo true, muutetaan ilmoittaa tulostettavan tiedon oletusarvon, jos lausekkeen arvo lakettuarvo on null Esim. <h3>c:out-kokeilut</h3> seuraava lause tulostaa lauekkeen arvon: <c:out value ="1 + 2 = 3 " /> tulostuu
11(27) <c:set> toiminta antaa muuttujalle arvon Syntaksi 1: muuttuja saa annetun arvon: <c:set value="arvo" var="muuttujannimi" [scope="{page reguest session application}"]/>, missä attribuutti value ilmoittaa muuttujan saaman arvon, attribuutti var muuttujan nimen ja valinnainen attribuutti scope muuttujan näkyvyysalueen. Oletusnäkyvyys-alue on page. Syntaksi 2: muuttuja saa elementin sisällön arvokseen: <c:set var="muuttujannimi" [scope="{page reguest session application}"]> sisältö </c:set> Syntaksi 3: Kohteena olevan olion ominaisuus saa annetun arvon: <c:set value="arvo" target="kohdeolio" property="ominaisuudennimi"/>, missä attribuutti value ilmoittaa ominaisuuden saaman arvon, attribuutti target kohteena olevan olion ja attribuutti property olion ominaisuuden nimen. Syntaksi 4: Kohteena olevan olion ominaisuus saa elementin sisällön arvokseen. <c:set target="kohdeolio" property="ominaisuudennimi"> sisältö </c:set>
12(27) Esim. <html xmlns="http://www.w3.org/1999/xhtml"> <body> <h3>muuttujan arvo</h3> <c:set var="testi" scope="request"> Windowsissa vakava tietoturvaaukko </c:set> <c:out value="${testi}" /><br> </body> </html> Tulostuu:
13(27) Esim. <html xmlns="http://www.w3.org/1999/xhtml"> <%@page import="tuotteet.tuote" %> <body> <h3>tuote</h3> <c:set value="10001" target="${tuotex}" property="koodi" /> <c:set value="backgammon" target="${tuotex}" property="nimi" /> <c:set value="20.56" target="${tuotex}" property="hinta" /> <c:out value="${tuotex.koodi}" /><br> <c:out value="${tuotex.nimi}" /><br> <c:out value="${tuotex.hinta}" /><br> </p> </body> </html> tulostuu: 10001 Backgammon 20.56 Ehdolliset toiminnat <c:if> if-lause Syntaksi: <c:if test="ehto" var="muuttujannimi" [scope="${page request session application}"] /> tai <c:if test="ehto" [var="muuttujannimi"] [scope="${page request session application}"]> sisältöä </c:if> Attribuutin test arvo (true/false) määrittää, prosessoidaanko elementin sisältö vai ei Attribuutin var arvoksi tulee ehtolausekkeen arvo (true/false) Attribuutti scope ilmoittaa muuttujan näkyvyysalueen, oletus on page
14(27) Esim. <html xmlns="http://www.w3.org/1999/xhtml"> <body> <h3>el-kielen if-lauseen testi</h3> <c:if test="${servletinilmoitus==true}" var="ilmoitus"> <c:out value="tervetuloa / VÄLKOM / WELCOME!" /> </c:if> <c:out value="ilmoitus=" /> <c:out value="${ilmoitus}" /> <c:if test="${ilmoitus==true}" > <c:out value="näkemiin / ADJÖ / GOOD BYE!" /> </c:if> </body> </html> tulostuu: Pääservletti on käynnistänyt sivun seuraavasti: request.setattribute ("servletinilmoitus",true); disp = request.getrequestdispatcher("web-inf/koe4.jsp"); disp.forward(request, response);
15(27) <c:choose>,<c:when>,<c:otherwise> Monivalinta, vastaa javan switch-case-lausetta syntaksi: <c:choose> <c:when test= ehto1>valinta 1 </when> <c:when test= ehto2>valinta 2 </when> <c:when test= ehton>valinta N </when> <c:otherwise>viimeinen valinta </otherwise> </choose>
16(27) Esim. <html xmlns="http://www.w3.org/1999/xhtml"> <head> <meta http-equiv="content-type" content="text/html;charset=iso-8859-1"> <title>monivalinta-lause</title> </head> <body> <form> Kirjoita nimi: <input type="text" name="nimi" size="15" /> Valitse nimi: <select name="kieli"> <option>suomi</option> <option>ruotsi</option> <option>englanti</option> <option>espanja</option> <option>muu</option> </select> <input type="submit" value=" - Paina - " /> </form> <h2> <c:choose> <c:when test="${param.kieli==\"suomi\"}" > Terve, </c:when> <c:when test="${param.kieli==\"ruotsi\"}" > Tjänare, </c:when> <c:when test="${param.kieli==\"englanti\"}" > Hello, </c:when> <c:when test="${param.kieli==\"espanja\"}" > Hola, </c:when> <c:when test="${param.kieli==\"muu\"}">?!# $ 6??#@$%&?ÅÄÖ, </c:when> <c:otherwise> </c:otherwise> </c:choose> <c:out value="${param.nimi}" /> </h2> </body> </html> tulostaa, kun käyttäjä on kirjoittaa nimen, valitsee kielen ja painaa paina-nappulaa:
17(27) Toistorakenne <c:foreach> A) Taulukkorakenteen läpikäynti <c:foreach [var= varname ] items= collection [varstatus= varstatusname ] [begin= alku end= loppu [step= askel ]]> Sisältöa <c/foreach> Items on pakollinen ja voi olla : o Tavallinen taulukko o Collection-luokan olio,vector, ArraytList,LinkedList,Treeset o Iterator-, Enumeration- tai Map-olio o String-olio, joka sisältää pilkulla toisistaa erotettuja merkkijonoja var on muuttujan nimi, jonka avulla viitataan käsiteltää taulukon alkiota begin on taulukon indeksi,josta taulukon läpikäynti alkaa, end on indeksi, johon läpikäynti päättyy ja step ilmaisee indeksin korotuksen (vrt. Java for-lause)
18(27) Esim. <body> <h2>tuoteluettelo </h2> <table border="1"> <th>tuotteen koodi</th> <th>tuotteen nimi</th> <th>hinta (eur)</th> <c:foreach var="tuote" items="${tuotelista}"> <tr> <td><c:out value="${tuote.koodi}" /> </td> <td><c:out value="${tuote.nimi}" /> </td> <td><c:out value="${tuote.hinta}" /> </td> </tr> </c:foreach> </table> </body> </html> Pääservletissä on tuoteluettelon aktivointi seuraava: ArrayList lista = new ArrayList(); for (int i=0; i<10;i++) lista.add(new Tuote(i+10,"tuote"+i+10, ( 2.07+i))); tulostuu: request.setattribute( "tuotelista", lista); disp = request.getrequestdispatcher("web-inf/koe6.jsp"); disp.forward(request, response);
19(27) B) Toistaminen n-kertaa <c:foreach [var= varname ] [varstatus= varstatusname ] begin= alku end= loppu [step= askel ]> Sisältöa <c/foreach> var on indeksi, begin indeksin alkuarvo ja end loppuarvo, step ilmaiseen indeksin kasvatuksen (vrt. Java for-lause) Esim. <h3>kierrokset</h3> <c:foreach var="i" begin="1" end="5" > <c:out value="kierros ${i}"/> </c:foreach> tulostuu:
20(27) Internet-resurssin käsittely <c:import> tuo JSP-sivulle dataa ulkoisesta URL-osoitteesta syntaksi: <c:import url= url [context= context ] [var= varname ] [scope= {page request session application} ] [charencoding= charencoding ]> sisältö </c:import> url ilmaisee URL-osoitteen, mistä sisältö haetaan, context ilmoittaa perusosoitteen, jos url on suhteellinen osoite esimerkkejä URL-osoitteista: o Absolute URL: <c:import url="http://sample.com/welcome.html"/> o Relative URL (to the current context): <c:import url="/copyright.html"/> o Relative URL with a foreign context: <c:import url="/mylogo.html" context="/common"/> var ilmoittaa muuttujan, johon haettu sisältö tallentuu charencoding ilmaisee merkkien koodaustavan scope ilmaisee muuttujan näkyvyyden
21(27) Esim. <body> <h2>jstl-esimerkki: import-tagi</h2> <p>seuraava teksti on peräisin teksti.txt-tiedostosta</p> <c:import url="teksti.txt" /> </body> </html> tulostuu: Kun teksti.txt:n sisältö on: Abc kissa kävelee tikapuita pitkin taivaaseen. Tikapuut halkesi, pikku kissa putosi. MIAUUUU!
22(27) JSP-sivun ja pääservletin välinen kommunikointi Jsp-sivu vie tietoa pääservletille kahdella tavalla: A) Linkin-avulla B) Painikkeen avulla A) Linkki Syntaksi: <a href= pääservletti? parametri1=arvo1 & parametri2=arvo2... > Esim. <a href="kokeilut?action=hae&asiakas=mina&salasana=itse">hae</a> B) Painike Syntaksi: <form action= pääservletti method= get/post > <input type= submit name= toiminta value= paina > </form>
23(27) Esim. <form action="kokeilut" method="get" > Paikka: <select name="paikka" > <option value="30" <c:if test="${paikka==\"30\"}">selected </c:if> > Permanto(30 eur) </option> <option value="40" <c:if test="${paikka==\"40\"}">selected </c:if> > Parveke (40 eur)</option> <option value="50" <c:if test="${paikka==\"50\"}">selected </c:if> > Aitio (50 eur)</option> </select> Lippujen lukumäärä: <input type="text" name="maara" size="3" maxlength="3" value="${maara}" > Yhteensä: <input type="text" name="yhteensä" size="6" readonly value="${yhteensa}"> <input type="submit" name="action" value="laske"> </form> tulostaa Tilanne Laske-nappulan painalluksen jälkeen:
24(27) Pääservletti vastaanottaa tietoa JSP-sivulta: ServletRequest-luokan metodit: String getparameter(string); String [] getparametervalues(string); Ks. http://java.sun.com/j2ee/1.4/docs/api/javax/servlet/servletrequest.html esim. protected void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { String action = request.getparameter("action"); RequestDispatcher disp ; if (action!= null && action.equals("laske")) { int paikka =Integer.parseInt(request.getParameter("paikka")); int maara=integer.parseint(request.getparameter("maara")); } int summa = maara*paikka; request.setattribute ("yhteensa",""+summa); request.setattribute("maara",""+maara); request.setattribute("paikka",""+paikka); } disp = request.getrequestdispatcher("web-inf/koe8.jsp"); disp.forward(request, response);
25(27) Pääservletti lähettää tietoa JSP-sivulle: Metodi: void setattribute(string attribuutinnimi, String attribuutinarvo); Esim. <body> <h3>henkilön tiedot </h3> <form action="kokeilut" method="post"> Kirjaudu: käyttäjätunnus: <input type="text" name="kayttaja" size="15" maxlength="15" /> salasana: <input type="password" name="sala" size="5" maxlength="5" /> <input type="submit" name="action" value="kirjaudu" /> </form> <FORM action="kokeilut" method="get"> <input type="hidden" name="tunnus" value="${tunnus}" > <input type="hidden" name="nimi" value="${nimi}" > <P> First name: <INPUT type="text" name="etunimi" value="${etunimi}" size="25" maxlength="25"> Last name:<input type="text" name="sukunimi" value="${sukunimi}"> email: <INPUT type="text" name="email" value="${email}"> sukupuoli: <c:if test="${sex==\"female\"}" > <INPUT type="radio" name="sex" value="male"> Male<BR/> <INPUT type="radio" name="sex" value="female" checked > Female<BR/> </c:if> <c:if test="${sex!=\"female\"}" > <INPUT type="radio" name="sex" value="male" checked > Male<BR/> <INPUT type="radio" name="sex" value="female" > Female<BR/> </c:if>...
26(27) tulostuu, kun käyttäjä avaa ikkunan ensimmäisen kerran: seuraavaksi hän painaa Kirjaudu-nappulaa tulostuu:
27(27) Mitä tapahtuu pääservletin doget-metodissa? protected void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { String action = request.getparameter("action"); RequestDispatcher disp ; boolean painettu= false; if (action!= null && action.equals("kirjaudu")) { String kayttaja = request.getparameter("kayttaja"); String salasana=request.getparameter("sala"); request.setattribute("tunnus","a1010101"); request.setattribute("nimi","toimitusjohtaja Wilma Lahtinen"); request.setattribute("etunimi", "Ronja"); request.setattribute("sukunimi","röverdotter"); request.setattribute("email","ronja@skog.se"); request.setattribute("sex","female"); } } disp = request.getrequestdispatcher("web-inf/koe8.jsp"); disp.forward(request, response);