Inleiding tot Java-servlets

1. Overzicht

In dit artikel zullen we een kernaspect van webontwikkeling in Java bekijken: Servlets.

2. De servlet en de container

Simpel gezegd, een Servlet is een klasse die verzoeken afhandelt, verwerkt en beantwoordt met een antwoord.

We kunnen bijvoorbeeld een servlet gebruiken om invoer van een gebruiker te verzamelen via een HTML-formulier, records uit een database op te vragen en webpagina's dynamisch te maken.

Servlets worden beheerd door een andere Java-applicatie, een Servlet-container. Wanneer een applicatie die op een webserver draait, een verzoek ontvangt, de server geeft het verzoek door aan de servlet-container, die het op zijn beurt doorgeeft aan de doel-servlet.

3. Afhankelijkheden van Maven

Om Servlet-ondersteuning toe te voegen aan onze web-app, de Javax.servlet-api afhankelijkheid is vereist:

 javax.servlet javax.servlet-api 3.1.0 

De laatste maven-afhankelijkheid is hier te vinden.

Natuurlijk moeten we ook een Servlet-container configureren om onze app op te implementeren; dit is een goede plek om te beginnen met het implementeren van een WAR op Tomcat.

4. Servlet levenscyclus

Laten we de reeks methoden doornemen die de levenscyclus van een servlet bepalen.

4.1. in het()

De in het methode is ontworpen om slechts één keer te worden aangeroepen. Als een instantie van de servlet niet bestaat, doet de webcontainer het volgende:

  1. Laadt de servlet-klasse
  2. Maakt een instantie van de servlet-klasse
  3. Initialiseert het door de in het methode

De in het methode moet succesvol zijn voltooid voordat de servlet verzoeken kan ontvangen. De servlet-container kan de servlet niet in gebruik nemen als het in het methode gooit ofwel een ServletException of keert niet terug binnen een door de webserver gedefinieerde tijdsperiode.

public void init () gooit ServletException {// Initialisatiecode zoals het opzetten van een database enz ....}

4.2. onderhoud()

Deze methode wordt alleen genoemd naar de servlet's in het() methode is met succes voltooid.

De container roept het onderhoud() methode om verzoeken van de client af te handelen, interpreteert het HTTP-verzoektype (KRIJGEN, POST, LEGGEN, VERWIJDEREN, etc.) en oproepen doGet, doPost, doPut, doDelete, enz. methoden waar van toepassing.

openbare void-service (ServletRequest-verzoek, ServletResponse-reactie) gooit ServletException, IOException {// ...}

4.3. vernietigen()

Opgeroepen door de Servlet Container om de Servlet buiten gebruik te stellen.

Deze methode wordt alleen aangeroepen als alle threads binnen de servlet onderhoud methode is afgesloten of nadat een time-outperiode is verstreken. Nadat de container deze methode heeft aangeroepen, wordt de onderhoud methode opnieuw op de Servlet.

public void destroy () {//}

5. Voorbeeld Servlet

Laten we nu een volledig voorbeeld opzetten van het omgaan met informatie met behulp van een formulier.

Laten we om te beginnen een servlet definiëren met een afbeelding / berekenServlet die de informatie die door het formulier wordt geplaatst, vastlegt en het resultaat retourneert met behulp van een RequestDispatcher:

@WebServlet (name = "FormServlet", urlPatterns = "/ berekenServlet") openbare klasse FormServlet breidt HttpServlet uit {@Override beschermde ongeldige doPost (HttpServletRequest-verzoek, HttpServletResponse-antwoord) gooit ServletException, IOException {"String-hoogte) = request (" {"String height) = request (" {" ; Tekenreeksgewicht = request.getParameter ("gewicht"); probeer {dubbele bmi = berekenBMI (Double.parseDouble (gewicht), Double.parseDouble (hoogte)); request.setAttribute ("bmi", bmi); response.setHeader ("Test", "Succes"); response.setHeader ("BMI", String.valueOf (bmi)); RequestDispatcher dispatcher = request.getRequestDispatcher ("index.jsp"); dispatcher.forward (verzoek, antwoord); } catch (uitzondering e) {response.sendRedirect ("index.jsp"); }} privé Dubbel berekenBMI (Dubbel gewicht, Dubbele hoogte) {retourgewicht / (hoogte * hoogte); }}

Zoals hierboven getoond, zijn klassen geannoteerd met @WebServlet moet de extensie javax.servlet.http.HttpServlet klasse. Het is belangrijk om in acht te nemen dat @WebServlet annotatie is alleen beschikbaar vanaf Java EE 6 en hoger.

De @WebServlet annotatie wordt verwerkt door de container op het moment van implementatie en de bijbehorende servlet wordt beschikbaar gesteld op de opgegeven URL-patronen. Het is vermeldenswaard dat we, door de annotatie te gebruiken om URL-patronen te definiëren, het gebruik van de XML-implementatiedescriptor met de naam web.xml voor onze Servlet-mapping.

Als we de Servlet zonder annotatie in kaart willen brengen, kunnen we de traditionele web.xml in plaats daarvan:

  FormServlet com.root.FormServlet FormServlet / berekenServlet 

Laten we vervolgens een eenvoudige HTML maken het formulier:

Uw gewicht (kg):
Uw lengte (m):

$ {bmi}

Tot slot - om er zeker van te zijn dat alles werkt zoals verwacht, laten we ook een korte test schrijven:

openbare klasse FormServletLiveTest {@Test openbare leegte whenPostRequestUsingHttpClient_thenCorrect () gooit Uitzondering {HttpClient-client = nieuwe DefaultHttpClient (); HttpPost-methode = nieuwe HttpPost ("// localhost: 8080 / berekenServlet"); Lijst nvps = nieuwe ArrayList (); nvps.add (nieuwe BasicNameValuePair ("hoogte", String.valueOf (2))); nvps.add (nieuwe BasicNameValuePair ("gewicht", String.valueOf (80))); method.setEntity (nieuwe UrlEncodedFormEntity (nvps)); HttpResponse httpResponse = client.execute (methode); assertEquals ("Succes", httpResponse .getHeaders ("Test") [0] .getValue ()); assertEquals ("20.0", httpResponse .getHeaders ("BMI") [0] .getValue ()); }}

6. Servlet, HttpServlet en JSP

Het is belangrijk dat te begrijpen de Servlet-technologie is niet beperkt tot het HTTP-protocol.

In de praktijk is het bijna altijd, maar Servlet is een generieke interface en de HttpServlet is een uitbreiding van die interface - het toevoegen van HTTP-specifieke ondersteuning - zoals doGet en doPost, enz.

Ten slotte is de Servlet-technologie ook de belangrijkste driver voor een aantal andere webtechnologieën zoals JSP - JavaServer Pages, Spring MVC, enz.

7. Conclusie

In dit korte artikel hebben we de basis gelegd voor Servlets in een Java-webapplicatie.

Het voorbeeldproject kan worden gedownload en uitgevoerd zoals het is als een GitHub-project.