Introduktion til Java Servlets

1. Oversigt

I denne artikel vil vi se på et kerneaspekt af webudvikling i Java - Servlets.

2. Servlet og beholderen

Kort sagt, en Servlet er en klasse, der håndterer anmodninger, behandler dem og svarer tilbage med et svar.

For eksempel kan vi bruge en Servlet til at indsamle input fra en bruger gennem en HTML-formular, forespørge poster fra en database og oprette websider dynamisk.

Servlets er under kontrol af et andet Java-program kaldet a Servletbeholder. Når et program, der kører på en webserver, modtager en anmodning, Serveren afleverer anmodningen til Servlet Container - som igen sender den til målet Servlet.

3. Maven afhængigheder

For at tilføje Servlet-support i vores webapp, er javax.servlet-api afhængighed er påkrævet:

 javax.servlet javax.servlet-api 3.1.0 

Den seneste afhængighed af maven kan findes her.

Selvfølgelig bliver vi også nødt til at konfigurere en Servlet-container til at implementere vores app til; dette er et godt sted at starte med, hvordan man implementerer en WAR på Tomcat.

4. Servlet-livscyklus

Lad os gennemgå det sæt af metoder, der definerer en Servlets livscyklus.

4.1. i det()

Det i det metoden er designet til kun at kaldes en gang. Hvis der ikke findes en forekomst af servlet, skal webcontaineren:

  1. Indlæser servletklassen
  2. Opretter en forekomst af servletklassen
  3. Initialiserer det ved at ringe til i det metode

Det i det metoden skal gennemføres, før servlet kan modtage anmodninger. Servletbeholderen kan ikke sætte servlet i drift, hvis den i det metoden enten kaster en ServletUndtagelse eller vender ikke tilbage inden for en tidsperiode, der er defineret af webserveren.

offentlig ugyldigt init () kaster ServletException {// Initialiseringskode som opsat database osv ....}

4.2. service()

Denne metode kaldes kun efter servlets i det() metoden er gennemført.

Containeren kalder service() metode til at håndtere anmodninger, der kommer fra klienten, fortolker HTTP-anmodningstypen (, STOLPE, SÆTTE, SLETosv.) og opkald doGet, doPost, doPut, sletosv. metoder efter behov.

offentlig ugyldighedstjeneste (ServletRequest anmodning, ServletResponse svar) kaster ServletException, IOException {// ...}

4.3. ødelægge()

Opkaldt af Servlet Container til at tage Servlet ud af drift.

Denne metode kaldes kun en gang alle tråde inden i servlets service metode er afsluttet eller efter en timeout periode er gået. Når containeren kalder denne metode, kalder den ikke service metode igen på Servlet.

offentlig tomrum ødelægge () {//}

5. Eksempel på servlet

Lad os nu konfigurere et komplet eksempel håndtering af oplysninger ved hjælp af en formular.

For at starte, lad os definere en servlet med en kortlægning / CalcServlet som vil fange informationen POSTET af formularen og returnere resultatet ved hjælp af en RequestDispatcher:

@WebServlet (name = "FormServlet", urlPatterns = "/ CalcServlet") offentlig klasse FormServlet udvider HttpServlet {@Override beskyttet ugyldigt doPost (HttpServletRequest anmodning, HttpServletResponse svar) kaster ServletException, IOException {String højde = anmodning " ; Strengevægt = request.getParameter ("vægt"); prøv {dobbelt bmi = beregneBMI (Double.parseDouble (vægt), Double.parseDouble (højde)); request.setAttribute ("bmi", bmi); respons.setHeader ("Test", "Succes"); respons.setHeader ("BMI", String.valueOf (bmi)); RequestDispatcher dispatcher = request.getRequestDispatcher ("index.jsp"); dispatcher.forward (anmodning, svar); } fange (Undtagelse e) {respons.sendRedirect ("index.jsp"); }} privat dobbelt beregne BMI (dobbelt vægt, dobbelt højde) {returvægt / (højde * højde); }}

Som vist ovenfor er klasser kommenteret med @WebServlet skal udvide javax.servlet.http.HttpServlet klasse. Det er vigtigt at bemærke det @WebServlet kommentar er kun tilgængelig fra Java EE 6 og fremefter.

Det @WebServlet annotering behandles af containeren ved implementeringstidspunktet, og den tilsvarende servlet stilles til rådighed ved de angivne URL-mønstre. Det er værd at bemærke, at ved at bruge kommentaren til at definere URL-mønstre kan vi undgå at bruge XML-implementeringsbeskrivelse med navnet web.xml til vores Servlet-kortlægning.

Hvis vi ønsker at kortlægge Servlet uden kommentar, kan vi bruge det traditionelle web.xml i stedet:

  FormServlet com.root.FormServlet FormServlet / CalcServlet 

Lad os derefter oprette en grundlæggende HTML form:

Din vægt (kg):
Din højde (m):

$ {bmi}

Endelig - for at sikre, at alt fungerer som forventet, lad os også skrive en hurtig test:

offentlig klasse FormServletLiveTest {@Test offentlig ugyldig nårPostRequestUsingHttpClient_thenCorrect () kaster undtagelse {HttpClient-klient = ny DefaultHttpClient (); HttpPost-metode = ny HttpPost ("// localhost: 8080 / calcServlet"); Liste nvps = ny ArrayList (); nvps.add (ny BasicNameValuePair ("højde", String.valueOf (2))); nvps.add (ny BasicNameValuePair ("vægt", String.valueOf (80))); method.setEntity (ny UrlEncodedFormEntity (nvps)); HttpResponse httpResponse = client.execute (metode); assertEquals ("Succes", httpResponse .getHeaders ("Test") [0] .getValue ()); assertEquals ("20.0", httpResponse .getHeaders ("BMI") [0] .getValue ()); }}

6. Servlet, HttpServlet og JSP

Det er vigtigt at forstå det Servlet-teknologien er ikke begrænset til HTTP-protokollen.

I praksis er det næsten altid, men Servlet er en generisk grænseflade og HttpServlet er en udvidelse af denne grænseflade - tilføjelse af HTTP-specifik support - f.eks doGet og doPost, etc.

Endelig er Servlet-teknologien også hoveddriveren til en række andre webteknologier såsom JSP - JavaServer Pages, Spring MVC osv.

7. Konklusion

I denne hurtige artikel introducerede vi grundlaget for Servlets i en Java-webapplikation.

Eksempelprojektet kan downloades og køres som det er som et GitHub-projekt.