Bevezetés a Java Servlet-ekbe

1. Áttekintés

Ebben a cikkben áttekintjük a Java fejlesztésének alapvető szempontját - a Servleteket.

2. A Servlet és a Konténer

Egyszerűen fogalmazva: a Servlet egy olyan osztály, amely kezeli a kéréseket, feldolgozza azokat és válaszokkal válaszol vissza.

Például egy Servlet segítségével gyűjthetünk egy felhasználótól egy HTML formanyomtatványon keresztül, lekérdezhetünk rekordokat egy adatbázisból, és dinamikusan készíthetünk weboldalakat.

A szervleteket egy másik Java alkalmazás irányítja, az úgynevezett a Servlet konténer. Amikor egy webkiszolgálón futó alkalmazás kérést kap, a szerver átadja a kérést a Servlet-konténernek - amely viszont továbbítja a cél-Servlet-nek.

3. Maven-függőségek

A Servlet támogatás hozzáadásához webalkalmazásunkban a javax.servlet-api függőség szükséges:

 javax.servlet javax.servlet-api 3.1.0 

A legfrissebb maven-függőség itt található.

Természetesen konfigurálnunk kell egy Servlet-tárolót is, amelybe telepíthetjük az alkalmazásunkat; ez egy jó hely arra, hogy elindítsuk a WAR telepítését a Tomcat-on.

4. Servlet életciklusa

Menjünk át azon módszerek halmazán, amelyek meghatározzák a Servlet életciklusát.

4.1. benne()

A benne A módszert úgy tervezték, hogy csak egyszer hívja meg. Ha a kiszolgáló kisalkalmazás nem létezik, akkor a webtároló:

  1. Betölti a szervlet osztályt
  2. Létrehozza a szervlet osztály példányát
  3. Inicializálja a benne módszer

A benne A metódusnak sikeresen teljesülnie kell, mielőtt a szervlet bármilyen kérést fogadhatna. A szervletet tartalmazó tartály nem tudja üzembe helyezni a szervletet, ha a benne módszer vagy dob egy ServletException vagy nem tér vissza a webkiszolgáló által meghatározott időn belül.

public void init () dobja a ServletException {// Inicializáló kódot, mint például az adatbázis beállítása stb.}

4.2. szolgáltatás()

Ezt a módszert csak a szervlet után hívják meg benne() A módszer sikeresen befejeződött.

A Konténer felhívja a szolgáltatás() módszer az ügyféltől érkező kérések kezelésére, értelmezi a HTTP kérés típusát (KAP, POST, PUT, TÖRÖLstb.) és hívások doGet, doPost, doPut, doDeletestb. módszerek.

public void service (ServletRequest kérés, ServletResponse válasz) dobja a ServletException, IOException {// ...}

4.3. elpusztítani()

A Servlet-konténer hívta, hogy vegye ki a Servlet-t.

Ezt a módszert csak egyszer hívják meg a szervlet összes szála szolgáltatás metódus kilépett vagy egy időkorlát letelt. Miután a tároló meghívta ezt a módszert, nem fogja meghívni a szolgáltatás metódus ismét a Servleten.

public void megsemmisítés () {//}

5. Példa Servletre

Most állítsunk be egy teljes példát az információk űrlap segítségével történő kezelése.

Kezdésként definiáljunk egy servletet leképezéssel / calcServlet amely rögzíti az űrlap által feltöltött információkat, és az eredményt egy RequestDispatcher segítségével adja vissza:

A @WebServlet (name = "FormServlet", urlPatterns = "/ calcServlet") nyilvános osztály FormServlet kiterjeszti a HttpServlet {@Override védett void doPost (HttpServletRequest kérés, HttpServletResponse válasz) ServletException, IOException. String ; Karaktersorozat = request.getParameter ("súly"); próbáld meg a {double bmi = kiszámolniBMI (Double.parseDouble (súly), Double.parseDouble (magasság)); request.setAttribute ("bmi", bmi); response.setHeader ("Teszt", "Siker"); response.setHeader ("BMI", String.valueOf (bmi)); RequestDispatcher diszpécser = request.getRequestDispatcher ("index.jsp"); diszpécser.forward (kérés, válasz); } catch (e kivétel) {response.sendRedirect ("index.jsp"); }} privát Dupla számításBMI (Dupla súly, Dupla magasság) {visszatérő súly / (magasság * magasság); }}

Amint a fentiekből látható, az osztályok a következőkkel voltak kiegészítve @WebServlet ki kell terjesztenie a javax.servlet.http.HttpServlet osztály. Fontos megjegyezni, hogy @WebServlet az annotáció csak a Java EE 6-tól érhető el.

A @WebServlet a megjegyzést a tároló a telepítéskor feldolgozza, és a megfelelő szervlet elérhetővé válik a megadott URL-mintákon. Érdemes megjegyezni, hogy az annotáció használatával az URL-minták meghatározásához elkerülhetjük az XML telepítési leíró nevű web.xml Servlet térképezésünkhöz.

Ha a Servletet annotáció nélkül szeretnénk feltérképezni, használhatjuk a hagyományosat web.xml helyette:

  FormServlet com.root.FormServlet FormServlet / calcServlet 

Ezután hozzunk létre egy alap HTML-t forma:

Súlya (kg):
Magasságod (m):

$ {bmi}

Végül - hogy megbizonyosodjon arról, hogy minden a várt módon működik, írjunk egy gyors tesztet is:

public class FormServletLiveTest {@Test public void mikor HttpPost módszer = új HttpPost ("// localhost: 8080 / calcServlet"); List nvps = new ArrayList (); nvps.add (új BasicNameValuePair ("magasság", String.valueOf (2))); nvps.add (új BasicNameValuePair ("súly", String.valueOf (80))); method.setEntity (új UrlEncodedFormEntity (nvps)); HttpResponse httpResponse = client.execute (metódus); assertEquals ("siker", httpResponse .getHeaders ("teszt") [0] .getValue ()); assertEquals ("20.0", httpResponse .getHeaders ("BMI") [0] .getValue ()); }}

6. Servlet, HttpServlet és JSP

Fontos ezt megérteni a Servlet technológia nem korlátozódik a HTTP protokollra.

A gyakorlatban szinte mindig az, de Servlet egy általános interfész és a HttpServlet az interfész kiterjesztése - hozzáadva a HTTP-specifikus támogatást - például doGet és doPoststb.

Végül a Servlet technológia számos más webes technológia, például a JSP - JavaServer Pages, Spring MVC stb. - fő hajtóereje is.

7. Következtetés

Ebben a rövid cikkben bemutattuk a Servlet alapjait egy Java webalkalmazásban.

A példa projekt letölthető és futtatható, ahogy GitHub projektként van.