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:
- A servlet osztályt a tároló tölti be.
- A tároló létrehozza a szervlet osztályának (objektumának) egy példányát.
- 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 HttpServlet
a 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()