Servlet

Une Servlet s’exécute dans un moteur de Servlet ou conteneur de Servlet permettant d’établir le lien entre la Servlet et le serveur Web

Une Servlet s'exécute par l'intermédiaire d'une machine virtuelle

HTTP Servlet

Exemple d'une servlet spécifique au protocole HTTP

//Importation de la bibliothèque Java des Servlets
import java.io.*;
import javax.servlet.*;
import javax.servlet.http.*;

//La classe étend de HttpServlet
public class HelloWorld extends HttpServlet {

 //La méthode (redéfinie) doGet traite les requêtes GET
 public void doGet(HttpServletRequest req, HttpServletResponse res) 
                                        throws ServletException, IOException 
 {
  //Retour au format HTML
  res.setContentType("text/html");

  PrintWriter out = res.getWriter();
  out.println("<html>");
  out.println("<head><title>Bonjour tout le monde</title></head>");
  out.println("<body>");
  out.println("Bonjour tout le monde");
  out.println("</body></html>");
 }
}

L'implémentation par défaut des méthodes doXXX(…) renvoie une erreur de type HTTP 405.

Exemple d'une servlet qui effectue un téléchargement de fichier sur le client

public class DownloadFileServlet extends HttpServlet {
  
 protected void doGet(HttpServletRequest req, HttpServletResponse res)
                                          throws ServletException, IOException 
 {
  try {
   //Lecture du fichier (ici sur le serveur)
   InputStream is = new FileInputStream("c:/dd.txt");

   OutputStream os = res.getOutputStream();

   res.setContentType("text/plain");
	 
   //Indiquer que c'est un contenu à télécharger
   res.setHeader("Content-Disposition","attachment;filename=NomDuFichier.txt");

   int count;
   byte buf[] = new byte[4096];
   
   while ((count = is.read(buf)) > -1) {
    os.write(buf, 0, count);
   }
	
   is.close();
   os.close();
  } catch (Exception e) {
   // Y a un problème.
  }
 }
}
public class DownloadFileServlet extends HttpServlet {
  
 protected void doGet(HttpServletRequest req, HttpServletResponse res)
                                          throws ServletException, IOException 
 {
  byte[] contenu = ... ;
  String fileName = ... ;

  res.setContentType("application/pdf");

  res.setHeader("Content-Disposition", "inline; filename=\"" + fileName + "\"");

  BufferedOutputStream cout = new BufferedOutputStream(res.getOutputStream());

  cout.write(contenu);
  cout.close();

Redirection

La redirection s'effectue au moyen de la méthode sendRedirect. L'appel à cette méthode n'interrompt pas le traitement java. Attention pour une redirection HTTPS, il faut spécifier l'url complète

response.sendRedirect(URL_PAGE_REDIRECTION) ; 

Pour l'affichage d'une page d'erreur, il est aussi possible de lever directement l'erreur

response.sendError(HttpServletResponse.SC_NOT_FOUND);

Dans ce cas, la page 404 prévue dans le fichier web.xml sera affichée

<error-page>
 <error-code>404</error-code>
 <location>/error.htm</location>
</error-page>

Récupération des valeurs contenues dans la requêtes

Les valeurs suivantes peuvent être récupérées, soit en utilisant

Enumeration enTetes = req.getHeaderNames();

    while (enTetes.hasMoreElements()) {
      String enTete = (String) enTetes.nextElement();

      out.println("" 
      + enTete 
      + "" 
      + req.getHeader(enTete) 
      + "");

    }

Soit en utilisant directement la méthode getXXX() de l'objet requête

Hostlocalhost:9080
User-AgentMozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1) Gecko/20061010 Firefox/2.0
Accepttext/xml, application/xml, application/xhtml+xml, text/html;q=0.9, text/plain;q=0.8, image/png, */*;q=0.5
Accept-Languagefr,fr-fr;q=0.8,en-us;q=0.5,en;q=0.3
Accept-Encodinggzip,deflate
Accept-CharsetISO-8859-1,utf-8;q=0.7,*;q=0.7
Keep-Alive300
Connectionkeep-alive
CookieJSESSIONID=0000rQrscijX4kdBwOXZm8foTdt:-1
getAuthType()null
getContentLength()-1
getContentType()null
getHeader("Accept")text/xml, application/xml, application/xhtml+xml, text/html;q=0.9, text/plain;q=0.8, image/png, */*;q=0.5
getHeader("Referer")null
getHeader("User-Agent")Mozilla/5.0 (Windows; U; Windows NT 5.1; fr; rv:1.8.1) Gecko/20061010 Firefox/2.0
getPathInfo()null
getPathTranslated()null
getQueryString()no=69722472×tamp=20061031162845&token=lkdjajdl%E9asjflask
getRequestURI()/test/GetPdf
getRemoteAddr()127.0.0.1
getRemoteHost()localhost
getRemoteUser()null
getRequestURL()http://localhost:9080/test/GetPdf
getServerName()localhost
getProtocol()HTTP/1.1
getServerPort()9080

Paramètre d'initialisation

Il est possible de paramétrer certaine valeur dans le descripteur de deploiement (web.xml) de la servlet en utilisant les éléments init-param, param-name et param-value.

<web-app>
 <servlet>
  <servlet-name>MyServletName</servlet-name>
  <servlet-class>com.mycompany.MyServlet</servlet-class>
    
  <init-param>
   <param-name>param1</param-name>
   <param-value>value1</param-value>
  </init-param>
  <init-param>
   <param-name>param2</param-name>
   <param-value>value2</param-value>
  </init-param>
  ...
 </servlet>
 ...
</web-app>

La récupération se fait généralement dans la méthode init de la Servlet avec les méthodes getInitParameter(String paramName) et/ou getInitParameterNames().

// La méthode init est appelé par le container de Servlet 
// juste avant que la Servlet soit en service.
public void init() throws ServletException {
  getServletContext().log("getinit init");
  
  // Récupération de la valeur d'un paramètre précis
  String value = getServletConfig().getInitParameter("param1");
    
  // Récupération de tous les paramètres d'initialisation
  java.util.Enumeration enum = getServletConfig().getInitParameterNames();
  
  while (enum.hasMoreElements()) {
    // Récupération du nom du paramètre
    String name = (String) enum.nextElement();
    
    // Récupération de la valeur du paramètre
    value = getServletConfig().getInitParameter(name);
  }
    
  // Autre possibilité: en utilisant le contexte de la servlet
  value = getServletContext().getInitParameter("param1");
}