SERVLET & JSP CHAPITRE 2 LE MODÈLE SERVLET Yosri ZOUARI 05-2019 Plan Introduction aux Servlets Cycle de vie d’une Servlet La Requête La Réponse Les Annotations Servlet API 3.0 Introduction aux Servlets C’est quoi une Servlet? Comment fonctionne une Servlet? Quelles sont les détails techniques d’une Servlet? Définition d’une Servlet Composant qui permet de gérer les requêtes HTTP et de fournir une réponse HTTP Servlet est à son tour gérée par un moteur de Servlet « Servlet Container » « Servlet Container » assure la communication avec le serveur Web Servlet est une classe JAVA gérée par la JVM Architecture Servlet Vue générale Architecture Servlet Vue approfondie Quelle est la différence entre GET et POST? GET vs. POST GET POST Le traitement de la requête n’affecte pas l’état du serveur Le traitement de la requête affecte l’état du serveur : CRUD DB Les paramètres sont passés dans l’URL l’URL ne doit passé dépasser une longueur de 255 caractères Les paramètres sont passé dans le corps de la requête Servlet API Paquets L’API servlet regroupe un ensemble de classes dans deux packages : javax.servlet : contient les classes pour développer des servlets génériques indépendantes d’un protocole javax.servlet.http : contient les classes pour développer des servlets qui reposent sur le protocole HTTP utilisé par les serveurs web javax.servlet.annotation : contient des annotations pour annoter les servlets, les filtres et les écouteurs. Il spécifie également les métadonnées pour les composants annotés. javax.servlet.descriptor : contient des types fournissant un accès par programme aux informations de configuration d’une application Web. Servlet API paquet « javax.servlet » Servlet API Interfaces du paquet « javax.servlet » RequestDispatcher : Définition d’un objet qui permet le renvoi d’une requête vers une autre ressource du serveur (une autre servlet, une JSP, ...) Servlet : Définition de base d’une servlet ServletConfig : Définition d’un objet pour configurer la servlet ServletContext : Définition d’un objet pour obtenir des informations sur le contexte d’exécution de la servlet ServletRequest : Définition d’un objet contenant la requête du client ServletResponse : Définition d’un objet qui contient la réponse renvoyée par la servlet SingleThreadModel : Permet de définir une servlet qui ne répondra qu’à une seule requête à la fois Servlet API Classes du paquet « javax.servlet » Classes : GenericServlet : Classe définissant une servlet indépendante de tout protocole ServletInputStream : Flux permet la lecture des données de la requête cliente ServletOutPutStream : Flux permettant l’envoie de la réponse de la servlet Exceptions : SevletException : Exception générale en cas de problème durant l’exécution de la servlet UnavailableException : Exception levée si la servlet n’est pas disponible Servlet API paquet « javax.servlet.http » Servlet API Interfaces du paquet « javax.servlet.http » Interfaces : HttpServletRequest : Hérite de ServletRequest définit un objet contenant une requête selon le protocole http HttpServletResponse : Hérite de ServletResponse définit un objet contenant la réponse de la servlet selon le protocole http HttpSession : Définit un objet qui représente une session Classes : Cookie : Classe représentant un cookie (ensemble de données sauvegardées par le navigateur WEB sur le poste client) HttpServlet : Hérite de GenericServlet classe définissant une servlet utilisant le protocole http HttpUtils : Classe proposant des méthodes statiques utiles pour le développement de servlet http Servlet API Diagramme de classe Avantages Servlet Portabilité : Exploiter la portabilité de JAVA Puissance : API mature Efficacité et endurance : Servlet chargée une seule fois Sureté : Typage fort Gestion des exceptions Premier Exemple de Servlet Développer l’exercice : Tutorial_Première_Servlet_HelloWorld_3.docx Premier Exemple Réflexion après le premier exemple C’est quoi ce ficher « web.xml » ? C’est quoi cette structure du projet ? Comment la Servlet est exécutée ? C’est quoi ces objets qu’on a manipulé « HttpServletRequest » et « HttpServletResponse » ? C’est quoi ces annotations qu’on a utilisé ? Evolution de l’API Servlet Avant Servlet API 3.0 la configuration de Servlet est effectuée au niveau du « web.xml » Depuis Servlet API 3.0, la configuration des Servlets est effectuée via l’annotation « @WebServlet ». L’exercice « Tutorial_Première_Servlet_HelloWorld.docx » illustre la spécification Servlet API 2.5 Cycle de vie d’une Servlet Quand une Servlet est créée? Comment une Servlet est invoquée? Quand une Servlet est morte? Cycle de vie d’une Servlet Vue général Cycle de vie d’une Servlet Vue approfondie Cycle : Loading -- Instantiation -- initialization -serving -- destroying Servlet est chargée et instanciée avant la première requête Chargement de la Servlet : exécution des blocs statiques Instanciation de la Servlet : création de l’instance et initialiser les paramètres d’instance Appel de la méthode « init » : une exception de type « javax.resource.spi.UnavailableException » est lancée si l’initialisation échoue Cycle de vie d’une Servlet Vue approfondie La Servlet est invoquée par le conteneur web suite à une requête HTTP : La méthode « service » de la classe parent « HttpSevlet » est invoquée Dans le corps de la méthode on fait appel à l’une des 6 méthodes « doXXX » selon la méthode de la requête HTTP Plusieurs requêtes plusieurs threads accès simultané à la méthode service pour une seule Instance de servlet Serveur arrêté appel de la méthode « destroy » de la servlet But : libérer les ressources allouées dans la méthode « init » Cycle de vie d’une Servlet Scénario complet La Requête Comment on récupère une requête http dans une Servlet? Qu’est ce qu’on peut récupérer d’une requête http? HttpServletRequest Utilité Question : A quoi sert l’objet « HttpServletRequest » ? Qu’est ce qu’on a besoin de récupérer de « HttpServletRequest » ? Réponse : Paramètre de la requête HTTP Paramètres de l’entête de la requête Les cookies utilisateur URL, PATH et diverses autres informations relatives à la requêtes HttpServletRequest Diagramme de classes HttpServletRequest Récupération des paramètres d’une requête Besoin : Récupère les paramètres passés en paramètres dans une requête HTTP Solution : « HttpServletRequest » propose un ensemble de méthodes pour récupérer les paramètres : Méthode Description String getParameter(String name) Retourne la valeur d’un paramètre en format String Map<String,String[]>getParameterMap() Retourne un Map Clé : nom Valeur : un tableau de valeur Enumeration<String>getParameterNames Retourne une Enumeration des noms de () paramètres String[] getParameterValues(name) Retourne un tableau des valeurs d’un paramètre HttpServletRequest Récupération de l’entête d’une requête HTTP Besoin : Récupérer les paramètres de l’entête d’une requête HTTP Solution : « HttpServletRequest » définie des méthodes pour récupérer ces données HttpServletRequest Récupération de l’entête d’une requête HTTP Méthode String getHeader(String name) Enumeration getHeaders(String name) Enumeration getHeaderNames() Long getDateHeader(String) Int getIntHeader(String name) Récupération de l’entête d’une requête HTTP Exemple Récupération de l’entête d’une requête HTTP Résultat HttpServletRequest Introduction aux Cookies C’est quoi un « Cookie » ? : est un petit fichier texte qui contient une petite quantité d'informations sur un utilisateur visitant votre site et est stocké sur l'ordinateur du visiteur du site par son navigateur pour enregistrer les préférences de l'utilisateur, personnaliser les données, rappeler la dernière visite, ou pour garder une trace des articles dans un ordre pendant qu'un utilisateur navigue Quand une cookie est créée ? : HttpServletRequest Emplacement des Cookies Dans l’inspecteur de la page HTML : Dans le navigateur : HttpServletRequest Propriétés d’une Cookie Nom Description name Nom de la propriété value Valeur de la propriété maxAge Date d’expiration domain Nom de domaine propriétaire de cette « cookie » Les cookies ne peuvent être lus que par le site qui les a créés ou par un site «en dessous» du site qui les a créés path URL absolue propriétaire de cette « cookie » HttpServletRequest Récupération des Cookies Comme la requête et la réponse, l’API Servlet enveloppe le Cookie dans un objet JAVA fournissant les méthodes nécessaires pour récupérer/saisir le contenue Cookie Méthodes de la classe Méthode Description public void setMaxAge(int expiry) Fixer l'âge maximum de la Cookie en secondes. public String getName() Retourne ne nom de la Cookie. Le nom n’est plus éditable après création. public String getValue() Retourne la valeur de la Cookie. public void setName(String name) Saisir le nom de la Cookie. public void setValue(String value) Saisir la valeur de la Cookie. HttpServletRequest Exercice : paramètres d’un formulaire Développer un formulaire dans un fichier HTML Mettre dans l’action du formulaire le path de notre servlet Récupérer les paramètres du formulaire dans la méthode POST de notre servlet Mettre un break point au niveau du post de la méthode de la servlet et développer l’objet « httpServletRequest » La Réponse Comment on récupère une réponse http dans une Servlet? Qu’est ce qu’on peut récupérer d’une réponse http? Qu’est ce qu’on peut manipuler avec une réponse http? HttpServletResponse Utilité Question : A quoi sert l’objet « HttpServletResponse » ? Qu’est ce qu’on peut saisir dans une « HttpServletResponse » ? Réponse : Paramètres de l’entête de la réponse Le corps de la réponse Des cookies HttpServletResponse Diagramme de classes HttpServletResponse Saisir l’entête de la réponse Besoin : Saisir des paramètres de l’entête d’une réponse HTTP Solution : « HttpServletResponse » définie des méthodes pour saisir ces données Méthode setDateHeader(String name, long date); addDateHeader(String name, long date); setHeader(String name, String value); addHeader(String name, String value); setIntHeader(String name, int value); addIntHeader(String name, int value); HttpServletResponse Redirection Contexte : Utilisateur valide un formulaire Le PATH de la validation du formulaire s’affiche dans le navigateur Problème : Utilisateur peut rafraichir la page envoie une deuxième fois le formulaire Besoin : une solution qui permet d’avoir une nouvelle URL dans le navigateur Solution : « redirection » Comment : Utiliser la méthode « redirect(String) » de « HttpServletResponse » HttpServletResponse Redirection Exemple : Redirection vers un autre domaine HttpServletResponse Redirection Redirection vers une ressource locale HttpServletResponse Création d’une Cookie Besoin : Créer une nouvelle cookie Solution : « HttpServletResponse » définie la méthode « addCookies(Cookie cookie) » pour ajouter une nouvelle « Cookie » Exemple : Note : un navigateur est supposé supporter 20 cookies/site, 300 cookies en total et une taille maximale de 4KByte maximum/cookie HttpServletResponse Spécifier le type du contenu retourner dans la réponse Besoin : On a besoin de retourner différent types de contenus dans la réponse Solution : « HttpServletResponse » définie la méthode « setContentType(String mimeType) » pour spécifier le type du contenu qu’on va saisir dans la réponse comme : application/json text/html texte/plain Exemple : Exercice Redirection & Cookie Créer un nouveau projet Web Créer une Servlet « ServletB » qui : affiche « Hello World » Affiche le contenu de la Cookie. Créer une Servlet « ServletA » qui : Crée une cookie qui sauvegarde un paramètre « lastAccessDateTime » qui contiendra la date complète d’accès. Fait une redirection vers la Servlet « ServletB ». Vérifier que l’appel à la Servlet « ServletA » fait la redirection vers la Servlet « ServletB ». Vérifier que le cookie a été bien reçue par le navigateur. Les Annotations Servlet API 3.0 C’est quoi ces annotations ? Comment on manipule ces annotations ? Pourquoi ces annotations ? Les Annotations Introduction Les annotations sont une nouvelle fonctionnalité introduite dans la spécification Servlet 3.0. Avant Servlet 3.0, déclarer des servlets on doit le faire dans le fichier « web.xml ». A partir de Servlet 3.0, on peut simplement annoter les classes de servlet en utilisant l'annotation « @WebServlet ». Elles sont définies dans le package « javax.servlet.annotation » Les Annotations Liste des annotations Parmi les annotations on distingue : @WebServlet : Définit une Servlet @WebFilter : Définit un Filter @WebListener : Définit un Listener @WebInitParam : Définit des paramètres d’initialisation @ServletSecurity : Utilisée dans une Servlet pour définir les contraintes de sécurité @MultipartConfig : Utilisée dans une Servlet pour définir les propriétés de téléchargement de fichier @WebServlet Définition « @WebServlet » est utilisée pour déclarer un servlet. La classe annotée doit étendre la classe « javax.servlet.http.HttpServlet ». Attributs : Nom Type Obligatoire Description value urlPatterns String[] OUI Spécifie un ou plusieurs URL patterns de la Servlet. name String NON Nom de la Servlet. displayName String NON Nom affiché de la Servlet description String NON Description de la Servlet asyncSupported boolean NON Indique si la Servlet supporte ou non le mode asynchrone. Par défaut : false @WebServlet Définition Nom Type Obligatoire Description initParams WebInitParam[] NON Spécifie un ou plusieurs paramètres d’initialisation. Chaque paramètre est spécifié par «@WebInitParam». loadOnStartup init NON Spécifie l’ordre de chargement des Servlets smallIcon String NON Spécifie le nom de la petite icone de la Servlet largeIcon String NON Spécifie le nom de la grande icone de la Servlet @WebServlet Initialisation d’une Servlet - Introduction C’est une nouvelle méthode pour définir les paramètres d’initialisation d’un Servlet via « @WebInitParam » Syntaxe : Attributs : Nom Type Obligatoire Description name String OUI Nom du paramètre value String OUI Valeur du paramètre description String NON Description du paramètre @WebServlet Initialisation d’une Servlet @WebServlet Asynchrone concept - Définition Servlet 3.0 introduit la possibilité de traitement asynchrone des demandes afin que le thread puisse retourner dans le conteneur et effectuer d'autres tâches. Lorsque le traitement asynchrone commence sur la demande, un autre thread peut générer la réponse Pourquoi ce concept ? : Dans un Serveur, chaque requête est assignée à un Thread qui invoque la Servlet. Tans qu’une Servlet n’a pas retourné de réponse, le Thread n’est pas libéré. Si une Servlet consacre un temps de traitement important, cela peut conduire à la famine de threads Si le serveur reçoit un grand nombre de demandes à traiter, il atteindra la limite maximale de threads de servlet et les autres demandes obtiendront des erreurs de connexion refusée. @WebServlet Asynchrone concept - Illustration @WebServlet Asynchrone concept - Exemple On utilise l’attribut « asyncSupported » de l’annotation pour indiquer si la servlet est asynchrone. Exemple : Récapitulons C’est quoi une Servlet ? Quel est le cycle de vie d’une Servlet ? Comment on récupère une requête HTTP dans une Servlet ? Comment on récupère une réponse HTTP dans une Servlet ? Citer quelques annotations définies dans Servlet 3.0