J2EE Dr. Mohammed ERRITALI
Architecture 1-tiers Présentation Traitement données Navigateur Serveur Web Systèm e de fichiers
Architecture 2-tiers Présentation Traitement données Navigateur Serveur Web Base de données
Architecture 3-tiers Présentation Traitement données Navigate ur Serveur Web Base de données Serveur d’application s
Le modèle d’application de J2EE
La communications entre le client et le serveur
Les « containers » J2EE Les applications multi-tiers sont difficiles à écrire Beaucoup de code entrelacé pour gérer les transactions, l’état, le pooling des ressources, etc. Container Sert d’interface entre les fonctionalités de bas niveau qui sont spécifiques à une plateforme Avant de pouvoir exécuter un composant web, EJB ou d’application client L’assembler dans un module J2EE Le déployer dans son conteneur
Types de containers
Le container serveur J2EE Fournit les containers web et EJB Le container EJB Gère l’exécution des EJB Le container Web Gère l’exécution des pages JSP et des servlets Le container d’applets Browser + Java plug-in
Exemples de conteneurs Serveurs J2EE JBoss : Glassfish : JOnAS: Oracle AS : Conteneur Web Tomcat : Jetty : Conteneur EJB3 EasyBeans:
API J2EE J2EE (Java 2 Edition Enterprise) propose les API : L'invocation de méthodes distantes : RMI, CORBA, Web Services L'accés aux bases de données relationnelles : JDBC L'accés aux annuaires et services de nommage : JNDI L'utilisation du XML : DOM et SAX HTML dynamique et traitement de requêtes HTTP : JSP et Servlet La gestion du Mail : Java Mail La gestion des messages : Java Message Service La gestion des composants : EJB La connection à des ERP : Java Connector La gestion des droits d'accès : Java Authentication and Authorization Service
Servlets
Rappel :LE PROTOCOLE HTTP HTTP :HyperText Tranfert Protocol (RFC 1945 et 2068) Protocole de rapatriement des documents Protocole de soumission de formulaires Fonctionnement (très simple en HTTP/1.0) Connexion demande (GET, POST) d’un document renvoi du document (status=200) ou d’une erreur déconnexion
Dialogue HTTP Types de dialogue Récupération d’un document méthode GET Soumission d’un formulaire méthodes GET ou POST Envoi de Document et Gestion de Site méthodes PUT, DELETE Méthode HEAD (Récupération des infos sur le document).
Le client envoie la requête : Méthode POST Post /Nom_Script HTTP/1.0 host: HTTP_ACCEPT_LANGUAGE : fr User-Agent : Mozilla/4.0 *** saut de ligne *** login=Value1& pass=Value2 & Var3=Value3 Post /Nom_Script HTTP/1.0 host: HTTP_ACCEPT_LANGUAGE : fr User-Agent : Mozilla/4.0 *** saut de ligne *** login=Value1& pass=Value2 & Var3=Value3 Entête de la requête corps de la requête Méthode,chemin,version Nom de domaine Code de la langue Type et version du navigateur Paramètres des différents champs du formulaire.
Le client envoie la requête : Méthode GET GET /Nom_Script?login=val1&pass=val2&…. HTTP/1.0 host: HTTP_ACCEPT_LANGUAGE : fr User-Agent : Mozilla/4.0 GET /Nom_Script?login=val1&pass=val2&…. HTTP/1.0 host: HTTP_ACCEPT_LANGUAGE : fr User-Agent : Mozilla/4.0 Entête de la requête corps de la requête est vide
Le Serveur retourne la réponse : HTTP/ OK Date : Wed, 05Feb02 15:02:01 GMT Server : Apache/ Last-Modified : Wed 02Oct01 24:05:01GMT Content-Type : Text/html Content-legnth : 4205 *** saut de ligne *** …. HTTP/ OK Date : Wed, 05Feb02 15:02:01 GMT Server : Apache/ Last-Modified : Wed 02Oct01 24:05:01GMT Content-Type : Text/html Content-legnth : 4205 *** saut de ligne *** …. Entête de la réponse corps de la réponse Ligne de Status Date du serveur Nom du Serveur Dernière modification Type de contenu Sa taille Le fichier que le client va afficher
Introduction aux servlets Une servlet est une classe Java, exécutée par un moteur de servlets, fonctionnant du côté serveur au même titre que les langages de script côté serveur tels que ASP ou bien PHP Les servlets permettent donc de gérer des requêtes HTTP et de fournir au client une réponse HTTP dynamique.
Architecture du package servlet.jar Toutes les servlets implémentent directement ou indirectement l'interface Servlet, en dérivant une classe qui l'implémente: c'est-à-dire généralement la classe HttpServlet, elle-même issue de GenericServlet. La classe GenericServlet (javax.servlet.GenericServlet) définit une classe abstraite (implémentation de base de l'interface Servlet). Servlet GenericSrvlet service() HttpServlet doPost() doGet() NotreServlet doPost() doGet()
Gestion des servlets Moteur de Servlets Réponse HTTP 1 Réponse HTTP 2 Thread Créer un pool de threads Servlet Instancier la servlet Appeler la méthode init() Requête HTTP 2 Affecter une requête à un thread Requête HTTP 1 Affecter une requête à un thread Appeler la méthode service() Appeler la méthode destroy() Terminer le pool de threads Initialisation Exécution service Exécution service
Cycle de vie d’une servlet Le serveur crée un pool de threads auxquels il va pouvoir affecter chaque requête La servlet est chargée au démarrage du serveur ou lors de la première requête La servlet est instanciée par le serveur La méthode init() est invoquée par le conteneur Lors de la première requête, le conteneur crée les objets Request et Response spécifiques à la requête La méthode service() est appelée à chaque requête dans un nouveau thread. Les objets Request et Response lui sont passés en paramètre Grâce à l'objet request, la méthode service() va pouvoir analyser les informations en provenance du client Grâce à l'objet response, la méthode service() va fournir une réponse au client La méthode destroy() est appelée lors du déchargement de la servlet, c'est-à-dire lorsqu'elle n'est plus requise par le serveur. La servlet est alors signalée au garbage collector.
Fonctionnement d’une servlet Lorsqu'une servlet est appelée par un client, la méthode service() est exécutée. Celle-ci est le principal point d'entrée de toute servlet et accepte deux objets en paramètres: L'objet HttpServletRequest encapsulant la requête du client, c'est-à-dire qu'il contient l'ensemble des paramètres passés à la servlet (informations sur l'environnement du client, cookies du client, URL demandée,...) L'objet HttpServletResponse permettant de renvoyer une réponse au client (envoyer des informations au navigateur).
Développement d’une servlet Afin de développer un servlet fonctionnant avec le protocole HTTP, il suffit de créer une classe étendant HttpServlet (qui implémente elle-même l'interface Servlet). La classe HttpServlet (dérivant de GenericServlet) permet de fournir une implémentation de l'interface Servlet spécifique à HTTP. La classe HttpServlet redéfinit la méthode service en lisant la méthode HTTP utilisée par le client, puis en redirigeant la requête vers une méthode appropriée. Les deux principales méthodes du protocole HTTP étant GET et POST, il suffit de redéfinir la méthode adéquate afin de traiter la requête :
Développement d’une servlet Si la méthode utilisée est GET, il suffit de redéfinir la méthode : public void doGet( HttpServletRequest request, HttpServletResponse response ) Si la méthode utilisée est POST, il suffit de redéfinir la méthode : public void doPost( HttpServletRequest request, HttpServletResponse response )
HttpServletRequest MéthodeDescription String getMethod() Récupère la méthode HTTP utilisée par le client String getHeader(String Key) Récupère la valeur de l'attribut Key de l'en- tête String getRemoteHost() Récupère le nom de domaine du client String getRemoteAddr() Récupère l'adresse IP du client String getParameter(String Key) Récupère la valeur du paramètre Key (clé) d'un formulaire. Lorsque plusieurs valeurs sont présentes, la première est retournée String[] getParameterValues(String Key) Récupère les valeurs correspondant au paramètre Key (clé) d'un formulaire, c'est-à-dire dans le cas d'une sélection multiple (cases à cocher, listes à choix multiples) les valeurs de toutes les entités sélectionnées Enumeration getParameterNames() Retourne un objet Enumeration contenant la liste des noms des paramètres passés à la requête String getServerName() Récupère le nom du serveur String getServerPort() Récupère le numéro de port du serveur
HttpServletResponse MéthodeDescription String setStatus(int StatusCode)Définit le code de retour de la réponse void setHeader(String Nom, String Valeur)Définit une paire clé/valeur dans les en-têtes void setContentType(String type ) Définit le type MIME de la réponse HTTP, c'est-à-dire le type de données envoyées au navigateur void setContentLength(int len)Définit la taille de la réponse PrintWriter getWriter() Retourne un objet PrintWriter permettant d'envoyer du texte au navigateur client. Il se charge de convertir au format approprié les caractères Unicode utilisés par Java ServletOutputStream getOutputStream() Définit un flot de données à envoyer au client, par l'intermédiaire d'un objet ServletOutputStream, dérivé de la classe java.io.OutputStream
Première Servlet package web; import java.io.*; import javax.servlet.ServletException; import javax.servlet.http.*; public class FirstServlet extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println(" "); out.println(" Titre "); out.println(" "); out.println("Ma première servlet"); out.println(" "); out.close(); }
Déploiement d’une servlet Pour que le serveur j2ee reconnaisse une servlet, celle-ci doit être déclarée dans le fichier web.xml qui se trouve dans le dossier WEB-INF. Le fichier web.xml s’appelle le descripteur de déploiement de Servlet. Ce descripteur doit déclarer principalement les éléments suivant : Le nom attribué à cette servlet La classe de la servlet Le nom URL à utiliser pour faire appel à cette servlet via le protocole HTTP.
web.xml FirstServlet FirstServlet /fs 30
A vous de jouer TP
Suivi de session Le protocole HTTP est un protocole sans état impossibilité alors de garder des informations d’une requête à l’autre (identifier un client d’un autre) Obligation d’utiliser différentes solutions pour remédier au problème d’état Cookies persistants session
Cookies persistants : Cookie Un cookie est une information envoyée au navigateur (client) par un serveur WEB qui peut ensuite être relue par le client lorsqu’un client reçoit un cookie, il le sauve et le renvoie ensuite au serveur chaque fois qu’il accède à une page sur serveur La valeur d’un cookie pouvant identifier de façon unique un client, ils sont souvent utilisés pour le suivi de session Les cookies ont été introduits par la première fois dans Netscape Navigator
L’API Servlet fournit la classe javax.servlet.http.Cookie pour travailler avec les Cookies Cookie(String name, String value): construit un cookie String getName(): retourne le nom du cookie String getValue(): retourne la valeur du cookie setValue(String new_value): donne une nouvelle valeur au cookie setMaxAge(int expiry): spécifie l’âge maximum du cookie
Pour la création d’un nouveau cookie, il faut l’ajouter à la réponse (HttpServletResponse) addCookie(Cookie mon_cook): ajoute à la réponse un cookie La Servlet récupère les cookies du client en exploitant la réponse (HttpServletRequest) Cookie[] getCookies(): récupère l’ensemble des cookies du site
Code pour créer un cookie et l’ajouter au client Code pour récupérer les cookies
Exemple : gestion de session (identifier un client d’un autre)par l’intermédiaire des cookies persistants
Session : HttpSession Solution 2: utilisation de l’API de suivi de session HttpSession Méthodes de création liées à la requête (HttpServletRequest) HttpSession getSession() : retourne la session associée à l’utilisateur HttpSession getSession(boolean p) : création selon la valeur de p
Gestion d’association (HttpSession) Enumeration getAttributNames() : retourne les noms de tous les attributs Object getAttribut(String name): retourne l’objet associé au nom setAttribut(String na, Object va): modifie napar la valeur va removeAttribut(String na): supprime l’attribut associé à na Destruction (HttpSession) invalidate() : expire la session logout() : termine la session
Exemple : suivi de session pour un compteur
Collaboration de Servlets Les Servlets s’exécutant dans le même serveur peuvent dialoguer entre elles Deux principaux styles de collaboration: partage d’information : un état ou une ressource. Exemple : un magasin en ligne pourrait partager les informations sur le stock des produits ou une connexion à une base de données Partage du contrôle: une requête. Réception d’une requête par une Servlet et laisser l’autre Servlet une partie ou toute la responsabilité du traitement
La collaboration est obtenue par l’interface ServletContext Une Servlet retrouve le ServletContext de son application web par un appel à getServletContext() Exemples de méthodes: void setAttribute(String name, Object o) : lie un objet sous le nom indiqué Object getAttribute(String name) : retrouve l’objet sous le nom indiqué Enumeration getAttributeNames() : retourne l’ensemble des noms de tous les attributs liés void removeAttribute(String name) : supprime l’objet lié sous le nom indiqué
Collaboration de Servlets : partage du contrôle Deux types de distribution Distribuer un renvoi : une Servlet peut renvoyer une requête entière Distribuer une inclusion : une Servlet peut inclure du contenu généré Les avantages sont La délégation de compétences Architecture logicielle MVC (Servlet = contrôle et JSP = présentation)
Le support de la délégation de requête est obtenu par l’interface RequestDispatcher Une Servlet obtient une instance sur la requête RequestDispatcher getRequestDispatcher(String path): retourne une instance de type RequestDispatcher par rapport à un composant Un composant peut-être de tout type : Servlet, JSP, fichier statique, … path est un chemin relatif ou absolu ne pouvant pas sortir du contexte Pour distribuer en dehors du contexte courant il faut : Identifier le contexte extérieur (utilisation de getContext()) Utiliser la méthode getRequestDispatcher(String path)
Partage du contrôle : distribuer un renvoi La méthode forward(...)de l’interface RequestDispatcher renvoie une requête d’une Servlet à une autre ressource sur le serveur void forward(ServletRequest req, ServletResponse res): redirection de requête
Exemple : distribuer un renvoi de Emetteur à Recepteur
Partage du contrôle : distribuer une inclusion La méthode include(…)de l’interface RequestDispatcher inclut le contenu d’une ressource dans la réponse courante La différence avec une distribution par renvoi est : la Servlet appelante garde le contrôle de la réponse elle peut inclure du contenu avant et après le contenu inclus Possibilité de transmettre des informations lors de l’inclusion: en attachant une chaîne d’interrogation (au travers de l’URL) en utilisant les attributs de requête via la méthode setAttribute(...)
Exemple : permet de distribuer une inclusion
A vous de jouer TP