- sur le réseau ;
- sur l'architecture logicielle ;
- sur les protocoles HTTP/HTTPS ;
- à propos des bases de Maven .
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 !-
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(); } }
-
Pour exécuter l'application, vous devez créer une configuration Tomcat :
-
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 :
-
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.
-
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 .
-
Cliquez sur OK. On voit que nous avons désormais la possibilité de lancer l'application :
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» .
-
Nous le contactons sur http://localhost:8080/hello et obtenons la réponse attendue - la chaîne « Bonjour » !
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");
}
}
GO TO FULL VERSION