HSMT Web-sovellustekniikoista Ville Leppänen HSMT, c Ville Leppänen, IT, Turun yliopisto, 2011 p.1/29
Missä mennään... 1. Johdanto (1h) 2. Säikeet (2h) 3. Samanaikaisuudesta (2h) 4. Hajautetuista sovelluksista (1h) 5. Soketit (3h) 6. RMI (2h) 7. RPC ja Corba (2h) 8. Protokollista, XML (2h) 9. WWW-sovellustekniikoista (2h) 10. Pilvialustat (2h) 11. Haja-aiheita (1h) 99. Kertausluento (2h) + 1h pelivaraa HSMT, c Ville Leppänen, IT, Turun yliopisto, 2011 p.2/29
Rakenne Yleiskuva Web 2.0: WWW-sovellusten luonne WWW:n RIA-tekniikoista yleisesti Vaadin Servlet-tekniikasta HSMT, c Ville Leppänen, IT, Turun yliopisto, 2011 p.3/29
Yleiskuva Pohditaan: Mitä osapuolia hajautetun järjestelmän kannalta web-sovelluksissa? Mikä muuttuu web:n myötä? Mihin tekniikan oikeastaan kohdistuvat? Mitä resursseja web-sovellusten osapuolilla on? HTML5:n tuoma muutos... HSMT, c Ville Leppänen, IT, Turun yliopisto, 2011 p.4/29
Web-sovellusten luonne Web 1.0 Web 2.0: käyttäjät muuttuvat pasiivisista hyödyntäjistä sisällön muokkaajiksi ja primääriseksi tuottajaksi. Sosiaalinen media eri muotoineen. Selaimen kannalta: Selain tarjoaa lähinnä vain käyttöliittymän WWW-sovelluksille tietoresurssit ovat palvelimissa enimmäkseen käyttöliittymätekniikka-asiaa. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2011 p.5/29
RIA-tekniikoista Ajax Flash + Flex Silverlight JavaFX JavaServer Faces Vaadin... ei oikeastaan tämän kurssin asiaa. Parhaimmillaan vastaa standalone-sovelluksen tekoa. Käyttäjä ei näe UI:n ja logiikan erottelua selain- ja palvelinosiin. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2011 p.6/29
Vaadin IT Mill Oy (Turku). Katsotaan kuvia 3.1 ja 4.1 Vaadin-kirjasta. Vaadin-sovelluksen tekeminen näyttää standalone-sovelluksen (Swing:n tapainen) tekemiseltä. Pääpaino on GUI-asioissa. Palvelin puolella Vaadin-sovellus on servletti. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2011 p.7/29
Servletit version 2.1 mukaan Tilanne: Mikä servletti oikein on? WWW ja HTML-tiedostojen rakenne HTTP-protokolla Miten välittää tietoa? Lomakkeet Luokat Servlet ja HttpServlet Luokat HttpServletRequest ja HttpServletResponse sekä Cookie Esimerkkejä (Kirja: Java Servlet Programming, Jason Hunter & William Crawford, 1998.) HSMT, c Ville Leppänen, IT, Turun yliopisto, 2011 p.8/29
Tilanne 1/3 Servletti eli palvelinsovelma on www-palvelimessa suoritettavaksi tarkoitettu (tietynlainen) Java-ohjelma. Kaikki palvelimet eivät tue servlettejä (JSDK). Servletit eivät osa JDK:ta asennettava JSDK & palvelin & paketit kääntäjän yhteyteen. http://java.sun.com/products/servlet/ Servlet-ohjelmia ajetaan palvelimen oikeuksilla. Servlettiolio voidaan luoda jokaisen kutsun seurauksena tai se voi olla pysyvä osa palvelinta (raskaat sovellukset). Palvelinkohtaista: nykyisin yleensä pysyviä. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2011 p.9/29
Tilanne 2/3 Servletit ovat olioita ja luomisen jälkeen niitä käyttävä taho kutsuu niiden init()-metodia. WWW-palvelimen tehtävä: välittää html-sivuja. HTML-sivut: tekstimuotoisia sisältäen muotoilukomentoja ja esim. viittauksia muihin dokumentteihin. HTTP-protokolla: GET, POST, PUT + muutama muu komento. Pohjimmiltaan HTTP on yhteydetön! Miten välittää tietoa palvelimelle? Lomakkeet! Servlet pystyy käsittelemään mm. GET- ja POST-pyyntöjä. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2011 p.10/29
Tilanne 3/3 Idea: dynaaminen www-sivun generointi! Toinen idea: Työnjako: palvelin tekee raskaan työn. Esim. tietokantakysely. 2-tier, 3-tier, multitier... Huomaa: Servlettejä ja appletteja ei ole tehty kommunikoimaan keskenään! Servlettiä kutsutaan HTTP-protokollaa käyttäen. Appletti voi toimia niin, että jäsentää tuloksen vastauksena saamastaan HTML-sivusta; tuolloin appletti toimii selaimena... ei ole kovin järkevää... Itse asiassa servletin ja appletin välille on mahdollista luoda myös soketti- ja/tai RMI-yhteys. Ei luonnollista. (Ei käsitellä.) HSMT, c Ville Leppänen, IT, Turun yliopisto, 2011 p.11/29
Tilannekuva www palvelin kone www selain GET komento HTML sivu verkkoyhteys www palvelin prosessi POST komento HTML sivu doget() dopost() servletti olioita HSMT, c Ville Leppänen, IT, Turun yliopisto, 2011 p.12/29
Lomakkeista Servlettiä voi käyttää ottamaan tietoa lomakkeelta. HTML-tiedostossa: <FORM METHOD="POST" ACTION="http://kohdekone/servlets/OmaServletti">... määrityksiä </FORM> POST tai GET (ero on tekninen, syy osin vanhentunut). HSMT, c Ville Leppänen, IT, Turun yliopisto, 2011 p.13/29
FORM-määrittelyitä 1/3 Erilaisia kenttiä: <INPUT TYPE="tyyppi" NAME="nimi" VALUE="arvo"> TYPE=text voidaan syöttää tekstiä; alkuarvo. TYPE=radio radionappula; NAME kertoo ryhmän; VALUE:lla voidaan välittää tieto, mikä valittu. TYPE=checkbox valintaruutu; kuten radio. TYPE=submit nappula, jota painamalla ACTION osa käynnistyy; VALUE: nappulan teksti. TYPE=reset kuten submit, mutta tarkoituksena palauttaa painamisen seurauksena alkuarvoiksi. TYPE=image kuten submit, mutta nappulan sisältönä kuva. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2011 p.14/29
FORM-määrittelyitä 2/3 TYPE=password salasanakenttä. TYPE=file mahdollistaa tiedoston nimen valinnan ja tiedoston lähettämisen, jos FORM:n otsikossa ENCTYPE="multipart/mime". TYPE=hidden piilokenttä vakioarvon välittämiseksi. Valintalista: <SELECT NAME="nimi"> <OPTION>Vaihtoehto nro1 <OPTION SELECTED>Vaihtoehto nro2 <OPTION>Vaihtoehto... </SELECT> Tavallaan tämä on kenttä, jonka arvo valitaan annetusta joukosta. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2011 p.15/29
FORM-määrittelyitä 3/3 Tekstialue: <TEXTAREA NAME="nimi" ROWS="rivit" COLS="sarakkeet"> Tässä voi antaa tekstin oletusarvon </TEXTAREA> FORM:n muoto on muuttunut HTML:n versioiden myötä (nyk. 4.0). HSMT, c Ville Leppänen, IT, Turun yliopisto, 2011 p.16/29
HelloServlet.html <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> HSMT, c Ville Leppänen, IT, Turun yliopisto, 2011 p.17/29
HelloServlet.java 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://staff.cs.utu.fi/icons/slidbar.gif alt=>" out.println("<h1> Tervehdys! </h1>"); out.println("<img src=http://staff.cs.utu.fi/icons/slidbar.gif alt=>" out.println("</body></html>"); } // doget } // class HelloServlet HSMT, c Ville Leppänen, IT, Turun yliopisto, 2011 p.18/29
LomakeServlet.html 1/3 <html> <head> <title> Lomakkeen välittämistä... </title> <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> HSMT, c Ville Leppänen, IT, Turun yliopisto, 2011 p.19/29
LomakeServlet.html 2/3 <p> Salasana: <input type=password name="kenttä3" value=""> </p> <p> Opinnot aloitettu: <select name="opinnot"> <option> muu <option selected> 1999 <option> 2000 <option> 2001 </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> HSMT, c Ville Leppänen, IT, Turun yliopisto, 2011 p.20/29
LomakeServlet.html 3/3 <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> HSMT, c Ville Leppänen, IT, Turun yliopisto, 2011 p.21/29
LomakeServlet.java 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 HSMT, c Ville Leppänen, IT, Turun yliopisto, 2011 p.22/29
Luokka Servlet Rajapinta. Tämän toteuttaa GenericServlet ja HttpServlet (abstrakteja). 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. Muutama muukin metodi. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2011 p.23/29
Luokka HttpServlet Metodit erilaisille palvelupyynnöille ( service ). Tästä luokasta tyypillisesti johdetaan omia servlettejä. Seuraavassa rq tyyppiä HttpServletRequest ja rs tyyppiä HttpServletResponse. dodelete(rq, rs): HTTP DELETE -operaatio. doget(rq,rs): HTTP GET. dopost(rq,rs): HTTP POST. doput(rq,rs): HTTP PUT. Muitakin vastaavia on. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2011 p.24/29
Luokka HttpServletRequest Paljon erilaisia havainnointimetodeja. getcontenttype() datan tyyppi. getcontentlength() datan pituus. String getparameter(string p) palauttaa lomakkeelta lähetetyn parametrin p arvon. String[] getparameternames() Parametrien nimet. ServletInputStream getinputstream() Binäärinen lukuvirta lähetettyyn dataan. BufferedReader getreader() Sama tekstipohjaisena. Cookie[] getcookies() palauttaa sisääntulevat piparit! getremotehost, getremoteaddr, getremoteuser, getmethod, getservername, getserverport,... HSMT, c Ville Leppänen, IT, Turun yliopisto, 2011 p.25/29
Luokka HttpServletResponse Paljon metodeja. ServletOutputStream getoutputstream() Palauttaa binäärisen lähtevän virran. PrintWriter getwriter() Sama merkkipohjaisena; tällä toteutetaan sivujen kirjoittaminen. setcontentlength, setcontenttype void senderror(int code, String msg) Palauttaa virheilmoitussivun takaisin. void addcookie(cookie c) Asettaa piparin lähtevään virtaan. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2011 p.26/29
Luokka Cookie Piparin avulla palvelin voi tallettaa asiakkaaseen tietoa itsestään ja yhteydestään tähän asiakkaaseen. Cookie(String name, String value) Konstruktori, joka luo piparin, jolla nimi name ja arvo value (RFC 2109). Useita ominaisuuksia: kommentti merkityksestä, voimassaoloaika, domain-nimi, URL-polku (mille sivuille palautetaan), arvo, nimi, versionumero ja turvallisuus. boolean getsecure() Onko turvallinen yhteys käytössä? HTTPS tai SSL. Perusajatus on, että pipari lähetetään takaisin vain sinne, mistä se tuli (domain). HSMT, c Ville Leppänen, IT, Turun yliopisto, 2011 p.27/29
Lopuksi 1/2 Servletit ovat www-palvelimessa olevia olioita, joita voidaan kutsua säilyttävät tilansa kutsusta toiseen. Alunperin: käyttö lomakkeiden kautta. JSP: sekoitetaan servlet-koodia sivuihin. Idea: dynaamiset sivut & työn siirtäminen palvelimelle. Piparit toimivat palvelimen muistina. Usein halutaan tallettaa (lomakkeiden) tietoja tietokantaan. HSMT, c Ville Leppänen, IT, Turun yliopisto, 2011 p.28/29
Lopuksi 2/2 Servlet applet -keskustelu? Mahdollista soketeilla ja RMI:llä. (Myös HTTP-yhteydellä.) Kehitystä ohjattu RFC-dokumenteilla, mutta eri versioita servlet-ominaisuuksista, html:stä, http:stä,... Tiedostoja on mahdollista lukea servleteillä... mutta se ei ole helppoa. (Alussa mainittu kirja.) Yleinen käytäntö: Lomakkeet voidaan koodata osaksi servlettiä: doget antaa lomakkeen, joka kutsuu dopost:a! HSMT, c Ville Leppänen, IT, Turun yliopisto, 2011 p.29/29