CodeGym /Blog Java /Random-FR /Partie 5. Servlets et l'API Java Servlet. Ecrire une appl...
John Squirrels
Niveau 41
San Francisco

Partie 5. Servlets et l'API Java Servlet. Ecrire une application web simple

Publié dans le groupe Random-FR
Ce matériel fait partie de la série "Introduction au développement d'entreprise". Articles précédents : Partie 5. Servlets et l'API Java Servlet.  Ecrire une application web simple - 1Vous savez déjà écrire des applications Java qui affichent du texte sur la console, mais vous ne savez toujours pas vraiment comment créer votre première application web ? Super, mets-toi à l'aise. Dans cet article, nous allons nous familiariser avec les servlets et écrire une application dont vous pourrez vous vanter auprès de vos amis sans leur envoyer de fichier JAR et sans les forcer à télécharger Java. Écrivons une application Web simple . Si vous n'êtes pas déjà familiarisé avec les approches utilisées en développement web, je vous recommande de commencer par lire le premier article de la série « Introduction au développement d'entreprise ».

Qu'est-ce qu'un servlet ?

Voyons d'abord ce que sont les servlets et pourquoi vous en entendez parler si souvent. L' API Java Servlet est une API standardisée destinée à être implémentée sur le serveur. Il interagit avec les clients selon un schéma requête-réponse. Une servlet est une classe qui peut recevoir des requêtes d'un client et renvoyer des réponses au client. En fait, les servlets sont exactement les blocs de construction que nous utilisons pour créer une architecture client-serveur en Java. Vous vous souvenez peut-être que nous avons déjà parlé de cette architecture dans un autre des articles de la série. Nous n'allons pas tourner autour du pot : écrivons tout de suite du code.

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

Pour plus de commodité lorsque vous travaillez avec des servlets Java, vous avez besoin d'IntelliJ IDEA Ultimate Edition. C'est un produit payant, mais vous pouvez activer un essai de 30 jours ou utiliser la version à accès anticipé, qui est toujours gratuite. Installez également Apache Tomcat, le serveur de notre application. Tomcat est un conteneur de servlets : il traite les requêtes entrantes et les transmet à notre application. Téléchargez Tomcat ici .

Créons notre première application web

Si tout est prêt, créez un projet Maven. Si vous n'êtes pas familier avec Maven, jetez un œil à l' article précédent . Commençons!
  1. Dans pom.xml, ajoutez une dépendance javax.servlet-api et spécifiez le package WAR :

    
    <?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 et l'API Java Servlet.  Ecrire une application web simple - 2Partie 5. Servlets et l'API Java Servlet.  Ecrire une application web simple - 3

  3. Ensuite, nous indiquons quelle version de Tomcat nous utiliserons, ainsi que l'URL et le port pour communiquer avec le serveur. Vous devriez avoir quelque chose comme ça :

    Partie 5. Servlets et l'API Java Servlet.  Ecrire une application web simple - 4
  4. Il ne nous 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 Fix et sélectionner war éclaté : cela signifie qu'après la reconstruction du projet, l'artefact sera automatiquement placé dans le conteneur de servlet. Partie 5. Servlets et l'API Java Servlet.  Ecrire une application web simple - 5

  5. La valeur par défaut du contexte d'application est servlets_war_exploded . Cela signifie que nous accédons à l'application à : http://localhost:8080/servlets_war_exploded .

    Pourquoi voudrions-nous un texte supplémentaire ? Supprimons ce qui est inutile. Maintenant, l'adresse de notre application Web est : http://localhost:8080 .

    Partie 5. Servlets et l'API Java Servlet.  Ecrire une application web simple - 6
  6. Cliquez sur OK. On voit qu'on peut maintenant lancer l'application :

    Partie 5. Servlets et l'API Java Servlet.  Ecrire une application web simple - 7

    Maintenant, lorsque vous ouvrez l'application dans votre navigateur, vous devriez obtenir une erreur 404. Cela a du sens, car l'adresse http://localhost:8080/ a besoin d'un servlet qui correspond à "/", mais notre seul servlet correspond à "/hello" .

  7. Nous pouvons y accéder à http://localhost:8080/hello . Une fois que nous avons fait cela, nous obtenons la réponse attendue — la chaîne "Bonjour" !

Si tout fonctionne, analysons le code. Pour créer une servlet HTTP à partir d'une classe ordinaire , elle doit hériter de la classe HttpServlet. Au-dessus de la déclaration de classe, nous indiquons l' @WebServlet()annotation. C'est là que nous lions (ou mappons) la servlet à un chemin spécifique ("/hello"). Cette annotation n'est apparue que dans Java Servlet API 3.0, donc Internet a beaucoup d'exemples où le mappage de servlet se produit via un fichier XML. Ce n'est plus necessaire. Pour gérer les requêtes GET , nous redéfinissons la doGet()méthode. Faites attention aux paramètres de la méthode : HttpServletRequestet HttpServletResponse. L' HttpServletRequestobjet nous fournit toutes les informations nécessaires sur la demande. Dans le HttpServletResponse, nous écrivons notre réponse et définissons les en-têtes nécessaires.

Travailler avec des paramètres et une session

Améliorons notre servlet afin qu'elle puisse traiter les paramètres de requête et travailler avec une 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();
   }
}
Maintenant, le servlet fonctionne avec une session, augmentant la valeur de visitCounterchaque fois que la page est visitée. Si l' visitCounterattribut n'a pas encore été créé (lors de la première visite sur la page), la getAttribute()méthode renvoie null, nous devons donc vérifier null. Il en va de même pour les paramètres de requête. Si l'utilisateur ne passe pas le paramètre username, alors sa valeur sera nulle. Dans ce cas, nous accueillons l'utilisateur en tant que visiteur anonyme. Pour passer un paramètre dans une requête GET, une chaîne de requête est utilisée. Par exemple, nous pourrions utiliser l'URL suivante : http:// localhost:8080/hello? Nom d'utilisateur = Paul. Vous pouvez en savoir plus sur les requêtes HTTP dans l' article précédentdans la serie. Notre application n'a actuellement pas beaucoup de logique, mais c'est un peu ennuyeux que nous obtenions une erreur 404 au chemin racine. Pour résoudre ce problème, nous allons créer un autre servlet et le mapper à la page de démarrage : @WebServlet("/"). Le but de cette servlet est de rediriger les requêtes vers le chemin "/hello". Il y a deux manières de le faire : en utilisant "forward" ou "redirect". Peut-être vaut-il la peine de comprendre la différence entre eux. Un transfert délègue le traitement de la requête à un autre servlet sur le serveur. Le client n'est pas impliqué. Pour ce faire, ajoutez 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, récupérons le répartiteur de requêtes pour le servlet concerné et lui demandons de traiter une requête spécifique avec les arguments spécifiés (req, resp). Une redirection renvoie au client l'adresse que le client doit utiliser pour traiter sa requête. La plupart des navigateurs accèdent automatiquement à l'URL renvoyée. Pour implémenter une redirection, vous devez ajouter ce code :

resp.sendRedirect(req.getContextPath() + "/hello");
Nous appelons la redirect()méthode sur le HttpServletResponseparamètre et lui transmettons l'adresse que le client doit utiliser. 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 redirectil est parfois préférable d'utiliser. Si vous comprenez la différence dans leur fonctionnement, vous ne ferez pas le mauvais choix. Le code de la nouvelle 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");
   }
}

Résumé

Votre première application Web est terminée. Dans le prochain article, vous apprendrez à le déployer sans utiliser IntelliJ IDEA. Nous avons écrit une application qui ne traite que les requêtes GET. Les méthodes HTTP restantes sont gérées de la même manière - en remplaçant les méthodes correspondantes de la classe parent. Vous pouvez utiliser des servlets simples comme celui-ci pour créer des applications Web sophistiquées et polyvalentes. Bien sûr, l'utilisation de grands frameworks tels que Spring rend cela beaucoup plus facile. Mais si vous voulez vraiment approfondir toutes les fonctionnalités des servlets, vous pouvez lire la spécification officielle . Partie 6. Conteneurs de servlet Partie 7. Présentation du modèle MVC (Model-View-Controller)
Commentaires
TO VIEW ALL COMMENTS OR TO MAKE A COMMENT,
GO TO FULL VERSION