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 2000-2006 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 2000-2006 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 2000-2006 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 2000-2006 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 2000-2006 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 2000-2006 Java Servlet Development Kit JSDK 2.1 - 1999 április http://java.sun.com/products/servlet/ 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 2000-2006 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: http://localhost:8080/ 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 2000-2006 Tomcat Apache Jakarta project http://jakarta.apache.org/ Önálló és beágyazható webszerver Catalina (szervlet konténer) Jasper (JSP motor)

9 © Kozsik Tamás 2000-2006 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 2000-2006 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 2000-2006 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 2000-2006 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 2000-2006 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 2000-2006 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: http://localhost:8080/servlet/Hello Próbáljuk elérni a más számítógépeken futó web-szervereket is...

15 © Kozsik Tamás 2000-2006 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: http://localhost:8080/haliho/servlet/Hello Próbáljuk elérni a más számítógépeken futó web- szervereket is...

16 © Kozsik Tamás 2000-2006 É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 2000-2006 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 2000-2006 A HTML form Hi <form action = "http://localhost:8080/servlet/Fordit" method = post> Szöveg:

19 © Kozsik Tamás 2000-2006 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: http://localhost:8080/servlet/Fordit 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 2000-2006 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 2000-2006 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 2000-2006 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 2000-2006 Példa webalkalmazásra webapps haliho fordit.html WEB-INF web.xml classes Fordit.class lib

24 © Kozsik Tamás 2000-2006 web.xml <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/j2ee/dtd/web-app_2_3.dtd"> szevasz Hello http://localhost:8080/haliho/servlet/szevasz

25 © Kozsik Tamás 2000-2006 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 2000-2006 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 2000-2006 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 2000-2006 Tomcat manager Egy előre telepített webalkalmazás A futó szerver alatt tudjuk az alkalmazásokat kezelni –listázás http://localhost:8080/manager/list –telepítés / eltávolítás http://localhost:8080/manager/install?path=/ haliho&war=file:/home/kto/haliho http://localhost:8080/manager/install?path=/ haliho&war=jar:file:/home/kto/haliho.war!/ –aktiválás / deaktiválás –frissítés

29 © Kozsik Tamás 2000-2006 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 2000-2006 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 2000-2006 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 2000-2006 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 2000-2006 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 2000-2006 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 2000-2006

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 2000-2006 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 2000-2006 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 2000-2006 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 2000-2006 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 2000-2006 Feladat Levelezési listára fel- és leiratkozás –perzisztens adatok (fájlban) –inicializációs paraméterek –HTTP-fejlécmezők http://www.novocode.com/doc/servlet-essentials/ Stefan Zeiger egy picit megpiszkáltam…

42 © Kozsik Tamás 2000-2006 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 2000-2006 private Set addresses; private static class SubscriptionException extends Exception { SubscriptionException( String details ){ super(details); }; } private synchronized void subscribe (String email) throws IOException, SubscriptionException { if ( addresses.add (email) ) save(); else throw new SubscriptionException(email + " was already subscribed."); } private synchronized void unsubscribe (String email) throws IOException, SubscriptionException { if( addresses.remove(email) ) save(); else throw new SubscriptionException(email + " was not subscribed."); }

44 © Kozsik Tamás 2000-2006 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 2000-2006 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 2000-2006 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 2000-2006 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 email address: "); out.print(" "); out.close(); }

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

49 © Kozsik Tamás 2000-2006 private void printHTML( HttpServletRequest req, HttpServletResponse res, String email, String mes) throws IOException { res.setContentType("text/html"); res.setHeader("pragma", "no-cache"); PrintWriter out = res.getWriter(); out.print(" List Manager "); out.print(email); 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"; }

50 © Kozsik Tamás 2000-2006 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 2000-2006 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 2000-2006 Feladat Bevásárlókocsi –Beteszek FOO-t vagy BAR-t –Lekérdezem a tartalmat –„Fizetek” http://www.novocode.com/doc/servlet-essentials/ Stefan Zeiger egy picit megpiszkáltam…

53 © Kozsik Tamás 2000-2006 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 2000-2006 HTML form Online Shop <FORM METHOD=POST ACTION="http://...."> <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">

55 © Kozsik Tamás 2000-2006 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 2000-2006 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 2000-2006 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(); }

58 © Kozsik Tamás 2000-2006 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 2000-2006 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(); }

60 © Kozsik Tamás 2000-2006 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(); }

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

62 © Kozsik Tamás 2000-2006 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: http://www.aitia.ai/könyvesbolt 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 2000-2006 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 2000-2006 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 2000-2006 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 2000-2006 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 2000-2006 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 2000-2006 Request Paraméterek Attribútumok HTTP fejlécek Cookie-k (getCookies) Locale-ok (getLocal, getLocales) …

69 © Kozsik Tamás 2000-2006 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 2000-2006 Request attribútumok Konténer -> szervlet, szervlet -> szervlet String kulcshoz Object érték getAttribute, setAttribute, getAttributeNames

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

72 © Kozsik Tamás 2000-2006 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 2000-2006 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 2000-2006 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 2000-2006 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 2000-2006 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 2000-2006 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 2000-2006 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 400 400.html

79 © Kozsik Tamás 2000-2006 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 2000-2006 Ü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 2000-2006 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 2000-2006 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 2000-2006 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 2000-2006 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 2000-2006 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 2000-2006 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 2000-2006 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 2000-2006 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 2000-2006 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 2000-2006 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