Introduction aux servlets Java

Introduction aux servlets Java

1. Vue d'ensemble

Dans cet article, nous allons examiner un aspect fondamental du développement Web en Java - Servlets.

2. Le servlet et le conteneur

En termes simples, un servlet est une classe qui traite les demandes, les traite et 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 des enregistrements dans 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éeServlet Container. Lorsqu'une application s'exécutant sur un serveur Web reçoit une demande,, le serveur transmet la demande au conteneur de servlets - qui à son tour la transmet à la cible Servlet.

3. Dépendances Maven

Pour ajouter la prise en charge des servlets dans notre application Web, la dépendancejavax.servlet-api est requise:


    javax.servlet
    javax.servlet-api
    3.1.0

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

Bien entendu, nous devrons également configurer un conteneur Servlet sur lequel déployer notre application; this is a good place to start on how to deploy a WAR on Tomcat.

4. Cycle de vie des servlets

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

4.1. init()

La méthodeinit 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. Initialise-le en appelant la méthodeinit

La méthodeinit doit aboutir avant que le servlet puisse recevoir des requêtes. Le conteneur de servlet ne peut pas mettre le servlet en service si la méthodeinit émet unServletException 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. service()

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

Le conteneur appelle la méthodeservice() pour traiter les requêtes provenant du client, interprète le type de requête HTTP (GET,POST,PUT,DELETE, etc. ) et appelledoGet,doPost,doPut,doDelete, etc. méthodes appropriées.

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

4.3. destroy()

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

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

public void destroy() {
    //
}

5. Exemple de servlet

Let’s now setup a full example de traitement des informations à l'aide d'un formulaire.

Pour commencer, définissons un servlet avec un mappage/calculateServlet qui capturera les informations POSTÉES par le formulaire et retournera le résultat en utilisant unRequestDispatcher:

@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 classejavax.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 est à 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 lesweb.xml traditionnels à la place:



    
       FormServlet
       com.root.FormServlet
    
    
        FormServlet
        /calculateServlet
    

Ensuite, créons un code HTML de baseform:

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(
          "http://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 quethe Servlet technology is not limited to the HTTP protocol.

En pratique, c'est presque toujours le cas, maisServlet est une interface générique et leHttpServlet est une extension de cette interface - ajoutant un support spécifique HTTP - commedoGet etdoPost, etc.

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

7. Conclusion

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

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