A Java servlet technológia Fabók Zsolt Ficsor Lajos Általános Informatikai Tanszék Miskolci Egyetem Utolsó módosítás: 2008. 03. 06. Servlet Bevezető Igény a dinamikus WEB tartalmakra Előzmény: CGI Sokáig használt technológia Sok előny és széleskörű felhasználás ellenére sok hátrány Nem platform független Nincs egységes programozási nyelve (perl, python...) Servlet SERVLET / 2 Servlet alapgondolatok Szerver oldali funkciókat lát el, egy Webszerver funkcionalitásait bővíti ki Hordozható Egységes programozási nyelv (Java) Felhasználó központú tartalom (user-oriented) Objektum orientált programozás eszközeit használja Request response modellt használ, tehát kérések kiszolgálására szolgál Servlet SERVLET / 3
Servlet alapgondolatok Tetszőleges kérések kiszolgálására alkalmas, de leggyakrabban a technológia mint HTTP servlet kerül felhasználásra (HTTP kérések kiszolgálása) A továbbiakban a servlet kifejezés a HTTP servlet-et jelenti. Servlet SERVLET / 4 Mi a servlet? Speciális Java program nincs main, tehát önállóan nem használható nincs felhasználói felülete speciális futtató környezetet igényel (container) A container felelős a servlet példányosításáért és megszüntetéséért A servlet egy példányban létezik, de képes egyszerre több kérést kiszolgálni Servlet SERVLET / 5 Servlet container Kliens A Web server és a servlet container közötti API definiált (a container fejlesztőjének van szüksége rá) A container és a servlet közötti API definiált (a servlet fejlesztőjének van szüksége rá) A kliens szabványos HTTP kérést küld, és nem tud arról, hogy közvetlenül a szerver vagy egy servlet szolgálta ki. Servlet SERVLET / 6
Servlet osztályok lyok,, interface-ek ek Az interface -eket és osztályokat tartalmazó két csomag: javax.servlet javax.servlet.http Minden servlet osztálynak implementálnia kell a servlet interface -t (életciklust adja meg) HTTP szolgáltatások kiszolgálására a HTTPServlet interface -t kell implementálni (hasznos metódusok: doget(), dopost()) Servlet SERVLET / 7 Servlet osztályok lyok,, interface-ek ek A HTTP protokoll ismerete nem hátrányos a HTTP servletek megértéséhez. A servletekben az alap osztályok, saját osztályok stb. felhasználhatók. Servlet SERVLET / 8 Servlet életciklusa Ha a servlet példány még nem létezik a WEB container betölti a servlet osztályt példányosítja inicializálja a servletet annak az init() metódusával. Ha létezik akkor a service() metódust hívja meg (kérés válasz feldolgozás) Servlet SERVLET / 9
Servlet életciklusa Ha a containernek meg kell szüntetnie, vagy megszünteti a servletet, akkor annak a destroy() metódusát hívja meg. A fenti metódusok természetesen felüldefiniálhatók. Servlet SERVLET / 10 Servlet inicializáci ciója A WEB container a servlet osztály betöltése és a servlet példányosítása után meghívja a servlet init() metódusát A containertől függ, hogy hány példányt hoz létre a példányosítás a szerver indulása és az első, servletnek szóló kérés megérkezése között mikor történik Az viszont biztos, hogy az első kérés kiszolgálása előtt végrehajtódik az init() Servlet SERVLET / 11 Servlet inicializáci ciója A container az osztály betöltése után nem veszi észre, ha azt megváltoztattuk! (Fejlesztés...) Az init() felüldefiniálható Legtöbbször szükséges is a felüldefiniálás. Általában a servlet működéséhez szükséges erőforrások meglétének ellenőrzésére használatos Egy megkötés: Bármilyen hiba is lép fel az init() során, a UnavailableException kivétel kiváltásával kell a hibát jelezni Servlet SERVLET / 12
Kliens kérés k s kiszolgálása sa Ha a webszerver úgy találja, hogy egy hozzá befutó kérés egy servlet-re tartozik, meghívja annak service(servletrequest, ServletResponse) metódusát Az első paraméter a kliens kérésének részleteit tartalmazza Tartalmának feldolgozására a ServletRequest interface megfelelő metódusai szolgálnak. Servlet SERVLET / 13 Kliens kérés k s kiszolgálása sa A HTTP servlet a service metódust maga implementálja, és a megfelelő kéréseket "domethod" nevű szolgáltató metódusokhoz irányítja. A servlet fejlesztőjének a fenti metódusokat definiálva kell előállítania a választ. A második paraméterben kapja meg a kliens a választ (ez általában egy generált HTML oldal, amit a kliens meg tud jeleníteni). Servlet SERVLET / 14 Szolgáltat ltató metódusok domethod, ahol a Method lehet például: Get, Delete, Options, Put, Trace (többit lásd a Servlet interface leírásában) Válaszgenerálás menete (sorrend fontos): Stream foglalása a válasznak Header kitöltése Body kitöltés Elküldés Header kitöltését nem előzheti meg a Body kitöltése Servlet SERVLET / 15
Kérésfeldolgozás Minden kérés (request) implementálja a ServletRequest interface -t Ez az interface számtalan metódust tartalmaz, a tárolt információk kinyerésére Ez az információ lehet: Paraméter (lásd HTTP) Attribútum (információ a servlet és a container között) Információ a használt protokollokról localization information (karakterkódolás, nyelv stb.) Servlet SERVLET / 16 Kérésfeldolgozás s Kérés esetén a container kitölti a request objektumot, melyből a program(unk) információkat nyerhet ki. Servlet SERVLET / 17 Válaszgenerálás Válaszok (response) implementálják a ServletResponse interface -t Válasz objektum beállítása (content -et be kell állítani). Például: response.setcontenttype("text/html"); Szöveg küldésére egy PrintWriter objektum használható PrintWriter out = response.getwriter(); Servlet SERVLET / 18
Válaszgenerálás s Válasz megírása: out.println("<table>"); Adat (nem szöveg) küldésére a ServletOutputStream objektum biztosít lehetőséget (adat és text egyszerre nem küldhető, ha vegyesen akarjuk használni, akkor a text -et is adatként kell kezelni!) Servlet SERVLET / 19 doget / dopost public void doget (HttpServletRequest request, HttpServletResponse response) public void dopost (HttpServletRequest request, HttpServletResponse response) Az előbbi GET típusú HTTP kérésnél, az utóbbi POST típusú kérésnél hívódik meg. kérés / válasz objektumokat paraméterben kapja Servlet SERVLET / 20 HelloWorld példa /* * HTTPHello.java * * Created on June 21, 2002, 9:59 AM import javax.servlet.*; import javax.servlet.http.*; Servlet SERVLET / 21
HelloWorld példa public class HTTPHello extends HttpServlet { /** Initializes the servlet. public void init(servletconfig config) throws ServletException { super.init(config); /** Destroys the servlet. public void destroy() { Servlet SERVLET / 22 HelloWorld példa /** Processes requests for both HTTP <code>get</code> * and <code>post</code> methods. * @param request servlet request * @param response servlet response protected void processrequest(httpservletrequest request, HttpServletResponse response) throws ServletException, java.io.ioexception { response.setcontenttype("text/html"); java.io.printwriter out = response.getwriter(); out.println("<html>"); out.println("<head>"); out.println("<title>httphello</title>"); out.println("</head>"); out.println("<body>"); Servlet SERVLET / 23 HelloWorld példa //Make the font large out.println("<h1>"); //Make the font bold out.println("<b>"); out.println("hello from the HTTPHello Servlet"); out.println("</h1>"); out.println("</b>"); out.println("</body>"); out.println("</html>"); out.close(); Servlet SERVLET / 24
HelloWorld példa /** Handles the HTTP <code>get</code> method. * @param request servlet request * @param response servlet response protected void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, java.io.ioexception { processrequest(request, response); Servlet SERVLET / 25 HelloWorld példa /** Handles the HTTP <code>post</code> method. * @param request servlet request * @param response servlet response protected void dopost(httpservletrequest request, HttpServletResponse response) throws ServletException, java.io.ioexception { processrequest(request, response); Servlet SERVLET / 26 HelloWorld példa /** Returns a short description of the servlet. public String getservletinfo() { return "This is the HTTPHello Servlet"; Servlet SERVLET / 27
Servlet SERVLET / 28