Introduction aux servlets Java

1. Vue d'ensemble

Dans cet article, nous examinerons un aspect essentiel du développement Web dans Java - Servlets.

2. Le servlet et le conteneur

En termes simples, un servlet est une classe qui gère les demandes, les traite et y répond avec une réponse.

Par exemple, nous pouvons utiliser un servlet pour collecter les entrées d'un utilisateur via un formulaire HTML, interroger les enregistrements d'une base de données et créer des pages Web de manière dynamique.

Les servlets sont sous le contrôle d'une autre application Java appelée conteneur de servlets. Lorsqu'une application exécutée sur un serveur Web reçoit une demande , le serveur transmet la demande au conteneur de servlet, qui à son tour la transmet au servlet cible.

3. Dépendances de Maven

Pour ajouter la prise en charge des servlets dans notre application Web, le fichier javax . La dépendance servlet-api est requise:

 javax.servlet javax.servlet-api 3.1.0 

La dernière dépendance maven peut être trouvée ici.

Bien sûr, nous devrons également configurer un conteneur Servlet sur lequel déployer notre application; c'est un bon point de départ pour savoir comment déployer un WAR sur Tomcat.

4. Cycle de vie du servlet

Passons en revue l'ensemble des méthodes qui définissent le cycle de vie d'un servlet.

4.1. init ()

La méthode init est conçue pour être appelée une seule fois. Si une instance du servlet n'existe pas, le conteneur Web:

  1. Charge la classe de servlet
  2. Crée une instance de la classe servlet
  3. L'initialise en appelant la méthode init

La méthode init doit aboutir pour que le servlet puisse recevoir des requêtes. Le conteneur de servlet ne peut pas mettre le servlet en service si la méthode init lève une exception ServletException ou ne revient pas dans un délai défini par le serveur Web.

public void init() throws ServletException { // Initialization code like set up database etc.... }

4.2. un service()

Cette méthode n'est appelée que lorsque la méthode init () du servlet s'est terminée avec succès .

Le conteneur appelle le service de () méthode pour les demandes de poignée provenant du client, interprète le type de requête HTTP ( GET , POST , PUT , SUPPRIMER , etc.) et appelle doGet , doPost , doPut , doDelete , etc. méthodes , selon le cas.

public void service(ServletRequest request, ServletResponse response) throws ServletException, IOException { // ... }

4.3. détruire()

Appelé par le conteneur de servlet pour mettre le servlet hors service.

Cette méthode n'est appelée qu'une fois que tous les threads de la méthode de service du servlet sont terminés ou après un délai d'expiration. Une fois que le conteneur a appelé cette méthode, il n'appellera plus la méthode de service sur le servlet.

public void destroy() { // }

5. Exemple de servlet

Configurons maintenant un exemple complet de gestion des informations à l'aide d'un formulaire.

Pour commencer, définissons un servlet avec un mapping / CalculateServlet qui capturera les informations POSTed par le formulaire et retournera le résultat à l'aide d'un RequestDispatcher:

@WebServlet(name = "FormServlet", urlPatterns = "/calculateServlet") public class FormServlet extends HttpServlet { @Override protected void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { String height = request.getParameter("height"); String weight = request.getParameter("weight"); try { double bmi = calculateBMI( Double.parseDouble(weight), Double.parseDouble(height)); request.setAttribute("bmi", bmi); response.setHeader("Test", "Success"); response.setHeader("BMI", String.valueOf(bmi)); RequestDispatcher dispatcher = request.getRequestDispatcher("index.jsp"); dispatcher.forward(request, response); } catch (Exception e) { response.sendRedirect("index.jsp"); } } private Double calculateBMI(Double weight, Double height) { return weight / (height * height); } }

Comme indiqué ci-dessus, les classes annotées avec @WebServlet doivent étendre la classe javax.servlet.http.HttpServlet . Il est important de noter que l' annotation @WebServlet n'est disponible qu'à partir de Java EE 6.

L' annotation @WebServlet est traitée par le conteneur au moment du déploiement et le servlet correspondant est rendu disponible aux modèles d'URL spécifiés. Il convient de noter qu'en utilisant l'annotation pour définir des modèles d'URL, nous pouvons éviter d'utiliser le descripteur de déploiement XML nommé web.xml pour notre mappage de servlet.

Si nous souhaitons mapper le servlet sans annotation, nous pouvons utiliser le traditionnel web.xml à la place:

  FormServlet com.root.FormServlet   FormServlet /calculateServlet  

Ensuite, créons un formulaire HTML de base :


    
Your Weight (kg) :
Your Height (m) :

${bmi}

Enfin - pour vous assurer que tout fonctionne comme prévu, écrivons également un test rapide:

public class FormServletLiveTest { @Test public void whenPostRequestUsingHttpClient_thenCorrect() throws Exception { HttpClient client = new DefaultHttpClient(); HttpPost method = new HttpPost( "//localhost:8080/calculateServlet"); List nvps = new ArrayList(); nvps.add(new BasicNameValuePair("height", String.valueOf(2))); nvps.add(new BasicNameValuePair("weight", String.valueOf(80))); method.setEntity(new UrlEncodedFormEntity(nvps)); HttpResponse httpResponse = client.execute(method); assertEquals("Success", httpResponse .getHeaders("Test")[0].getValue()); assertEquals("20.0", httpResponse .getHeaders("BMI")[0].getValue()); } }

6. Servlet, HttpServlet et JSP

Il est important de comprendre que la technologie Servlet ne se limite pas au protocole HTTP.

Dans la pratique , il est presque toujours, mais Servlet est une interface générique et HttpServlet est une extension de cette interface - l' ajout du support spécifique HTTP - tels que doGet et doPost , etc.

Enfin, la technologie Servlet est également le principal moteur d'un certain nombre d'autres technologies Web telles que JSP - JavaServer Pages, Spring MVC, etc.

7. Conclusion

Dans cet article rapide, nous avons présenté les bases des servlets dans une application Web Java.

L'exemple de projet peut être téléchargé et exécuté tel quel en tant que projet GitHub.