1. This site uses cookies. By continuing to use this site, you are agreeing to our use of cookies. Learn More.
Dismiss Notice
Welcome to our Education website, plz like our page facebook to support us. Thank You and wish you good navigation

Chapitre 2 : Servlets

abdelouafiSep 21, 2016

    1. abdelouafi

      abdelouafi Administrator Staff Member

      Messages:
      195
      Likes Received:
      9
      Trophy Points:
      18
      Joined
      Sep 13, 2016
      Les servlets java forment la pierre angulaire des composants web java, elles sont utilisées pour gérer la logique métier des applications web, elle peuvent aussi gérer la partie présentation. Dans le chapitre précédent nous avons discuté les concepts de bases des servlets, dans ce chapitre on va traiter avec plus de détails le modèle des servlets java.
      Plan:
      Introduction

      Envoie des requêtes http via le navigateur

      Gestion des requêtes dans httpServlet

      Analyse de la requête

      Compréhension des session

      Utilisation de HttpSession

      Techniques avancées pour la gestion des sessions

      Envoie de la réponse

      Le cycle de vie d’une servlet

      ServletConfig

      ServletContext

      Conclusion

      Envoie des requêtes http:
      Le navigateur envoie une requête http au serveur dans les situations suivantes :

      -l’utilisateur clique sur un lien hypertexte dans une page html
      -L’utilisateur remplit une formulaire html dans une page web et l’envoie
      -L’utilisateur saisi une adresse URL dans la barre d’adresse du navigateur et appuie sur entree.
      Il y’a d’autres événements qui causent l’envoie d’un requête au serveur comme la fonction javascript reload(). Mais ses événement ne sont en fait que des simulations des actions du client.

      Par défaut le navigateur utilise la méthode GET pour envoyer des requêtes dans toutes les événements précitées, cependant on peut lui forcer à utiliser POST ou HEAD via l’attribut method

      Comme suit :

      <FORM name=‘form1’ method=‘POST’ action=‘/premiereServlet/login.fc’ >



      Comparaison des méthodes HTTP:
      Le tableau suivant résume les points de différence entre GET et POST
      upload_2016-9-21_13-30-38.png


      Traitement des requêtes dans httpServlet:
      HTTP HttpServlet définit pour chaque méthode une méthode correspondante avec la signature suivante :

      protected void doXXX(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException;

      doXXX() dépond de la méthode http comme suit

      GET à doGet()

      POST à doPost()

      HEAD à doHead()

      La classe HttpServlet offre une implémentation vide des méthodes doXXX(). Vous devez redéfinir ces méthodes pour implémenter la logique métier de votre application.

      Séquence d’événements dans HttpServlet:
      1 – le conteneur de servlets appelle la méthode service(ServletRequest req, ServletResponse resp) définit dans HttpServlet.

      2 – La méhode service(ServletRequest req, ServletResponse resp) de HttpServlet appelle la méthode service(HttpServletRequest req, HttpServletResponse resp) de la même classe (la deuxième méthode est une version surchargée de la première).

      3 – La méthode service(HttpServletRequest req, HttpServletResponse resp) analyse la requête et détecte la méthode HTTP utilisée puis appelle la méthode doXXX corespondante.

      Remarque :

      -Si vous redéfinissez la méthode service(HttpServletRequest req, HttpServletResponse resp) vous perdez les fonctionnalités offertes par HttpServlet, et par conséquent les méthodes doXXX ne seront pas appelés automatiquement
      -HttpServletRequest et HttpServletResponse sont des interfaces, les implémentations concrètes sont offert par le conteneur des servlets.


      L’analyse de la requête:
      ServletRequest et sa sous interface HttpServletRequest offrent des méthodes pour analyser la requête du client et extraire les données envoyées par le navigateur : paramètres, méta-informations contenu texte ou les flux binaires.
      upload_2016-9-21_13-33-57.png

      Exemple 1 : interception des paramètres
      upload_2016-9-21_13-34-12.png

      Redéfinition de doPost()
      upload_2016-9-21_13-34-22.png

      Exécution
      upload_2016-9-21_13-34-32.png
      upload_2016-9-21_13-34-36.png

      Exemple 2 : interception des entêtes
      upload_2016-9-21_13-34-47.png

      Exécution
      upload_2016-9-21_13-35-2.png

      Compréhension des sessions
      Puisque une application web est normalement conçue pour interagir avec plusieurs clients en même temps, elle a besoins de mémoriser l’historique des interactions avec chaque utilisateur. Les sessions offrent un mécanisme qui permet de garder les traces des ces interactions.

      État et sessions :

      Les protocoles d’interactions sont subdivisées en deux catégories : les protocoles avec état et sans état. Les protocoles de la première catégorie sont capables de mémoriser l’état des requêtes passées, tandis que ceux de la deuxième catégorie considère chaque requête comme une nouvelle requête. HTTP est un protocole sans état, donc un serveur HTTP n’a pas de moyen pour déterminer si une succession de requêtes provient du même client ou pas. Ça veut dire que le serveur HTTP ne peut pas maintenir l’état du client entre deux requêtes.

      Dans certaines applications, on a pas besoins de se souvenir de l’état du client, mais dans d’autres c’est primordial « par exemple pour garder le panier dans une application e-commerce ».

      Une session est une série ininterrompue de requête-réponse échangée entre une serveur et un client.

      Une session commence lorsqu’un client inconnu envoie une première requête à l’application web. Elle se termine lorsque le client explicitement termine la session ou lorsque le serveur ne reçoit aucune requête pendant un certain temps.

      Lorsque le serveur reçoit une première requête de la part d’un client, il initialise une session et lui assigne un id unique.

      Le client à son tour doit inclure cet id dans les requêtes qui suivent.


      HttpSession:
      L’API des servlets offre une abstraction de la session représentée par l’interface javax.servlet.http.HttpSession qui est implémentée par le conteneur de servlets.

      La methode getSession(true) définit dans HttpRequest permet d’obtenir le référence de la session en cours s’il y en a une sinon il permet de créer une nouvelle session.

      La manipulation des session passe par trois étapes :

      1– la récupération de l’objet HttpSession

      2- ajout ou suppression des variables de la session

      3- destruction de la session si nécessaire

      Le temps maximum d’inactivité d’une session est spécifié dans le descripteur du déploiement comme suit :

      <session-config>

      <session-timeout>40</session-timeout>

      </session-config>

      La classe HttpSession définit plusieurs méthodes qui permettent de manipuler la session (voir tableau ci dessous).
      upload_2016-9-21_13-36-20.png

      jsessionid et la récriture des URLs:
      Comment le serveur détecte qu’une requête fait partie d’une session ?

      1- un client envoie une requête au serveur. Puisque c’est la première requête il ne contient pas l’id de la session.

      2- le serveur crée un nouvelle session et lui affecte un nouveau id. l’appel de la méthode isNew() renvoie true. Le serveur envoie l’id au client avec la réponse (stocké dans l’entête avec la clé cookie).

      3- le client récupère l’id de la session et il le stocke pour l’utiliser dans les requêtes suivantes.

      4- le client envoie une autre requête, et cette fois si elle envoie l’id de la session avec la requête(toujours codé dans l’entête).

      5- Le serveur reçoit la requête et observe l’id de la session et il associe automatiquement cette requête avec la session correspondante. Dans ce cas on dit que le client rejoint la session car c’est pas une nouvelle session. L’appel de la méthode isNew() renvoie false.

      Notez bien que l’id de la session est codé dans l’entête avec la clé : cookie
      upload_2016-9-21_13-37-4.png

      Le problème posé par cette technique se manifeste lorsque l’utilisateur désactive les cookies, dans ce cas on perdent les variables de sessions. Le serveur commence une nouvelle session pour toute requête qui arrive.

      Pour pallier à ce problème la solution consiste à coder l’id de la session dans l’URL. L’interface HttpServletResponse offre des méthode pour coder l’id de la session dans l’URL

      upload_2016-9-21_13-37-27.png

      Envoie de la réponse:
      L’objet httpServletResponse et le moyen par lequel une servlet envoie les informations en réponse à une requête du client. Elle fournit un ensemble de méthodes qui permettent de manipuler la réponse :

      upload_2016-9-21_13-38-9.png

      getWriter() : Cette méthode retourne un objet de type java.io.PrintWriter qui est utilisé pour envoyer des caractères au client, comme vous allez le remarquer cet objet est utilisé extensivement pour générer du code html.

      getOutputStream() : si vous voulez envoyer un fichier binaire comme un fichier exécutable vous aurez besoin d’un OutputStream au lieu d’un PrintWriter

      Manipulation des entêtes : On utilise les entêtes pour donner plus d’information sur la réponse comme : le type de contenu envoyé, la durée durant laquelle le navigateur peut cacher le contenu envoyé etc.

      La redirection : Après un traitement on peut rediriger le client vers une autres ressource : une autre servlet ou un contenu statique local ou sur un serveur distant.

      Exemple 1 : resp.sendRedirect("/PremiereServlet/login.shtml");

      Exemple 2 : resp.sendRedirect("http://www.ensa.ac.ma");

      getOutputStream:
      upload_2016-9-21_13-38-33.png

      Le cycle de vie d’une servlet:
      Maintenant c’est clair qu’une servlet reçoit une requête client, la traite et répond en utilisant doXXX. Il y’a d’autres opérations effectuées par le conteneur de servlet avant et après l’exécution de la méthode service().
      upload_2016-9-21_13-38-53.png

      Chargement et Initialisation :
      Lorsqu’on démarre le conteneur de servlets, il cherche dans tout les descripteurs des application web situés dans son répertoire de déploiement, chacun des ses fichier contient un ensemble de descriptions de servlets. Le conteneur crée une instance pour toute servlets en appelant l’instruction :

      Class.forName(nomClasse).newInstance().

      On dit que la servlet et chargée.

      Puisqu’on ne peut pas définir un constructeur pour notre classe servlet, pour initialiser des paramètre lors de la création le conteneur de servlet appelle la méthode init(SevletConfig), l’objet SevletConfig contient les paramètres d’initialisation spécifiés dans le descripteur de l’application dans les balises <init-param>.

      Exemple : pour initialiser la connexion à la bd on peut spécifier, login, mot de passe et l’url du serveur de la bd dans le descripteur de l’application comme suit :
      <init-param>

      <param-name>driverclassname</param-name>

      <param-value>sun.jdbc.odbc.JdbcOdbcDriver</param-value>

      </init-param>

      <init-param>

      <param-name>dburl</param-name>

      <param-value>jdbc:eek:dbc:MySQLODBC</param-value>

      </init-param>

      <init-param>

      <param-name>username</param-name>

      <param-value>testuser</param-value>

      </init-param>

      <init-param>

      <param-name>password</param-name>

      <param-value>test</param-value>

      </init-param>


      ServletConfig:
      Les méthodes définies dans ServletConfig :

      String getInitParameter (String name)

      Enumeration getInitParameterNames()

      String getServletName()

      Préinitialiation de la servlet :

      <load-on-startup>1 </load-on-startup>

      Pour charger et initialiser la servlet au démarrage du conteneur.

      Exécution et déstruction:
      À la réception d’une requête destinée à la servlet, le conteneur des servlets appelle la methode service(ServletRequest req, ServvletResponse resp) sur l’instance de la servlet chargée en mémoire.

      Si la servlet ne reçoit aucune requête durant une longue période le conteneur des servlet invoque la méthode destroy pour faire le ménage puis décharge la servlet. On dit que la servlet se trouve dans l’état déchargé.



      ServletContext:
      L’interface ServletContext est considérée comme une fenêtre à travers laquelle une servlet peut explorer son environnement. Une servlet peut utiliser cette interface pour obtenir des informations comme les paramètres d’initialisation de l’application web, la version du conteneur des servlets, elle offre des méthodes utilitaires pour charger les ressources partagés (comme les fichier de propriétés .properties).

      Chaque application web possède un et un seul objet de type ServletContext, cet objet est accessible à toute ressource active de l’application, il est généralement utiliser pour partager les données entre servlets.

      Dans cette section on va travailler avec les méyhodes getRessource et getRessourceAsStream, ces méthodes sont utilisées par une servlet pour accéder à une ressource sans spécifier son chemin absoulu.

      upload_2016-9-21_13-41-41.png

      upload_2016-9-21_13-41-49.png

      Initialisation du ServletContext:
      Una application web possède un seul contexte (instance de javax.servlet.ServletContxt) , cet objet est initialisé au moment du chargement de l’application web, on peut définir des paramètres d’initialisation du contexte dans le descripteur du déploiement web.xml comme suit :


      <web-app>

      ...

      <context-param>

      <param-name>dburl</param-name>

      <param-value>jdbc:databaseurl</param-value>

      </context-param>

      ...

      <web-app>

      Les paramètres d’initialisation du contexte sont utilisés pour spécifier des informations qui concernent toute l’application web comme des informations sur le développeur de l’application et les ressources partagées par toutes les servlets de l’application, à titre d’exemple : les paramètres de connexion à une base de données.

      ServletContext offre les méthodes suivantes pour manipuler les paramètres d’initialisation du context :

      upload_2016-9-21_13-42-26.png

      Avant d’utiliser les méthodes précitées, vous devez tout d’abord obtenir une référence du Contexte soit à travers un objet de type ServletConfig ou directement en appelant le méthode getServletContext() hérité de GenericServlet.

      upload_2016-9-21_13-42-40.png

      Partager les données (portée des attributs):
      Les servlets partagent les données entre eux suivant le concept du rendezVous, une servlet stocke les données dans des objets spécifiques pour cette tâche qui agissent comme des conteneurs, les autres servlets peuvent accéder à ces données via les conteneurs : ServletRequest, HttpSession et ServletContext.

      Ces trois objets offrent les méthodes setAttribute(String name, Object value) et Object getAttribut(String name) respectivement pour stocker ou obtenir un objet.

      Portée :

      ServletContext : accessible durant le cycle de vie de l’application web.

      HttpSession : accessible durant le cycle de vie de la session

      ServletRequest : accessible durant le cycle de vie d’une requête http



      Conclusion:
      Dans ce chapitre on a exploré en détail le modèle des servlet, depuis la création en passant par l’initialisation, l’exécution qui consiste à analyser la requête client et envoyé la réponse désirée du serveur vers le client jusqu’à la destruction. Dans le chapitre suivant on va voire une technologie complémentaire aux servlets : Java Server Pages.
       
      Loading...

Share This Page

Share