© Kozsik Tamás 2000-2006 Szervletek „Kis szerverprogram” Kliens-szerver architektúrát feltételezünk Szerveroldalon futó kisalkalmazás Mint ahogy az applet.

Slides:



Advertisements
Hasonló előadás
© Kozsik Tamás Különböző nyelvekhez igazítás Internationalization - i18n.
Advertisements

4. alkalom – Hálózat Kezelés
Osztály leszármaztatás
RESTful Web Service tesztelése
© Kozsik Tamás Adatbáziskezelés •Relációs adatbáziskezelők •Noha a Java objektum-elvű, egyelőre nem az objektum-elvű adatbáziskezelőket támogatja.
Programozás III STRING-XML.
Felhasználói felületek és üzleti logika Bollobás Dávid ASP.NET
© Kozsik Tamás Appletek A Java nyelv elsődleges számú reklámja HTML oldalak aktívvá tevéséhez Kisalkalmazás WEB-böngésző által futtatott Java.
Programozás III KOLLEKCIÓK 2..
1 Hernyák Zoltán Programozási Nyelvek II. Eszterházy Károly Főiskola Számítástudományi tsz.
Adatbányászati technikák (VISZM185)
Öröklődés 2..
HADOOP Korszerű Adatbázisok Elérés, Belépés Elérés: eszakigrid109.inf.elte.hu Belépés: felhasználó/jelszó: neptun-kód Manager oldalak:
RMI = Remote Method Invocation
© Kozsik Tamás Beágyazott osztályok A blokkstrukturáltság támogatása –Eddig: egymásba ágyazható blokk utasítások Osztálydefiníciók is egymásba.
Bevezetés a Java programozásba
Fájlkezelés, IO Kivételkezelés Belső osztályok
Osztályok Garbage collection.  általában minden osztálynak vannak adattagjai és/vagy metódusai ◦ adattagok megadása:  [láthatóság] [static] [final]
1 Fejlett Programozási Technikák 2. 15/9. Fejlett Programozási Technológiák 2. 2 Az előző mai előadás tartalma: Számítógépes biztonság Jáva és a biztonság.
Abstract osztályok és interface-ek Beolvasás és kiíratás 7. gyakorlat.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 9. Gyakorlat Alap file műveletek.
Programozás II. 3. Gyakorlat C++ alapok.
UNIVERSITY OF SZEGED D epartment of Software Engineering UNIVERSITAS SCIENTIARUM SZEGEDIENSIS Programozás II. 6. Gyakorlat const, static, dinamikus 2D.
Fejlett Programozási Technológiák II. Világos Zsolt 1. gyakorlat.
1 Fejlett Programozási Technikák 2. 15/10. Fejlett Programozási Technológiák 2. 2 Az előző előadás tartalma Java Servlet  Servlet Interfész  Servlet.
Tömbök ismétlés Osztályok Java-ban Garbage collection
A Java programozási nyelvSoós Sándor 1/17 Java programozási nyelv 4. rész – Osztályok II. Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai.
A C++ programozási nyelvSoós Sándor 1/15 C++ programozási nyelv Gyakorlat hét Nyugat-Magyarországi Egyetem Faipari Mérnöki Kar Informatikai Intézet.
Java programozási nyelv 5. rész – Osztályok III.
WEB Technológiák Dr. Pance Miklós – Kolcza Gábor Miskolci Egyetem.
Hálózatkezelés, java.net Elek Tibor
C# tagfüggvények.
JSP és JavaBean JavaServer Pages és Java Beans Fabók Zsolt Általános Informatikai Tanszék Miskolci Egyetem.
C# tagfüggvények.
Szmetankó Gábor Greencode Kft.
Csomagok.
Annotációk a Java 5 nyelvben Kozsik Tamás. Annotációk Módosítószavak bővítése A programszöveg elemeihez rendelhetők –Csomagokhoz, típusokhoz, metódusokhoz,
Szombathely Dinamikus WEB programozás: PHP és JSP.
© Kozsik Tamás Csomagok. © Kozsik Tamás A program tagolása Típusdefiníciók (osztályok, interfészek) Metódusok Blokk utasítások Csomagok.
WEB MES (webes gyártásirányító rendszer)
PHP I. Alapok. Mi a PHP? PHP Hypertext Preprocessor Szkriptnyelv –Egyszerű, gyors fejlesztés –Nincs fordítás (csak értelmező) Alkalmazási lehetőségek:
Appletek és Servletek Demeter Lehel 641-es csoport.
Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
Szoftvertechnológia alapjai Java előadások Förhécz András, doktorandusz tárgy honlap:
Készítette: Lipp Marcell
Javascript Microsoft által készített kiegészítése Statikus típusosság Nagy projektek Windows 8 fejlesztésénél WinRT egy részét ebben írták Nyílt forráskódú,
3. előadás.  Apache szerver tudnivalók  Az index.php .htaccess – web-szerverünk beállításai  Konfigurációs állományok  Adatbázis kapcsolódás beállítása.
Web Architecture. Development of Computing Architectures Monolithic mainframe programming Client Server Real Client Server Web Programming.
Java programozási nyelv Filekezelés
Komoróczy Tamás 1 Java programozási nyelv A nyelv alapjai.
Java programozási nyelv Adatbekérés konzolról
Web fejlesztés V. Illés Zoltán ELTE Informatikai Kar
Illés Zoltán ELTE Informatikai Kar
Java web programozás 11..
Fejlett Programozási Technológiák II. 2009, Nagy Csaba JSP – Java Server Pages.
Programozás III KIVÉTEL.
Illés Zoltán ELTE Informatikai Kar
Java web programozás 7-8..
Webes MES keretrendszer fejlesztése Kiss Miklós Dániel G-5S8 Tervezésvezető: Dr. Hornyák Olivér.
Java web programozás 5..
OpenCMS programozói bevezetés Krizsán Zoltán iit me.
Java web programozás 6..
1Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Programozás I. 1. gyakorlat.
1Szegedi Tudományegyetem Természettudományi és Informatikai KarAntal Gábor Programozás I. 6. gyakorlat.
Opencms modul fejlesztés Krizsán Zoltán. Modulok fajtái Nincs előírás, csak tipikus tennivalók: –Content type: új típus(oka)t vezet be. –Template: új.
TÁMOP /1-2F JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam Osztályok, objektumok definiálása és alkalmazása. Saját.
Programozás III JPA.
Krizsán Zoltán, iit C# osztályok 2 Adattagok  Osztály hatáskörben definiált változó.  Formája: [attribútum] [módosító] típus azonosító [=kezdő érték][,
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
JAVA programozási nyelv NetBeans fejlesztőkörnyezetben I/13. évfolyam
Előadás másolata:

© Kozsik Tamás Szervletek „Kis szerverprogram” Kliens-szerver architektúrát feltételezünk Szerveroldalon futó kisalkalmazás Mint ahogy az applet egy kliens oldali kisalkalmazás Például egy HTTP szerverbe integrált program A CGI programozás Java megfelelője

© Kozsik Tamás CGI programok CGI = Common Gateway Interface A HTTP szerver nem egy „igazi” HTML oldalt ad vissza Egy program generálja az oldalt Dinamikus HTML oldal: tartalma paraméterektől függhet A programot egy speciális URL-re történő hivatkozáskor indítja a HTTP szerver Pl. adatbázisból vehet adatokat, hogy egy HTML form-ra reagáljon

© Kozsik Tamás Ugyanez Java-ban: szervletekkel A HTTP szerverbe be van integrálva egy Java Virtuális Gép Ez tud szervleteket futtatni, amikor erre igény van Egy speciális (szervletet azonosító) URL-re történő hivatkozáskor a szervlet állítja elő a HTTP szerver válaszát

© Kozsik Tamás Miért jobb, mint a CGI? Platform-független megoldás Hatékonyabb –Igaz, hogy a Java lassú, de… –A WEB szerveren belül állandóan fut a JVM: gyorsabb, mint egy külső programot indítani (általában a CGI programok szkript nyelven íródtak, ugyanúgy interpretáltak/lassúak, mint a Java) Konkurrens kéréskiszolgálások szinkronizációja Azonos helyről jövő kérések kiszolgálása között információ megőrzése viszonylag könnyű A (web)szerver szolgáltatásait (pl. log) igénybe veheti

© Kozsik Tamás Mi ez a technológia? Régebben: Server Development Kit segítségével Ma már integrált más technológiákkal – JSP (Java Server Pages) –A Java Enterprise Technológia szerves része Megfelelő WEB szerver kell a futtatáshoz –SUN referencia implementáció: használja a Tomcat-et (Jakarta projekt, Apache SW Found.) –Persze a mai profi eszközök is fel vannak már erre készítve (pl. az Apache, MS IIS, stb.) –Applikáció szerverek (BEA, IBM, iPlanet, stb.)

© Kozsik Tamás Java Servlet Development Kit JSDK április Ez már csak az archívumban található meg Tartalma –szervlet programozói könyvtár (API) servlet.jar –egy játék Web-szerver fejlesztéshez/teszteléshez –példaprogramok

© Kozsik Tamás JSDK: a Web szerver Indítás: startserver (.bat ) Alapértelmezésben nem a szokványos 80-as TCP portot használja, hanem a 8080-asat Egy böngészővel próbáljuk ki: Vagy akár egy másik gépen futót... Leállítás: stopserver (.bat ) Van egy speciális könyvtár, ahova a szervleteinket kell pakolni

© Kozsik Tamás Tomcat Apache Jakarta project Önálló és beágyazható webszerver Catalina (szervlet konténer) Jasper (JSP motor)

© Kozsik Tamás A szerver programozói könyvtár A servlet.jar fájl tartalmazza javax.servlet és javax.servlet.http csomagok –szabványos kiterjesztések (standard extension) Ezt a jar fájlt bele kell tenni a classpath-ba

© Kozsik Tamás Szervletek és HTTP szervletek Leggyakrabban HTTP protokollt használó szervleteket szoktak írni (pl. mi is azt fogunk) javax.servlet.http.HttpServlet Lehetőség van más protokoll használatára is javax.servlet.Servlet interfész javax.servlet.GenericServlet

© Kozsik Tamás import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class Hello extends HttpServlet { public void doGet( HttpServletRequest req, HttpServletResponse res ) throws IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println(" Hi " + " Hello "); out.close(); }

© Kozsik Tamás import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class Hello extends HttpServlet { public void doGet( HttpServletRequest req, HttpServletResponse res ) throws IOException { res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println(" Hi " + " Hello "); out.close(); } public String getServletInfo(){ return "Hello servlet by Tamás Kozsik"; }

© Kozsik Tamás Első szervletünk: Hello Importáljuk a javax.servlet, a javax.servlet.http és a java.io tartalmát Írunk egy doGet metódust A doGet paramétere HttpServletRequest és HttpServletResponse Az utóbbira kinyomtatunk egy HTML oldalt, amit a böngésző kap majd

© Kozsik Tamás Kipróbálás (JSDK) Fordítsuk le! Használjuk a szervlet API-t! A.class fájlt másoljuk a webpages/WEB-INF/servlets könyvtárba Indítsuk el/újra a webszervert Állítsuk a böngészőt erre az oldalra: Próbáljuk elérni a más számítógépeken futó web-szervereket is...

© Kozsik Tamás Kipróbálás (Tomcat) Fordítsuk le! Használjuk a szervlet API-t! Készítsünk el egy pár könyvtárat: webapps/haliho webapps/haliho/WEB-INF webapps/haliho/WEB-INF/classes A.class fájlt másoljuk a legutóbbiba Indítsuk el/újra a webszervert Állítsuk a böngészőt erre az oldalra: Próbáljuk elérni a más számítógépeken futó web- szervereket is...

© Kozsik Tamás Értékelés Ez a szervlet mindig ugyanazt az oldalt adja vissza Az igazi haszna a szervleteknek a dinamikus HTML oldalak generálásában rejlik Sokszor a szervlet aktiválása a böngészőből paraméterek átadásával is jár Például egy HTML form a szervlettől vár választ

© Kozsik Tamás Feladat Írjunk olyan szervletet, amely egy, a felhasználó által begépelt szöveget megfordít. Használjunk HTML form-ot! A form egy szövegbeviteli mezőt tartalmazzon, melynek tartalmát (Enter hatására) elküldjük a szervletnek.

© Kozsik Tamás A HTML form Hi <form action = " method = post> Szöveg:

© Kozsik Tamás Mit csinál ez a form? A szövegbeviteli mező neve: szo A form kitöltése után (Enter hatására) a böngésző a web-szervertől ezt az oldalt kéri el: Ez egy szervlet címe, az ő válaszát jeleníti meg. A kéréssel együtt elküldi a form-ba bevitt információkat is, melyekhez a szervlet hozzáfér. Az információ „csomagolási módja” most „post”. Azaz a szervlet a doPost metódusával reagál rá. –A másik lehetőség a get, doGet lenne.

© Kozsik Tamás import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class Fordit extends HttpServlet { public void doPost( HttpServletRequest req, HttpServletResponse res ) throws IOException { StringBuffer s = new StringBuffer( req.getParameter("szo") ); res.setContentType("text/html"); PrintWriter out = res.getWriter(); out.println( " Hi " + " " + s.reverse().toString() + " "); out.close(); }

© Kozsik Tamás A szervlet működése A szervlet majdnem ugyanolyan, mint az előző példában Lekéri a „szo” nevű paraméterének értékét. Ez a „szo” szövegbeviteli mező tartalma Ezt az értéket megfordítja, és beleszövi a generált HTML oldalba. A szervlet fordítása, installálása és futtatása a már megismert módon történik. A HTML oldal akárhol is lehet, csak rá tudjunk állítani egy web-böngészőt.

© Kozsik Tamás Webalkalmazás Modern világ… A szervletet a web.xml fájl segítségével lehet konfigurálni Ezt a fájlt az alkalmazás (például haliho ) WEB-INF könyvtárába kell helyezni Az alkalmazáshoz tartozó statikus oldalak és egyéb fájlok a WEB-INF -en kívül lesznek A WEB-INF/lib könyvtárban jar fájlokban a használt programkönyvtárak (például JDBC meghajtók) lehetnek

© Kozsik Tamás Példa webalkalmazásra webapps haliho fordit.html WEB-INF web.xml classes Fordit.class lib

© Kozsik Tamás web.xml <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" " szevasz Hello

© Kozsik Tamás Webkonténer (Web)szerverben futó JVM Middleware szolgáltatásokat biztosít a benne futó webkomponenseknek (webalkalmazásoknak) Telepítési leírás (deployment descriptor) web.xml Catalina a Tomcat webszerverben

© Kozsik Tamás Web Archive war kiterjesztésű fájl Ugyanolyan zip fájl, mint egy jar, csak éppen webalkalmazást vagy webkomponenst tartalmaz A jar paranccsal készíthetjük el jar cvf../haliho.war *

© Kozsik Tamás Telepítés Tomcat alá Vagy a megfelelő belső szerkezetű könyvtárakat, vagy a belőle készített war fájlt bemásoljuk a webapps könyvtárba és újraindítjuk a tomcat szervert. Hot deployment is lehetséges: manager (telepítés a szerver újraindítása nélkül)

© Kozsik Tamás Tomcat manager Egy előre telepített webalkalmazás A futó szerver alatt tudjuk az alkalmazásokat kezelni –listázás –telepítés / eltávolítás haliho&war=file:/home/kto/haliho haliho&war=jar:file:/home/kto/haliho.war!/ –aktiválás / deaktiválás –frissítés

© Kozsik Tamás Azonosítás Alapból nincs engedélyezve Az alapértelmezett azonosítás: MemoryRealm $CATALINA_HOME/conf/tomcat-users.xml Be kell írni egy ilyen sort:

© Kozsik Tamás Alkalmazás frissítése A manager segítségével A conf/server.xml fájlban használjuk a relodable tagot –periodikusan ellenőrzi, hogy változott-e valami –fejlesztés közben hasznos –élesben túl költséges

© Kozsik Tamás Visszatérve a web.xml fájlhoz Paraméterek átadása a szervletnek Paraméterek átadása a webalkalmazásnak servlet-mapping session-config filter filter-mapping listener...

© Kozsik Tamás Servlet, GenericServlet public interface Servlet { public void service( ServletRequest req, ServletResponse res ) throws ServletException, java.io.IOException;... } public abstract class GenericServlet implements Servlet, ServletConfig, Serializable {...}

© Kozsik Tamás HttpServlet public class HttpServlet extends GenericServlet { public void service(...) throws... {... } protected void doGet( HttpServletRequest req, HttpServletResponse res)... protected void doPost(... protected void doPut(... protected void doDelete(... protected void doHead(... protected void doOptions(... protected void doTrace(... protected long getLastModified (HttpServletRequest req)... }

© Kozsik Tamás Szervletek életciklusa Alapesetben minden szervletből egy példány jön létre a webszerverben Ez szolgálja ki a kéréseket konkurrens módon Létrejövetel (1x): paraméter nélküli konstruktor, init Kéréskiszolgálás: service Megszüntetés (1x): destroy

© Kozsik Tamás

public interface Servlet public void init( ServletConfig config ) throws ServletException public ServletConfig getServletConfig() public void service( ServletRequest req, ServletResponse res ) throws ServletException, java.io.IOException public void destroy() public String getServletInfo()

© Kozsik Tamás public abstract class GenericServlet implements Servlet, ServletConfig, Serializable public void init( ServletConfig config ) throws ServletException public ServletConfig getServletConfig() // eltárolja, illetve visszaadja config-ot // az init hívja a másik init-et public void init() throws ServletException // 2.1-től van, azóta lehet felüldefiniálni public abstract void service ( ServletRequest req, ServletResponse res ) throws ServletException, java.io.IOException

© Kozsik Tamás public abstract class GenericServlet implements Servlet, ServletConfig, Serializable Kényelmi metódusok public String getInitParameter(String name) public java.util.Enumeration getInitParameterNames() public ServletContext getServletContext() public void log(String msg) public void log(String message, Throwable t) public String getServletName()

© Kozsik Tamás public abstract class HttpServlet extends GenericServlet public void service( ServletRequest req, ServletResponse res ) // hívja a másik service-t protected void service( HttpServletRequest req, HttpServletResponse res ) throws ServletException, java.io.IOException // hívja a doGet/Post/Put/Head/Delete/Trace/Options metódusokat // ServletException fel nem ismert HTTP kérésre (felüldefiniálható) protected void doGet( HttpServletRequest req, HttpServletResponse res ) throws ServletException, java.io.IOException

© Kozsik Tamás public abstract class HttpServlet extends GenericServlet doGet, doPut, doPost, doDelete: Bad Request HTTP error doHead: mint doGet, de csak a fejlécek doOptions, doTrace protected long getLastModified(HttpServletRequest req)

© Kozsik Tamás Feladat Levelezési listára fel- és leiratkozás –perzisztens adatok (fájlban) –inicializációs paraméterek –HTTP-fejlécmezők Stefan Zeiger egy picit megpiszkáltam…

© Kozsik Tamás import java.util.*; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class ListManagerServlet extends HttpServlet { protected void doGet( HttpServletRequest req, HttpServletResponse res ) throws ServletException, IOException { … } protected void doPost( … ) … { … } … }

© Kozsik Tamás private Set addresses; private static class SubscriptionException extends Exception { SubscriptionException( String details ){ super(details); }; } private synchronized void subscribe (String ) throws IOException, SubscriptionException { if ( addresses.add ( ) ) save(); else throw new SubscriptionException( + " was already subscribed."); } private synchronized void unsubscribe (String ) throws IOException, SubscriptionException { if( addresses.remove( ) ) save(); else throw new SubscriptionException( + " was not subscribed."); }

© Kozsik Tamás private String filename; private void save() throws IOException { ObjectOutputStream out = new ObjectOutputStream( new FileOutputStream(filename) ); out.writeObject(addresses); out.close(); } private void load() throws Exception { ObjectInputStream in = new ObjectInputStream( new FileInputStream(filename) ); addresses = (Set) in.readObject(); in.close(); }

© Kozsik Tamás public void init () throws ServletException, IOException { filename = getInitParameter("addressfile"); if ( filename == null ) throw new UnavailableException ( this, "The \"addressfile\" property must be set to a file name" ); try { try { load(); } catch ( FileNotFoundException e ) { addresses = new HashSet(); save(); } } catch ( Exception e ) { throw new UnavailableException ( this, "Error accessing address file: " + e ); }

© Kozsik Tamás public void init ( ServletConfig config ) throws ServletException { super.init(config); filename = getInitParameter("addressfile"); … } Működik réges régi (2.1 előtti) szervletfuttató környezetekben is

© Kozsik Tamás protected void doGet ( HttpServletRequest req, HttpServletResponse res ) throws ServletException, IOException { res.setContentType("text/html"); res.setHeader("pragma", "no-cache"); PrintWriter out = res.getWriter(); out.print(" ListManager "); out.print(" Members: "); synchronized (this) { for ( Iterator i = addresses.iterator(); i.hasNext(); ) { out.print( " " ); out.print( i.next() ); } out.print(" "); out.print(" Enter your address: "); out.print(" "); out.close(); }

© Kozsik Tamás protected void doPost ( HttpServletRequest req, HttpServletResponse res ) throws ServletException, IOException { try { String mes; String = req.getParameter(" "); if ( == null ) throw new SubscriptionException("No address given."); if ( "subscribe".equals(req.getParameter("action")) ){ subscribe( ); mes = " has been subscribed"; } else { unsubscribe( ); mes = " has been removed"; } printHTML(req,res, ,mes); } catch (SubscriptionException e) { res.sendError(res.SC_BAD_REQUEST, e.getMessage()); }

© Kozsik Tamás private void printHTML( HttpServletRequest req, HttpServletResponse res, String , String mes) throws IOException { res.setContentType("text/html"); res.setHeader("pragma", "no-cache"); PrintWriter out = res.getWriter(); out.print(" List Manager "); out.print( ); out.print(mes); out.print(" <A HREF=\" "); out.print(req.getRequestURI()); out.print(" \">Show the list "); out.close(); } public String getServletInfo() { return "ListManagerServlet 1.1 by Stefan Zeiger, modified by KTO"; }

© Kozsik Tamás Konkurrens kéréskiszolgálás Alapesetben egy szervletből egy példány jön létre a konténerben A programozó megvalósíthat szálbiztos kiszolgálást –lehetőleg ne szinkronizáljuk az egész service metódust vagy do* metódust Elavult (deprecated) rábízni a konténerre: implements SingleThreadModel –ilyenkor több példányt is létrehozhat (pool) –vagy szinkronizálja a service metódust distributable a web.xml fájlban: több virtuális gépben is példányosulhat

© Kozsik Tamás Session A HTTP protokoll állapotmentes –két kérés kiszolgálása között nem őriz meg információt a kérések küldőjéről Sok alkalmazás mégis ezt kívánja Megoldások: –Alacsonyszintű Láthatatlan form mező (csúnya megoldás) Cookie (csak ha a böngésző is engedi) URL-átírás (macerás) SSL Session (HTTPS esetén jó) –Magas szintű: Session API, konténer dolga a háttérben Cookie (JSESSIONID) vagy URL-átírás

© Kozsik Tamás Feladat Bevásárlókocsi –Beteszek FOO-t vagy BAR-t –Lekérdezem a tartalmat –„Fizetek” Stefan Zeiger egy picit megpiszkáltam…

© Kozsik Tamás Session API (cookie-val) HttpSession objektumban objektumokat tárolhatunk setAttribute és getAttribute –régebben: putValue és getValue session indítás és leállítás időkorlát

© Kozsik Tamás HTML form Online Shop <FORM METHOD=POST ACTION=" <INPUT TYPE=SUBMIT NAME=foo VALUE="Put a FOO into the shopping cart"> <INPUT TYPE=SUBMIT NAME=bar VALUE="Put a BAR into the shopping cart"> <INPUT TYPE=SUBMIT NAME=see VALUE="See the shopping cart contents"> <INPUT TYPE=SUBMIT NAME=buy VALUE="Buy the shopping cart contents">

© Kozsik Tamás protected void doPost ( HttpServletRequest req, HttpServletResponse res ) throws ServletException, IOException { HttpSession session = req.getSession(true); if ( session.isNew() ) { session.putValue ( "foo", new int[] {0} ); session.putValue ( "bar", new int[] {0} ); } int[] foo = (int[]) session.getValue("foo"); int[] bar = (int[]) session.getValue("bar"); String msg = feldolgoz(req,session,foo,bar); válaszol(req,res,msg,foo,bar); }

© Kozsik Tamás private String feldolgoz ( HttpServletRequest req, HttpSession session, … ) throws ServletException, IOException { if ( req.getParameter("foo") != null ) { ++ foo[0]; return "Bought a FOO. You now have " + foo[0] + "."; } else if ( req.getParameter("bar") != null ) { ++ bar[0]; return "Bought a BAR. You now have " + bar[0] + "."; } else if ( req.getParameter("buy") != null ) { session.invalidate(); return "Your order for " + foo[0] + " FOOs and " + bar[0] + " BARs has been accepted. " + "Your shopping cart is empty now."; } else { return "You have " + foo[0] + " FOOs and " + bar[0] + " BARs in your shopping cart. " }

© Kozsik Tamás private void válaszol ( HttpServletRequest req, HttpServletResponse res, String msg ) throws ServletException, IOException { res.setContentType("text/html"); res.setHeader("pragma", "no-cache"); PrintWriter out = res.getWriter(); out.print(" Shopping Cart "); out.print(msg); out.print(" <A HREF=\" "); out.print(req.getRequestURI()); out.print(" \">Back to the shop "); out.close(); }

© Kozsik Tamás Session API URL-átírással Ha a cookie-kat nem támogatja vagy nem engedélyezi a kliens A megőrzendő információkat belekódoljuk azokba az URL-ekbe, amelyek a kliens következő kérésében lesznek majd –FORM ACTION –encodeURL (régen: encodeUrl)

© Kozsik Tamás protected void doGet ( HttpServletRequest req, HttpServletResponse res ) throws ServletException, IOException { HttpSession session = req.getSession(false); res.setContentType("text/html"); res.setHeader("pragma", "no-cache"); PrintWriter out = res.getWriter(); out.print ( " Online Shop " ); out.print ( " <FORM METHOD=POST ACTION= " ); out.print ( res.encodeURL( req.getRequestURI() ) ); out.print ( " ><INPUT TYPE=SUBMIT NAME=foo " ); out.print ( " VALUE="Put a FOO into the shopping cart"> " ); out.print ( "<INPUT TYPE=SUBMIT NAME=bar " ); out.print ( "VALUE="Put a BAR into the shopping cart">" ); out.print ( "<INPUT TYPE=SUBMIT NAME=see " ); out.print ( "VALUE="See the shopping cart contents">" ); out.print ( "<INPUT TYPE=SUBMIT NAME=buy " ); out.print ( "VALUE="Buy the shopping cart contents">" ); out.print ( " " ); out.close(); }

© Kozsik Tamás private void válaszol ( HttpServletRequest req, HttpServletResponse res, String msg ) throws ServletException, IOException { res.setContentType("text/html"); res.setHeader("pragma", "no-cache"); PrintWriter out = res.getWriter(); out.print(" Shopping Cart "); out.print(msg); out.print(" <A HREF=\" "); out.print( res.encodeURL( req.getRequestURI() ) ); out.print(" \">Back to the shop "); out.close(); }

© Kozsik Tamás Szervletek közötti kommunikáció Metódus meghívása (1.*, 2.0) dispatch

© Kozsik Tamás ServletContext A szervletfuttató környezetet azonosítja a szervlet számára Egy példány webalkalmazásonként, virtuális gépenként és virtuális host-onként Egy „könyvtárnak” felel meg az URL névtérben –például: Információ megosztására, ha nem elosztható Alapértelmezett (default) kontextus –azon szervleteknek, amelyek nem részei webalkalmazásnak –nem elosztható

© Kozsik Tamás Webalkalmazás inicializációs adatai A szervlet kontextusán keresztül érhetők el getInitParameter, getInitParameterNames A telepítési leírásban megadhatók String kulcshoz String érték rendelhető … kulcs érték

© Kozsik Tamás Context Attribute Adatokat tárolhatunk a kontextusban –String kulcshoz Object rendelhető Használható egy alkalmazáson (kontextuson) belüli szervletek közötti információcserére –ha nem elosztható az alkalmazás –ha elosztható, használjuk helyette adatbázist vagy EJB komponenst Metódusok: setAttribute, getAttribute, getAttributeNames, removeAttribute

© Kozsik Tamás Erőforrások elérése A kontextuson belüli statikus erőforrásokhoz java.net.URL getResource (String path) InputStream getResourceAsStream (String path) java.util.Set getResourcePaths (String path) –path: /valami –Az alkalmazás (gyökér)kontextusán belül Statikus és dinamikus erőforrásokhoz RequestDispatcher getRequestDispatcher(String path) Más kontextus erőforrásaihoz ServletContext getContext (String uripath)

© Kozsik Tamás Ideiglenes munkakönyvtár Minden kontextushoz tartozik egy Védett a többi kontextustól Elérése: előre definiált kontextus attribútum –javax.servlet.context.tempdir –java.io.File objektum

© Kozsik Tamás ServletConfig Az inicializáció során kapja meg Rajta keresztül érhető el a ServletContext Szervletinicializációs paraméterek getInitParameter, getInitParameterNames –String kulcshoz String érték, a web.xml-ben … kulcs érték

© Kozsik Tamás Request Paraméterek Attribútumok HTTP fejlécek Cookie-k (getCookies) Locale-ok (getLocal, getLocales) …

© Kozsik Tamás Request paraméterek A query string-ből és a törzsből getParameter, getParameterValues, getParameterNames, getParameterMap A path információk nem tartoznak ide A post-olt paramétereket InputStream segítségével is feldolgozhatjuk –vagy az egyik, vagy a másik, amelyikkel kezdjük

© Kozsik Tamás Request attribútumok Konténer -> szervlet, szervlet -> szervlet String kulcshoz Object érték getAttribute, setAttribute, getAttributeNames

© Kozsik Tamás HTTP fejlécek getHeader, getHeaders, getHeaderNames getIntHeader, getDateHeader

© Kozsik Tamás Response Fejlécek beállítása a törzs küldése előtt setHeader, addHeader (+ kényelmi: int, Date) Átirányítás (sendRedirect), hibajelzés (sendError) Internacionalizáció setLocale, setContentType, setCharacterEncoding

© Kozsik Tamás A válasz bufferelése Ha a konténer támogatja ezt getBufferSize és setBufferSize –0, ha nincs bufferelés Amikor először ürül a buffer, akkortól számít a törzsküldés (isCommitted) flushBuffer reset és resetBuffer –csak kommittálás előtt –a reset a fejléceket is törli

© Kozsik Tamás RequestDispatcher Dinamikus, illetve statikus erőforrásokhoz A ServletContext-en keresztül; akár saját, akár más (getContext) kontextusból RequestDispatcher getRequestDispatcher(String path) –a kontextushoz képest relatív út, /valami RequestDispatcher getNamedDispatcher (String name) –a kontextusban ismeretes név Vagy a Request-en keresztül –a kéréshez képest relatív elérési út adható meg RequestDispatcher getRequestDispatcher(String path)

© Kozsik Tamás RequestDispatcher használata include –Az erőforrást belefoglalja a válasz törzsébe –Többször is csinálhatok ilyet –A hívott nem tudja megváltoztatni a fejléceket forward –A kiszolgálást rábízom a hívottra –Kommittált válasz után már nem hívható –Hívása után a válasz lezárul

© Kozsik Tamás Mapping A telepítési leírásban a webalkalmazáshoz névleképezési szabályokat adhatunk meg Így egy szervletet nem csak a neve alapján tud aktiválni egy klienskérés Névleképezési lehetőségek: –elérési út: /valami/* –kiterjesztés: *.valami –alapértelmezett szervlet: / –pontos illeszkedés: minden egyéb szevasz *.html

© Kozsik Tamás Mapping A telepítési leírásban a webalkalmazáshoz névleképezési szabályokat adhatunk meg Így egy szervletet nem csak a neve alapján tud aktiválni egy klienskérés Névleképezési lehetőségek: –elérési út: /valami/* –kiterjesztés: *.valami –alapértelmezett szervlet: / –pontos illeszkedés: minden egyéb szevasz /alma/korte/*

© Kozsik Tamás Hibalap A telepítési leírásban a webalkalmazáshoz hibalapokat adhatunk meg Hibakód (sendError) vagy fellépő kivétel típusa alapján választ a konténer –az -ek egyediek a hibakódot, illetve a kivételtípust illetően –kivételtípusnál az osztályhierarchiában a legközelebbi nyer html

© Kozsik Tamás Hibalap A telepítési leírásban a webalkalmazáshoz hibalapokat adhatunk meg Hibakód (sendError) vagy fellépő kivétel típusa alapján választ a konténer –az -ek egyediek a hibakódot, illetve a kivételtípust illetően –kivételtípusnál az osztályhierarchiában a legközelebbi nyer app.MyException 400.html

© Kozsik Tamás Üdvözlő oldal (welcome file) Ha egy kérésben szereplő URI egy könyvtár, ami nincs szervletre (vagy JSP oldalra) képezve akkor a konténer megpróbálja kiegészíteni ezekkel index.html default.jsp

© Kozsik Tamás Webalkalmazás környezete (environment) Tipikusan J2EE-konform webkonténernél JNDI-be bejegyzett erőforrások Fajtái: –env-entry –ejb-ref –ejb-local-ref –resource-ref –resource-env-ref

© Kozsik Tamás Eseménykezelő (listener) Webalkalmazásokhoz rendelhető Különböző események bekövetkeztekor a konténer automatikusan hívja őket ServletContext, HttpSession, ServletRequest Életciklus-események, attribútum-változások Alma public class Alma implements HttpSessionListener { … }

© Kozsik Tamás Filter Dinamikus és statikus erőforrások szolgáltatása előtt, illetve után végrehajtódhat A fejlécek és tartalmak transzformálására Mind kérés, mind válasz esetén Példák: –authentikáció –logolás –képek konvertálása –tömörítés –titkosítás definiálás: erőforrásokhoz rendelés:

© Kozsik Tamás Működési folyamat Meghívódik a doFilter(req,res,chain) –A FilterChain objektumot a konténer adja Megvizsgálhatja a req fejléceit Becsomagolhatja egy saját, specializált req-ba Becsomagolhatja a res-t is Hívja a chain.doFilter(req,res) metódust –mely pl. továbbmehet a következő filterre, vagy a tényleges erőforrásra Megvizsgálhatja a res fejléceit

© Kozsik Tamás Sorrend a láncon segítségével kapcsolt filterek, az előfordulásuk sorrendjében maga az erőforrás

© Kozsik Tamás Filter és dispatcher 2.4-től van ez a lehetőség Nem csak klienskérésre kapcsolhat be a filterezés Akár include, forward vagy error esetén is elem(ek)ben megadható: REQUEST, INCLUDE, FORWARD, ERROR

© Kozsik Tamás Webalkalmazás indítása Listener objektumok példányosítása (1/def/JVM) ServletContextListener-ekre contextInitialized meghívása Filterek példányosítása (1/def/JVM) és init metódusuk meghívása Azon szervletek példányosítása és init metódusuk meghívása amelyekben van

© Kozsik Tamás Biztonság Authentication (azonosítás) Access control for resources (hozzáférési jogok erőforrásokhoz) Data integrity (illetéktelen nem módosíthatja az adatokat) Data privacy (csak az kaphatja meg az adatokat, aki jogosult rá)

© Kozsik Tamás Lehetőségek Deklaratív (a telepítési leírásban) a *.html PUT X Programozott (a kódban) –getRemoteUser, isCallerInRole, getUserPrincipal Szerep (role): felhasználók logikai csoportosítására

© Kozsik Tamás Authentikáció HTTP Basic –HTTP/1.0 szerinti, felhasználói név és jelszó –nem biztonságos (titkosítatlan adat, azonosítatlan szerver) –biztonságos transzport szinttel jobb (HTTPS) HTTP Digest –a jelszó kódolva megy –nem elterjedt Form based –mint HTTP Basic HTTPS Client (HTTP over SSL)