Az előadás letöltése folymat van. Kérjük, várjon

Az előadás letöltése folymat van. Kérjük, várjon

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

Hasonló előadás


Az előadások a következő témára: "© Kozsik Tamás 2000-2006 Szervletek „Kis szerverprogram” Kliens-szerver architektúrát feltételezünk Szerveroldalon futó kisalkalmazás Mint ahogy az applet."— Előadás másolata:

1 © 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

2 © 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

3 © 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

4 © 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

5 © 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.)

6 © 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

7 © 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

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

9 © 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

10 © 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

11 © 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(); }

12 © 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"; }

13 © 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

14 © 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...

15 © 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...

16 © 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

17 © 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.

18 © Kozsik Tamás A HTML form Hi

Szöveg:

19 © 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.

20 © 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(); }

21 © 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.

22 © 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

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

24 © Kozsik Tamás web.xml szevasz Hello

25 © 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

26 © 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 *

27 © 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)

28 © 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

29 © 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:

30 © 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

31 © 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...

32 © 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 {...}

33 © 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)... }

34 © 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

35 © Kozsik Tamás

36 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()

37 © 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

38 © 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()

39 © 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

40 © 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)

41 © 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…

42 © 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( … ) … { … } … }

43 © 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."); }

44 © 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(); }

45 © 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 ); }

46 © 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

47 © 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(); }

48 © 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()); }

49 © 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(" Show the list "); out.close(); } public String getServletInfo() { return "ListManagerServlet 1.1 by Stefan Zeiger, modified by KTO"; }

50 © 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

51 © 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

52 © 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…

53 © 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

54 © Kozsik Tamás HTML form Online Shop

55 © 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); }

56 © 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. " }

57 © 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(" Back to the shop "); out.close(); }

58 © 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)

59 © 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 ( " " ); out.print ( "" ); out.print ( "" ); out.print ( "" ); out.print ( " " ); out.close(); }

60 © 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(" Back to the shop "); out.close(); }

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

62 © 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ó

63 © 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

64 © 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

65 © 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)

66 © 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

67 © 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

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

69 © 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

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

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

72 © 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

73 © 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

74 © 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)

75 © 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

76 © 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

77 © 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/*

78 © 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

79 © 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

80 © 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

81 © 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

82 © 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 { … }

83 © 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:

84 © 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

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

86 © 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

87 © 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

88 © 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á)

89 © 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

90 © 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)


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

Hasonló előadás


Google Hirdetések