Généralités
Introduction
- Une servlet est une application web exécutée sur la machine virtuelle Java permettant de générer un contenu dynamique avec interaction éventuelle avec d'autres composants (base de données, autres applications web...)
-
Une servlet s'exécute à l'aide d'un container de servlet qui supporte le protocole HTTP :
- Le container reçoit une requête HTTP d'un client web
- Il examine la ressource demandée (URL) et la distribue vers la servlet la plus adaptée
- La classe de la servlet est chargée et instantiée si nécessaire
- Le container appelle la méthode de l'objet correspondant au type de requête en communiquant en paramètres des objets pour lire les caractéristiques de la requête
-
La servlet traite la requête et renvoie une réponse :
- sous la forme d'en-têtes HTTP
- avec un corps (contenu à retourner)
- Le container envoie le résultat de la requête au client web
Container de servlets
- Java EE propose une spécification pour les servlets
-
Il existe différents container de servlets :
-
Apache Tomcat : implantation de référence avec le container de servlets Catalina
- La dernière version 8 supporte Java 1.7 ainsi que les NIO par défaut
- Un tutorial pour utiliser Tomcat sous Eclipse
- Caucho Resin : un serveur applicatif avec container de servlets (proposé sous double licence propriétaire-GPL) et des morceaux de C
- Eclipse Jetty : propose un container assez léger réutilisé par des serveurs applicatifs (JBoss, Geronimo...)
- Winstone : une implantation très légère et peu configurable ne s'intéressant qu'aux servlets
- ...
-
Apache Tomcat : implantation de référence avec le container de servlets Catalina
-
Pour un usage en production, il est recommandé de ne pas exposer directement le container de servlets mais d'utiliser un site web frontal servant de proxy (Apache HTTPD, Lighttpd) :
- Permet d'ajouter des fonctionnalités de sécurité (authentification, prévention de déni de service)
- Permet une meilleure gestion des ressources statiques (pages statiques, fichiers JavaScript, données audiovisuelles...)
- Les principaux IDE Java supportent en standard ou via des plugins l'utilisation de servlets et des container
Un résumé sur le protocole HTTP
- HTTP : Hyper-Text Transfer Protocol (imaginé pour accéder à des serveurs de ressources de pages avec liens hypertextes) ; protocole ancêtre : Gopher
- Le protocole HTTP est simple à appréhender pour une utilisation basique (un serveur web simple peut être codé en une centaine de lignes en Java)...
- ...mais complexe à manier si l'on souhaite supporter toutes ses subtilités
-
HTTP fonctionne selon un paradigme requête/réponse :
- Un client initie une connexion avec le serveur en lui soumettant une requête (en-têtes + corps éventuel)
- Le serveur renvoie une réponse (en-têtes + corps éventuel)
- Il n'y a pas d'état : chaque connexion HTTP est indépendante
- Pour gérer un état persistant, des informations sur celui-ci doivent être communiquées avec chaque requête (mécanisme de cookie)
- Pour en savoir plus sur le protocole HTTP
Implantation d'une servlet
Création d'une servlet
On peut créer une classe dérivée de l'une de ces classes :
- javax.servlet.Servlet
- ou javax.servlet.http.HttpServlet (qui dérive de Servlet)
Une servlet implante une méthode void service(ServletRequest req, ServletResponse res) pour traiter la requête et préparer la réponse.
Pour HttpServlet, cette méthode est déjà implantée pour vérifier la méthode HTTP et appeler
- void doX(HttpServletRequest req, HttpServletReponse res) (X ∈ { GET, HEAD, POST, OPTIONS, PUT, DELETE, TRACE })
Une servlet qui affiche Hello World
public class HelloWorld extends HttpServlet { public void init() throws ServletException { /* Code for initialization */ } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<html><body>Hello World</body></html>"); } public void destroy() { } }
HTTPServletRequest
- Modélise une requête HTTP
-
Quelques méthodes utiles :
- String getMethod() : méthode HTTP
- String getHeader(String name) : pour obtenir un champ d'en-tête
- String getRemoteAddr() : adresse du client
- String getContextPath() : chemin utilisé dans l'URL
- Map<String, String[]> getParameterMap : dictionnaire de paramètres (extraits de la partie query de l'URL)
- InputStream getInputStream() : flot où lire des données envoyées par le client
- HttpSession getSession(boolean create) : retourne la session existante (ou la créé si demandé)
HttpServletResponse
- Représente une réponse HTTP
-
Quelques méthodes utiles :
- void setHeader(String name, String value) : pour indiquer un champ d'en-tête
- void setStatus(int code) : pour spécifier un statut de réponse
- void setContentType(String name) : pour indiquer le type MIME de la réponse
-
Pour obtenir un flot où écrire le corps de la réponse, on utilise l'une de ces méthodes :
- OutputStream getOutputStream()
- ou Printer getWriter()
Utilisation de sessions
- Représentation par une instance de javax.servlet.http.HttpSession
- Généralement basé sur l'installation d'un cookie avec un entier aléatoire
- Durée de session réglable : setMaxInactiveInterval(int seconds)
- Possibilité d'attacher des attributs aux sessions : void setAttribute(String, Object) et Object getAttribute(String)
- Invalidation de session avec invalidate()
- Attention aux détournements de session : XSS, CSRF, capture de connexion non sécurisée...