Correction Java EE 05 : servlets, HTTP et déploiement WAR
Correction rédigée à partir du sujet 05 déjà conservé sur le site. Le vocabulaire javax et la structure WAR correspondent au contexte historique Java EE de cet énoncé.
Le sujet de référence
Lire l’énoncé original complet. Barème du sujet : connaissances 8 points, servlet 4 points, application 8 points. Les réponses ci-dessous sont une nouvelle correction pédagogique, pas une ancienne correction retrouvée.
Exercice 1 : les connaissances
Serveur HTTP et serveur d’applications
Voir le corrigé expliqué
Un serveur HTTP traite les échanges HTTP et peut servir des ressources ou relayer des requêtes. Un serveur d’applications fournit un environnement d’exécution aux composants métier. Les fonctions usuelles comprennent le cycle de vie des composants, la sécurité, la gestion de transactions et les connexions aux ressources. Tomcat fournit un conteneur de servlets, sans constituer à lui seul toute la plateforme Java EE.
Exemples historiques pour la question du sujet : WebLogic et WebSphere pour les offres commerciales ; GlassFish et WildFly pour les solutions libres. Il faut distinguer licence du logiciel et contrat de support.
Outils et organisation
Voir le corrigé expliqué
Il faut un JDK pour compiler, une API Servlet compatible, un conteneur, les sources et leurs ressources. Un éditeur ou un IDE facilite l’écriture ; un outil de construction automatise la préparation du WAR. Le navigateur consomme les réponses, il n’exécute pas la servlet.
Exercice 2 : une servlet complète
package com.nkilitech.web;
import java.io.IOException;
import java.io.PrintWriter;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
@WebServlet("/diagnostic")
public class DiagnosticServlet extends HttpServlet {
private String html(String value) {
if (value == null) return "(absent)";
return value.replace("&", "&").replace("<", "<")
.replace(">", ">").replace("\"", """);
}
@Override protected void doGet(HttpServletRequest req,
HttpServletResponse resp) throws IOException {
resp.setContentType("text/html;charset=UTF-8");
PrintWriter out = resp.getWriter();
out.println("<!doctype html><html lang='fr'><meta charset='utf-8'>");
out.println("<title>Diagnostic</title><h1>Diagnostic HTTP</h1><ul>");
out.println("<li>Serveur : " + html(req.getServerName()) + "</li>");
out.println("<li>Connection : " + html(req.getHeader("Connection")) + "</li>");
out.println("<li>Keep-Alive : " + html(req.getHeader("Keep-Alive")) + "</li>");
out.println("<li>Adresse cliente : " + html(req.getRemoteAddr()) + "</li></ul></html>");
}
}Le nom correct de l’en-tête est Connection, même si l’énoncé écrit « connexion ». Les valeurs sont échappées avant leur insertion dans le HTML. Un en-tête peut être absent. Derrière un proxy, l’adresse distante peut être celle du proxy ; ce programme n’est pas un mécanisme d’identification fiable d’une personne.
Problème : construire le WAR
SiteWebTP/
index.html
login.jsp
WEB-INF/
web.xml
classes/com/nkilitech/web/DiagnosticServlet.class
classes/com/nkilitech/web/AuthentificationServlet.class
vues/succes.jsp
vues/echec.jsp<!-- WEB-INF/web.xml : les routes sont déclarées par annotations -->
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee" version="4.0">
<welcome-file-list><welcome-file>index.html</welcome-file></welcome-file-list>
</web-app><!-- index.html -->
<!doctype html><html lang="fr"><meta charset="utf-8">
<title>NKILItech</title><h1>Application de démonstration</h1>
<a href="login.jsp">Ouvrir le formulaire</a></html><!-- login.jsp -->
<%@ page contentType="text/html;charset=UTF-8" %>
<!doctype html><html lang="fr"><meta charset="utf-8"><title>Connexion de démonstration</title>
<form method="post" action="AuthentificationServlet">
<label>Identifiant <input name="login" required></label>
<label>Mot de passe <input name="password" type="password" required></label>
<button type="submit">Envoyer</button>
</form></html>package com.nkilitech.web;
import java.io.IOException;
import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.*;
@WebServlet("/AuthentificationServlet")
public class AuthentificationServlet extends HttpServlet {
@Override protected void doPost(HttpServletRequest req,
HttpServletResponse resp) throws ServletException, IOException {
req.setCharacterEncoding("UTF-8");
// Valeurs imposées par l'exercice ; démonstration locale uniquement.
boolean ok = "Java2ETp".equals(req.getParameter("login"))
&& "Java2ETpass".equals(req.getParameter("password"));
String vue = ok ? "/WEB-INF/vues/succes.jsp" : "/WEB-INF/vues/echec.jsp";
req.getRequestDispatcher(vue).forward(req, resp);
}
}<!-- WEB-INF/vues/succes.jsp -->
<%@ page contentType="text/html;charset=UTF-8" %>
<!doctype html><html lang="fr"><meta charset="utf-8"><title>Résultat</title>
<h1>Authentification de démonstration réussie</h1></html><!-- WEB-INF/vues/echec.jsp -->
<%@ page contentType="text/html;charset=UTF-8" %>
<!doctype html><html lang="fr"><meta charset="utf-8"><title>Résultat</title>
<h1>Identifiants incorrects</h1></html>La redirection vers des JSP demandée à la fin du sujet est réalisée ici par un transfert serveur forward. Le formulaire envoie un POST. Les identifiants en dur sont seulement ceux de l’exercice : cette démonstration ne crée pas de session authentifiée et ne doit pas protéger une application réelle.
# Depuis le dossier parent, après compilation des classes
jar --create --file Java2ETp.war -C SiteWebTP .Les sources Java restent dans src, hors de la racine publique. Compilez-les avec l’API javax.servlet fournie par votre conteneur compatible, puis placez les classes dans l’arborescence indiquée. L’archive nommée Java2ETp.war donne habituellement le contexte /Java2ETp. Les API modernes jakarta.* demandent une migration cohérente : changer un seul import ne suffit pas.
Vérifications attendues
- Le lien index.html ouvre le formulaire.
- Le couple fourni mène à la vue de réussite ; une autre valeur mène à l’échec.
- Une requête GET sur la servlet d’authentification n’exécute pas le traitement POST.
- La route /diagnostic supporte des en-têtes absents.
- Les JSP de WEB-INF ne sont pas directement accessibles comme fichiers publics.
Référence : Apache Tomcat : structure et déploiement.
Référence : API Java EE : HttpServletRequest.