Ce matériel fait partie de la série « Introduction au développement d'entreprise ». Articles précédents : Partie 5. Servlets, API de servlet Java.  Ecrire une application web simple - 1Savez-vous déjà comment écrire des applications Java qui génèrent du texte sur la console, mais vous ne savez toujours pas vraiment comment créer votre première application Web ? Super, installez-vous confortablement. Dans cet article, nous allons nous familiariser avec les servlets et écrire une application que vous pourrez montrer à vos amis sans leur envoyer de jarnik ni les forcer à télécharger Java. Écrivons une application Web . Si vous n'êtes pas encore familier avec les approches utilisées en programmation Web, je vous conseille de commencer la lecture dès le premier article de la série « Introduction au développement d'entreprise ».

Qu'est-ce qu'une servlet

Tout d'abord, voyons ce qu'est une servlet et pourquoi vous en entendez parler si souvent. L'API Java Servlet est une API standardisée conçue pour être implémentée sur le serveur et fonctionner avec le client à l'aide d'un schéma demande-réponse. Une servlet est une classe qui peut recevoir des requêtes d'un client et lui renvoyer des réponses. Oui, les servlets en Java sont précisément les éléments avec lesquels l'architecture client-serveur est construite. Si vous vous en souvenez, nous en avons déjà parlé dans l'un des articles de la série. Ne tournons pas autour du pot : écrivons du code tout de suite.

Ce dont vous avez besoin pour créer une application Web

Pour travailler confortablement avec des servlets en Java, vous aurez besoin d'Intellij IDEA Ultimate Edition. Il est payant, mais vous pouvez activer une période d'essai de 30 jours ou utiliser la version à accès anticipé - c'est toujours gratuit. Installez également notre serveur d'applications - Apache Tomcat. Tomcat est un conteneur de servlets : c'est celui qui traite les requêtes entrantes de l'extérieur et les transmet à notre application. Vous pouvez télécharger Tomcat à partir de ce lien .

Création de la première application Web

Si tout est prêt, créons un projet Maven. Si vous n'êtes pas familier avec Maven, faites attention à l'article précédent . Commençons !
  1. Dans pom.xml, ajoutez la dépendance javax.servlet-api et définissez la guerre d'empaquetage :

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
            xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
     xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
       <modelVersion>4.0.0</modelVersion>
    
       <groupId>org.example</groupId>
       <artifactId>servlets</artifactId>
       <version>1.0-SNAPSHOT</version>
       <packaging>war</packaging>
    
       <dependencies>
           <dependency>
               <groupId>javax.servlet</groupId>
               <artifactId>javax.servlet-api</artifactId>
               <version>4.0.1</version>
           </dependency>
       </dependencies>
    </project>

    Classe de servlet simple :

    import javax.servlet.ServletException;
    import javax.servlet.annotation.WebServlet;
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.io.IOException;
    import java.io.PrintWriter;
    
    @WebServlet("/hello")
    public class MainServlet extends HttpServlet {
    
       @Override
       protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
           resp.setContentType("text/html");
           PrintWriter printWriter = resp.getWriter();
           printWriter.write("Hello!");
           printWriter.close();
       }
    }
  2. Pour exécuter l'application, vous devez créer une configuration Tomcat :

    Partie 5. Servlets, API de servlet Java.  Ecrire une application web simple - 2 Partie 5. Servlets, API de servlet Java.  Écrire une application web simple - 3

  3. Ensuite, nous indiquons quelle version de Tomcat nous utiliserons, l'URL par laquelle nous pouvons accéder au serveur et le port. Vous devriez obtenir quelque chose comme ceci :

    Partie 5. Servlets, API de servlet Java.  Écrire une application web simple - 4
  4. Il ne reste plus qu'à spécifier l'artefact (le projet assemblé dans une archive jar), qui sera déployé dans le conteneur. Vous pouvez cliquer sur le bouton Réparer et sélectionner guerre explosée : cela signifie qu'une fois le projet reconstruit, l'artefact sera automatiquement placé dans le conteneur de servlet. Partie 5. Servlets, API de servlet Java.  Écrire une application web simple - 5

  5. Le contexte de l'application est défini par défaut sur servlets_war_exploded , ce qui signifie que l'application doit être accessible à l'adresse : http://localhost:8080/servlets_war_exploded .

    Pourquoi avons-nous besoin de texte supplémentaire ? Supprimons les choses inutiles. Désormais, l'adresse de notre application est : http://localhost:8080 .

    Partie 5. Servlets, API de servlet Java.  Écrire une application web simple - 6

  6. Cliquez sur OK. On voit que nous avons désormais la possibilité de lancer l'application :

    Partie 5. Servlets, API de servlet Java.  Écrire une application web simple - 7

    Désormais, lorsque vous lancez l'application, le navigateur devrait s'ouvrir et afficher une erreur 404. C'est logique, car à l'adresse http://localhost:8080/ il devrait y avoir un servlet avec le mappage «/», et notre seul servlet a le mappage «/hello» .

  7. Nous le contactons sur http://localhost:8080/hello et obtenons la réponse attendue - la chaîne « Bonjour » !

Si tout fonctionne, regardons le code. Pour créer un servlet http à partir d'une classe normale , vous devez en hériter de la classe HttpServlet. Au-dessus de la classe, nous spécifions l'annotation @WebServlet(), dans laquelle nous lions (mappons) le servlet à un chemin spécifique (« /hello »). Cette annotation n'est apparue que dans l'API Java Servlet 3.0, il existe donc de nombreux exemples sur Internet où le mappage de servlet s'effectue via un fichier XML. Maintenant, ce n'est plus nécessaire. Pour traiter les requêtes GET , nous remplaçons la méthode doGet(). Faites attention aux arguments de la méthode - HttpServletRequest et HttpServletResponse. À partir de l'objet HttpServletRequest, nous pouvons prendre toutes les informations nécessaires sur la demande, dans HttpServletResponse, nous pouvons enregistrer notre réponse et définir les en-têtes nécessaires.

Travailler avec les paramètres et la session

Améliorons notre servlet pour qu'il puisse traiter les paramètres de la requête et travailler avec la session :
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;

@WebServlet("/hello")
public class MainServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
       HttpSession session = req.getSession();
       Integer visitCounter = (Integer) session.getAttribute("visitCounter");
       if (visitCounter == null) {
           visitCounter = 1;
       } else {
           visitCounter++;
       }
       session.setAttribute("visitCounter", visitCounter);
       String username = req.getParameter("username");
       resp.setContentType("text/html");
       PrintWriter printWriter = resp.getWriter();
       if (username == null) {
           printWriter.write("Hello, Anonymous" + "<br>");
       } else {
           printWriter.write("Hello, " + username + "<br>");
       }
       printWriter.write("Page was visited " + visitCounter + " times.");
       printWriter.close();
   }
}
Le servlet exécute actuellement la session, incrémentant le visitCounter à chaque fois que la page est visitée. Si l'attribut visitCounter n'a pas encore été créé (la première fois que vous visitez la page), la méthode getAttribute() renverra null, vous devez donc vérifier null. Il en va de même pour les paramètres de requête. Si l'utilisateur n'a pas transmis le paramètre username, sa valeur sera nulle. Dans ce cas, nous accueillerons l'utilisateur comme anonyme. Pour transmettre un paramètre dans une requête GET, des variables de chemin sont utilisées, c'est-à-dire que vous devez accéder au lien http://localhost:8080/hello?username=Pavel . Vous pouvez en savoir plus sur les requêtes http dans l'article précédent de la série. Notre application a désormais une logique minimale, mais l'erreur 404 dans le chemin racine est un peu ennuyeuse. Pour résoudre ce problème, créons un autre servlet et mappons-le à la page initiale @WebServlet("/"). Le travail de cette servlet est de rediriger les requêtes vers le chemin « /hello ». Il existe deux manières de procéder : en utilisant le transfert ou la redirection. Il vaut peut-être la peine de comprendre quelle est la différence entre eux. forward - délègue le traitement des requêtes à un autre servlet sur le serveur, le client n'est pas impliqué. Pour ce faire, vous devez ajouter le code suivant à la méthode doGet() de la nouvelle servlet :
getServletContext().getRequestDispatcher("/hello").forward(req, resp);
Dans ce code, nous accédons au contexte du servlet, en récupérons le gestionnaire de requêtes du servlet souhaité et lui demandons de traiter une requête spécifique avec les paramètres spécifiés (req, resp). redirect - renvoie au client l'adresse à laquelle il doit contacter pour traiter sa demande. La plupart des navigateurs accèdent automatiquement au lien transmis. Pour implémenter la redirection, vous devez ajouter ce code :
resp.sendRedirect(req.getContextPath() + "/hello");
Dans HttpServletResponse, nous appelons la méthode redirect() et lui transmettons l'adresse que le client doit contacter. Un détail important : les paramètres http doivent également être ajoutés à la fin du chemin de redirection complet, ce qui n'est pas très pratique. Dans notre situation, il est préférable d'utiliser forward, mais il arrive qu'il soit préférable d'utiliser redirect. Si vous comprenez la différence dans leur travail, vous ne vous tromperez pas dans votre choix. Le code du nouveau servlet ressemble à ceci :
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;

@WebServlet("/")
public class IndexServlet extends HttpServlet {

   @Override
   protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
//        getServletContext().getRequestDispatcher("/hello").forward(req, resp);
       resp.sendRedirect(req.getContextPath() + "/hello");
   }
}

Conclusion

Votre première application Web est prête. Dans le prochain article, vous apprendrez comment le déployer sans utiliser Intellij IDEA. Nous avons écrit une application qui traite uniquement les requêtes GET. Les méthodes http restantes sont traitées de la même manière – en remplaçant les méthodes correspondantes de la classe parent. À l’aide de servlets aussi simples, vous pouvez créer des applications Web complexes et riches. Bien sûr, en utilisant de grands frameworks comme Spring, cela est beaucoup plus facile à faire. Mais si vous souhaitez vraiment approfondir toutes les capacités des servlets, vous pouvez lire la spécification officielle . Partie 6. Conteneurs de servlets Partie 7. Introduction au modèle MVC (Model-View-Controller) Partie 8. Écriture d'une petite application avec Spring-boot