"petits serveurs".

Besoin

Fournir une API Java pour réaliser de serveurs.

Analyse

Les servlets écoutent des requêtes et retournent des réponses.

Conception

Les servlets écoutent des requêtes réseau sur un port donné et retournent des réponses. Les requêtes attendues peuvent être de divers type mais dans les faits sont presque toujours de type Web. Dans ce cas les servlets sont des servlets particulières, adaptées au décodage de requêtes Web (protocole HTTP).

Implémentation

Servlets Web

C'est le cas le plus courant. Une servlet HTTP hérite de javax.servlet.http.HttpServlet. Elle en redéfinit :

  • (souvent) la méthode void init() exécutée une seule fois après le chargement de la servlet en mémoire.
  • une ou plusieurs méthodes de traitement de requête HTTP telles que :
    • void doGet (HttpServletRequest, HttpServletResponse) pour traiter les requêtes HTTP de type GET
    • void doPost(HttpServletRequest, HttpServletResponse) pour traiter les requêtes HTTP de type POST
    • void service (HttpServletRequest, HttpServletResponse) pour traiter tout type de requête HTTP.

Exemples

Des exemples de servlets sont :

  • une servlet Web écoutant des requêtes HTTP et retournant des pages Web (HTML) dans ses réponses HTTP
  • une servlet Service Web écoutant des requêtes SOAP/HTTP et retournant des réponses SOAP/HTTP
  • une servlet RMI écoutant des requêtes JRMP et retournant des réponses JRMP
  • une servlet CORBA écoutant des requêtes IIOP et retournant des réponses IIOP
  • une servlet écoutant des requête de votre propre protocole et répondant ce que vous voulez

Un exemple de code source de servlet est :

import javax.servlet.http.*; // Classes nécessaires aux servlets Web (HTTP)

public class MaServlet
extends HttpServlet {
/**
* Traitement des requêtes HTTP POST
* @param someRequest La requête HTTP POST
* @param someResponse La réponse HTTP que l'on va remplir
*/

public void doPost (HttpServletRequest someRequest, HttpServletResponse someResponse) {
someResponse.setContentType ("text/html"); // Type MIME d'une page HTML
java.io.PrintWriter output = someResponse.getWriter(); // Flux d'écriture de la réponse

output.println ("<html>");
output.println (" <head>");
output.println (" <title>Bienvenue !</title>");
output.println (" </head>");
output.println (" <body>");

// Valeur du paramètre "name" envoyé avec la requête ?
String userName = someRequest.getParameter ("name");

output.println (" Bienvenue " + userName);

output.println (" </body>");
output.println ("</html>");
}
}

Notes

  • Servlet Version 2 Commentaire
    Domaine Technologie Release 1 2 3 4
    API HttpSession lecture valeurs getValue getAttribute
    lecture clés getValueNames getAttributeNames
    modification setValue setAttribute
    suppression removeValue removeAttribute
    getServletContext Non Oui
    ServletConfig getServletName Non Oui
    ServletRequest Langue Non getLocale
    Cryptage Non isSecure
    HttpServletRequest En-têtes HTTP Non getHeaders
    getContextPath Non Oui
    Identité de l'appelant getUserPrincipal
    Rôle J2EE Non isUserInRole
    HttpServletResponse En-têtes HTTP Non addHeader addIntHeader addDateHeader ...
    RequestDispatcher Non Oui
    ServletContext Paramètres d'initialisation Non getInitParameter getInitParameterNames
    getServletContextName Non Oui
    getResourcePaths Non Oui
    HttpServlet doHead Oui Non Oui
    ServletResponse resetBuffer Non Oui
    Filtres Non FilterChain
    HttpSessionActivationListener Non Oui
    ServletRequestListener Non Oui
    ServletRequestAttributeListener Non Oui
    Descripteur Algorithme SSL Non Oui
    Page d'erreur Non <error-page>
    Assemblage WebApp Non Oui WAR
  • Par défaut, une seule instance de servlet traite plusieurs requêtes clientes simultanément : chaque client a un thread d'exécution de cette instance unique. Il n'est pas recommandé de changer de comportement en implémentant SingleThreadModel, car cela instancierai autant de servlets que de requêtes simultanées.
  • Inclus dans J2EE.

Limitations

  • La construction d'une présentation depuis une servlet alourdit la capacité de changer cette présentation (modification du code Java, recompilation, redéploiement). On préfèrera alors isoler la construction de la présentation dans une JSP.

Voir