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ő 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 (folyt.) 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? 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á osztályok, lyok, interfaceinterface-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á osztályok, lyok, interfaceinterface-ek (folyt.) 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 (folyt.) 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 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 inicializáció ciója (folyt.) 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é kérés kiszolgá kiszolgálá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é kérés kiszolgá kiszolgálása (folyt.) 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á Szolgáltató ltató metó 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á 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á sfeldolgozás (folyt.) 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á 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
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 / 19
Servlet
doGet / doPost public void doGet (HttpServletRequest HttpServletResponse public void doPost (HttpServletRequest HttpServletResponse
request, response) request, 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 (folyt.) 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 (folyt.) /** Processes requests for both HTTP GET * and POST 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(""); out.println(""); out.println("HTTPHello"); out.println(""); SERVLET / 23 Servlet out.println("");
HelloWorld példa (folyt.) //Make the font large out.println("
"); //Make the font bold out.println(""); out.println("Hello from the HTTPHello Servlet"); out.println("
HelloWorld példa (folyt.) /** Returns a short description of the servlet. */ public String getServletInfo() { return "This is the HTTPHello Servlet"; } }