1.1 interfész Servlet

Ma egy új és érdekes témával kezdünk, a szervletek . A Java szervletekkel való kiegészítése vezetett ahhoz, hogy a Java a nagy szerveralkalmazások de facto szabványa legyen. A világ összes vállalati szoftverének 80%-a Java nyelven készült. Kínában pedig minden 100%. Tehát mik azok a servletek?

A servlet pontosan az, ami egy Java programot webszolgáltatássá változtat, és lehetővé teszi az ügyfelektől érkező kérések feldolgozását. És ez így volt...

A 90-es években, közvetlenül a világháló megjelenése után megjelentek a webkliensek (böngészők) és a webszerverek. A webszerverek általában egyszerűen szétterjesztették az általuk tárolt fájlokat az interneten keresztül: html oldalakat, szkripteket, képeket stb.

Valamikor mindenki arra a következtetésre jutott, hogy mindkét oldalt okosabbá kell tenni. A HTML oldalakhoz JavaScriptet, a szerverekhez pedig bővítményeket adtak hozzá – speciális szkripteket, amelyeket bizonyos kérésekre válaszul hívtak meg , és rugalmasabbá és okosabbá tették a szerver viselkedését.

Tehát a servlet egy olyan Java beépülő modul , amelyet beépítettek Java web-server, és lehetővé tette, hogy bizonyos oldalakon Java kódot hajtson végre. És már ez a Java kód, amelyet a Servlet osztályból örökölt osztály képvisel, azt tette, amit a fejlesztők szándékoztak.

És mint már tudod, a legnépszerűbb Java webszerver a Tomcat . A nevet egyébként a Tom és Jerry című rajzfilmből származó Tom macska tiszteletére nevezték el.

Hogyan működik együtt a Tomcat a szervletekkel? Valójában ez a folyamat szabványosított, és a szervlet életciklusának hívják . Ebben a szervlet egy betölthető objektum, a webszerver pedig egy szervlet- tároló .

Ha a szervlet még nincs betöltve , akkor:

  1. A servlet osztályt a tároló tölti be.
  2. A tároló létrehozza a szervlet osztályának (objektumának) egy példányát.
  3. A tároló meghív egy metódust init()a szervlet objektumon. A módszert csak egyszer hívják meg.

Normál munkaciklus - ügyfél kérésének kiszolgálása :

  • Minden kérés feldolgozása külön szálban történik.
  • A tároló meghív egy metódust service()a szervleten, és átadja a ServletRequest és ServletResponse objektumokat.
  • A szervlet leállításához egy metódust hívunk meg destroy()a szervlet objektumon. Csak egyszer hívják.

Számos oka lehet annak, hogy egy szervlet leáll:

  • A programozó újraindítja a webszervert, minden szervletet kecsesen le kell állítani.
  • A programozó betölti a servlet új verzióját, a régit helyesen kell kirakni.
  • Stb.

Ne feledje a lényeget: a webszervernek és a hozzá tartozó szervleteknek hónapokig hiba nélkül kell működniük és újra kell indulniuk, percenként több ezer kérést kiszolgálva. Ezért a servlet betöltésének, működésének és eltávolításának kódját mindig nagyon jó minőségben kell megírni.

1.2 HttpServlet osztály

A Servlet osztály a szervlet és a tároló működésének szabványosítására szolgál. A programozók nem dolgoznak közvetlenül ezzel az osztállyal. Nos, ritkán dolgoznak. A leggyakrabban használt osztály HttpServleta Servletből származik.

Ennek az osztálynak számos módszere van, amelyek hasznosak lehetnek számunkra. Gyakran fogja használni őket:

Módszer Leírás
1 init() A szervlet betöltésekor egyszer hívják meg
2 destroy() Egyszer hívják, amikor a servlet ki van töltve
3 service(HttpRequest, HttpResponse) A servlet minden új kérésére hívott
4 doGet(HttpRequest, HttpResponse) A szervlet minden új GET kérésére hívják
5 doPost(HttpRequest, HttpResponse) A servlet minden új POST kérésére hívják
6 doHead(HttpRequest, HttpResponse) A szervlet minden új HEAD kérésére hívják
7 doDelete(HttpRequest, HttpResponse) A szervlet minden új DELETE kérésére hívják
8 doPut(HttpRequest, HttpResponse) A servlet minden új PUT kérésére hívják

init()A és metódusok destroy()a Servlet osztályból öröklődnek. Ezért, ha úgy dönt, hogy felülbírálja őket a szervletben, akkor az alaposztályból is meg kell hívnia a megvalósításukat. A parancs erre szolgál super.method name().

Szervlet példa:


public class FirstHttpServlet extends HttpServlet {
  
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        
        // Getting the parameter “secret” from request
        String secret = request.getParameter("secret");
 
        // Put parameter “secret” into Http-session
        HttpSession session = request.getSession(true);
        session.setAttribute("secret", secret);
 
        // Print HTML as response for browser
        response.setContentType("text/html;charset=UTF-8");
        PrintWriter out = response.getWriter();
        try {
            out.println("<html>");
            out.println("<head>");
            out.println("<title>Header</title>");
            out.println("</head>");
            out.println("<body>");
            out.println("<h1>Servlet example "+ secret +"</h1>");
            out.println("</body>");
            out.println("</html>");
        } finally {
            out.close();
        }
    }
}

1.3 szolgáltatás (HttpServletRequest, HttpServletResponse) metódus

Ha egy kliens kérésének feldolgozását egy servlet szemszögéből nézzük, akkor valami ilyesmiről van szó.

A tároló (webszerver) minden ügyfélkérelemhez létrehoz HttpServletRequestés objektumokat hoz létre HttpServletResponse, majd meghív egy metódust service(HttpServletRequest request, HttpServletResponse response)a megfelelő szervleten. Ezeket az objektumokat adjuk át neki, hogy a metódus a szükséges adatokat ki tudja venni belőle, requestés a munka eredményét be tudja tenni response.

A metódusnak service()van egy alapértelmezett megvalósítása. Ha nincs újradefiniálva, akkor végrehajtódik. Ezt csinálja.

A metódus service()meghatározza a HTTP metódus típusát a kérésből (GET, POST, ...), és meghívja a kérésnek megfelelő metódust.

Módszer Leírás
1 service(HttpRequest, HttpResponse) A servlet minden új kérésére hívott
2 doGet(HttpRequest, HttpResponse) A szervlet minden új GET kérésére hívják
3 doPost(HttpRequest, HttpResponse) A servlet minden új POST kérésére hívják
4 doHead(HttpRequest, HttpResponse) A szervlet minden új HEAD kérésére hívják
5 doDelete(HttpRequest, HttpResponse) A szervlet minden új DELETE kérésére hívják
6 doPut(HttpRequest, HttpResponse) A servlet minden új PUT kérésére hívják

Osztályában vagy újradefiniálhat egy metódust service(), vagy magára hagyhatja, majd szükség szerint újradefiniálhatja a doGet(), , ... metódusokat.doPost()