A servlet egy olyan Java objektum, amely HTTP kérést dolgoz fel és HTTP választ generál. Ezzel ugyanúgy a dinamikus tartalomgenerálás problémáját oldja meg, mint a PHP, a CGI és az ASP.NET. A generált tartalom jellemzően HTML, de lehet például XML is.

A JSP fájlokból is servlet kód generálódik

A servlet container a webszerver azon komponense, amely a servleteket kezeli. A container dolga a servletek életciklusainak a kezelése és az URL-ek hozzárendelése a servletekhez.

A javax.servlet és javax.servlet.http csomagokban specifikált Java Servlet API tartalmazza a servlet és a servlet container kommunikációjához szükséges osztályokat.

A servlet kódja megírható Java nyelven is, viszont generálható JavaServer Pages (JSP) oldalból is. A servlet illetve JSP forráskódot és a webalkalmazás többi részét jellemzően WAR fájlba csomagolják, ami nem más, mint egy ZIP fájl .war kiterjesztéssel. (A war itt nem a háborúra utal, hanem a web archive rövidítése.)

Verziótörténet

szerkesztés

A servlet specifikáció 1.0 verzióját a Sun Microsystems készítette el és adta ki 1997 júniusában. A 2.3 verziótól kezdve a specifikációt a Java Community Process keretében fejlesztik. A JSR 53 dokumentum definiálja a Servlet 2.3 és a JSP 1.2 specifikációkat. A JSR 154 dokumentum tartalmazza a Servlet 2.4 és 2.5 specifikációkat.

James Gosling már a Java programozási nyelv kezdeteikor gondolt a servletekre, de a koncepció nem érett termékké addig, amíg a Sun ki nem adta a Java Web Server-t.[1] A később megjelent Java EE specifikációnak is a részévé vált a Servlet API.

Verzió Kiadás dátuma Platform Fontosabb változások
Jakarta Servlet 6.0 6.0 2021. október 15. Jakarta EE 10 Elavult funkciók eltávolítása és szükséges fejlesztések megvalósítása
Jakarta Servlet 5.0 5.0 2020. október 9. Jakarta EE 9 API áthelyezve a javax.servlet csomagból a jakarta.servlet csomagba
Jakarta Servlet 4.0.3 2019. szeptember 10 Jakarta EE 8 Átnevezve a védett "Java" névről.
Java Servlet 4.0 2017. szeptember Java EE 8 HTTP/2
Java Servlet 3.1 2013. május JavaEE 7 Non-blocking I/O, HTTP protocol upgrade mechanizmus (WebSocket)[2]
Java Servlet 3.0 2009. december JavaEE 6, J2SE 6.0 asszinkron servlet, biztonság, fájl feltöltés
Java Servlet 2.5 2005. szeptember JavaEE 5, J2SE 5.0 Előfeltétele a J2SE 5.0, támogatja az annotációkat.
Java Servlet 2.4 2003. november J2EE 1.4, J2SE 1.3 A web.xml fájl XML sémát használ.
Java Servlet 2.3 2001. augusztus J2EE 1.3, J2SE 1.2 Megjelennek a Filter-ek.
Java Servlet 2.2 1999. augusztus J2EE 1.2, J2SE 1.2 A J2EE részévé válik a Servlet API. Bevezetik a független, .war fájlokban tárolt webalkalmazásokat.
Java Servlet 2.1 1998. november specifikálatlan Az első hivatalos specifikáció. Megjelennek a RequestDispatcher és a ServletContext objektumok.
Java Servlet 2.0 JDK 1.1 A Java Servlet Development Kit 2.0 részeként.
Java Servlet 1.0 1997. június  

A servlet életciklusa

szerkesztés

A servlet életciklusa az alábbi fázisokból áll:

  1. A container példányosítja (létrehozza) a servlet objektumot.
  2. A container meghívja a servlet példány init() metódusát. Ez a metódus inicializálja a servletet és mindenképp le kell futnia mielőtt a servlet HTTP kéréseket tudna fogadni. Az init() metódus csak egyszer fut le a servlet élete során.
  3. Az inicializációt követően a servlet képes a klienseket kiszolgálni. A container minden HTTP kérésre meghívja a servlet service() metódusát. Minden kérés külön szálban hajtódik végre.
  4. A servlet életének záróakkordja az, amikor a container meghívja a destroy() metódusát. Az init() metódushoz hasonlóan a destroy() is csak egyszer hajtódik végre a servlet életében.

ServletConfig és ServletContext

szerkesztés

ServletContext csak egy van minden alkalmazásban. Ezt az objektumot minden servlet használhatja alkalmazásszintű információk és konténeradatok lekérdezésére. ServletConfig példány viszont minden servlethez külön létezik. Ez az objektum az egyes servletek inicializációjához szükséges paramétereket tartalmazza. A ServletContextet a ServletConfigon keresztül és a ServletRequesten keresztül is lekérdezdezheti a szoftverfejlesztő.

Példa kód

szerkesztés

A következő példa servlet kiírja "Hello world" szöveget a HTML oldalra – valójában egy teljes HTML oldalt generál, amelyen elhelyezi a fenti szöveget, h1-es címként formázva.

Megjegyzendő, hogy a HttpServlet alosztálya a GenericServlet-nek, és implementálja a Servlet interface-t.

A service() metodódus továbbítja a kéréseket a következő metódusok felé: doGet(), doPost(), doPut(), doDelete().

import java.io.IOException;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloWorld extends HttpServlet {
  public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    PrintWriter out = response.getWriter();
    out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " +
                "Transitional//EN\">\n" +
                "<html>\n" +
                "<head><title>Hello World</title></head>\n" +
                "<body>\n" +
                "<h1>Hello, world!</h1>\n" +
                "</body></html>");
  }
}

Servlet containerek

szerkesztés

A servlet container egy olyan webszerver, ami támogatja a servletek futtatását. Képesnek kell lennie az alapvető webszerver funkcionalitásra, azaz tudnia kell HTTP kéréseket kezelni, továbbá kell bele egy java futtatókörnyezet (JRE), végül tudnia kell URL-eket servletmetódus hívásokká alakítani. A servletek telepítési módja a containerben sokféle lehet, a container implementációjától függ. Minden container esetében meg kell adni a telepítéskor azt az URL-t, ahol a servlet elérhető. Az egyéb paraméterek containerfüggőek.

A servlet containereket szokták illetni web container vagy web engine kifejezésekkel is.

Lásd még

szerkesztés

Külső hivatkozások

szerkesztés
  1. Servlet History. [2008. szeptember 5-i dátummal az eredetiből archiválva]. (Hozzáférés: 2008. június 12.)
  2. Archivált másolat. (Hozzáférés: 2015. december 10.)