Java - Servlet et JSP Servlets JSP (Java Server Pages) Tomcat Programmation coté serveur Entièrement JAVA
Les Servlets
Servlet - Sommaire Qu'est-ce que c'est ? Cycle de vie Partager l'information Initialisation Écriture des services Invoquer d'autres ressources Accéder au contexte de l'application
Servlet - Sommaire Maintenir un état client Finaliser une servlet
Qu'est-ce qu'une servlet ? Classe Java spécifique Étend les capacités d'un serveur à travers un modèle requête/réponse Une Servlet peut répondre à n'importe quel type de requête Il existe une classe Java spécifique orienté HTTP
Qu'est-ce qu'une servlet ? Packages/APIs échanges génériques : javax.servlet échanges HTTP : javax.servlet.http Tous implémente l'interface Servlet Classe GenericServlet
Qu'est-ce qu'une servlet ? Services reposant sur HTTP La classe HttpServlet doGet doPost
Cycle de vie Le cycle de vie d'une servlet est controlée par un conteneur Un conteneur est le programme qui héberge une ou plusieurs applications web
Cycle de vie Lorsqu'une requête est mappée à une servlet : si une instance de la servlet n'existe pas la classe de la servlet est chargée le conteneur instancie la classe la méthode init est lancée (initialisation vue plus loin) la méthode service est invoquée avec les objets les objets de requête et réponse.
Cycle de vie Si le conteneur lance la méthode destroy : quand il doit être arreté quand l'application n'est plus déployée ... Une application peut déclarer des « listener » pour gérer ses différents cycles de vie
Partager l'information Les composants web échangent avec d'autres objets pour accomplir certaines tâches : JavaBean bases de données autres ressources web ...
Partager l'information Un des principaux moyens pour une application web d'echanger avec d'autres objets : Scope Objects Ce sont des objets de « visibilité » qui permettent d'accéder à des ressources Cette notion induit un niveau variable d'échange possible => notion de contexte
Partager l'information Il existe plusieurs contextes (du plus large au plus fin ): web : composants web de la servlet session : composants gérant une requête qui appartiennent à une session request : composants de la requête Les propriétés de ces objets sont accessibles via des méthodes get|set
Partager l'information Attention aux accès concurrents ! des composants peuvent être partagés par le jeu des contextes : le contexte le plus large est visible par toutes les applications pour un même contexte, un objet peut aussi être mis en concurrence d'accès attention au multithreading
Partager l'information exemple de code « synchronisé » : public class Counter { private int counter; public Counter() { counter = 0; } public synchronized int getCounter() { return counter; } public synchronized int setCounter(int c) { counter = c; public synchronized int incCounter() { return(++counter);
Initialisation phase se déroulant juste après le chargement de la servlet par le conteneur méthode init () surchargeable exemple : initialisation de ressources configuration propre à l'application activité qui doit être lancé au démarrage
Initialisation exemple public class MyServlet extends HttpServlet { private BookDBAO bookDB; public void init() { // code d'initialisation de la servlet }
Écriture des services le service d'une servlet est une implémentation de la méthode service de la classe GenericServlet service = doXXX : Get, Delete Options, Post Put, Trace
Écriture des services Ce sont des surcharges de méthodes de la classe HttpServlet la méthode service de la classe Servlet peut aussi être surchargée pour des besoins non HTTP
Écriture des services le modèle commun d'écriture de service : extraction des informations d'une requête accès aux ressources externes nécessaires peuplement de la réponse en conséquence réponse au client
Écriture des services point de vue programmatif : récupérer un flux de sortie pour la réponse si besoin modifier les en-têtes écrire un corps de réponse dans un buffer vider le buffer dans le flux de sortie
Écriture des services -Extraire les informations d'une requête une requête contient des informations passées entre le client et l'application : validation de formulaire n'importe quelle requête web (AJAX...) toutes les requêtes implémentent l'interface ServletRequest
Écriture des services -Extraire les informations d'une requête L'interface ServletRequest récupérer les paramètres informations sur le protocole utilisé informations de localisation (langue, encodage ...) objets Java passés par le conteneur ou par une autre servlet interface générique
Écriture des services -Extraire les informations d'une requête Exemple String bookId = request.getParameter("Add"); request est un objet implicite crée par le conteneur getParameter est une des méthodes de javax.servlet.ServletRequest
Écriture des services -Extraire les informations d'une requête spécialisation pour HTTP : HttpServletRequest requetes purement HTTP données d'URL historiquement tout ce qu'on peut trouver dans QUERY_STRING
Écriture des services -Extraire les informations d'une requête URL http://[host]:[port][chemin]?[query string] le chemin est découpé en plusieurs informations : un contexte qui identifie l'application chemin vers la servlet le chemin vers la servlet peut être un mapping logique du conteneur
Écriture des services -Extraire les informations d'une requête query_string contient toutes les informations transmises Client <a href="/bookstore1/catalog?Add=101"> Add To Cart</a> Serveur String bookId = request.getParameter("Add");
Écriture des services -Construction de la réponse données transmises du serveur vers le client toutes les réponses implémentent l'interface javax.servlet.ServletResponse
Écriture des services -Construction de la réponse récupération d'un flux de sortie pour écrire les données vers le client déclaration du type de contenu (MIME) gestion du buffer (par defaut non utilisé) gestion des locales
Écriture des services -Construction de la réponse spécialisation pour HTTP javax.servlet.HttpServletResponse gestion des codes HTTP (404 ...) gestion des cookies petite quantité d'information stockée chez le client utilisé pour garder un identifiant de session (session tracking)
Écriture des services -Construction de la réponse Exemple public class BookDetailsServlet extends HttpServlet { public void doGet (HttpServletRequest request, HttpServletResponse response) { response.setContentType("text/html"); response.setBufferSize(8192); PrintWriter out = response.getWriter(); out.println("<html>" + "<head><title>+ messages.getString("TitleBookDescription") +</title></head>"); ...
Invoquer d'autres ressources processus qui fait parti de la construction d'une réponse il existe deux modèles d'invocation : par inclusion par délégation La classe RequestDispatcher est l'aiguillage des applications web
Invoquer d'autres ressources -L'inclusion cas d'inclusion bannières informatives information de type copyright en fonction d'un contenu ... RequestDispatcher dispatcher = getServletContext().getRequestDispatcher("/banniere"); if (dispatcher != null) dispatcher.include(request, response);
Invoquer d'autres ressources -L'inclusion un composant intégré par inclusion dans une page a accès à l'objet request : peut écrire dans le corps de la réponse n'a pas le droit de modifier les en-têtes HTTP
Invoquer d'autres ressources -Le transfert vers un autre composant plus utilisé dans un modèle de traitement que de contribution directe à une réponse exemples pré-traiter une requête pour générer un objet intermédiaire effectuer un test applicatif comme une identification ...
Invoquer d'autres ressources -Le transfert vers un autre composant exemple RequestDispatcher dispatcher = request. getRequestDispatcher("/template.jsp"); if (dispatcher != null) dispatcher.forward(request,response);
Accéder au contexte de l'application les composants web s'executent dans un contexte objet implémentant ServletContext paramètres d'initialisation ressources associées (objets, pool de connexion à une BD ...) contraintes d'identification
Accéder au contexte de l'application le contexte de l'application (web context) est l'endroit ou l'information peut être partagée setAttribute (name) getAttribute (Name,Object) Attention, la visibilité/portée est globale !
Maintenir un état client beaucoup d'applications web ont besoin de stocker des informations durant une série de requêtes série de requêtes = transaction une transaction a parfois besoin d'une certaine quantité de données persistantes
Maintenir un état client les données gerées par une transaction sont maintenues dans une session une session maintient « en vie » les données de l'application pendant une transaction cette nécessité est inhérente à la nature même de HTTP (sans état)
Maintenir un état client -Accéder à une session les sessions sont des instances de la classe HttpSession une servlet met sa session à disposition avec la méthode getSession il se peut qu'elle n'existe pas au premier appel, dans ce cas elle est instanciée
Maintenir un état client -Associer des objets à une session n'importe quel objet peut être stocké dans la session mécanisme d'association nommé attention à ne pas confondre objet et applicatif et données (une sesssion n'est pas une BD)
Maintenir un état client -Associer des objets à une session tous les composants appartenant au même contexte voient ce qui est stocké dans la session ET qui partagent une requête de la même session
Maintenir un état client -Associer des objets à une session exemple HttpSession session = request.getSession(); ShoppingCart cart; cart=(ShoppingCart)session.getAttribute("cart");
Maintenir un état client -Notification d'événements de session un objet peut être notifié de son appartenance à une session quand l'objet est ajouté/enlevé de la session javax.servlet.http.HttpSessionBindingListener quand la session est réveillée ou mise en sommeil (ce qui permet d'optimiser le conteneur à travers une BD ... ) javax.servlet.http.HttpSessionActivationListener
Maintenir un état client -Gestion de la session un client ne peut pas notifier qu'il na plus besoin de session HTTP est un protocole sans état une session possède un timeout (configurable) [get|set]MaxInactiveInterval web.xml
Maintenir un état client -Gestion de la session lorsque la session est terminée, elle peut être invalidée par la méthode invalidate HttpSession session=request.getSession(); // traitements session.invalidate();
Maintenir un état client -Tracking de session un conteneur web peut utiliser plusieurs méthodes pour maintenir un état client dans tous les cas basées sur un identifiant peut être stocké dans un cookie à chaque URL retournée au client (écrite dans la réponse)
Maintenir un état client -Gestion de la session attention un client peut ne pas supporter les cookies ! dans ce cas response.encodeURL ajoute automatiquement un attribut jsessionid
Finaliser une servlet lorsqu'un conteneur décide qu'une servlet doit être retirée (hors de ressources, shutdown ...) destroy ()
Les JSP
JSP - Sommaire Qu'est-ce que c'est ? Création de contenu statique Création de contenu dynamique Unified Expression Language Objets implicites Composants JavaBean
JSP -Qu'est-ce que c'est ? abstraction de la classe HttpServlet passage d'un mode programmatif vers un mode déclaratif XML !
JSP -Qu'est-ce que c'est ? point de vue conteneur : JSP = Servlet au premier appel, un document JSP : est parsé comme un document XML transformé en langage Servlet compilé en .class chargé par le conteneur (cycle de vie identique)
JSP -Création de contenu statique en JSP, pas besoin de récupérer le flux de sortie pour écrire dedans le contenu statique est tout ce qui n'est pas JSP et automatiquement restitué vers le client mélange possible de syntaxe XHTML et JSP !
JSP -Création de contenu statique par défaut, le langage HTML est considéré dans le cas d'un autre langage intégré, il faut déclarer son type : <%@ page contentType="text/vnd.wap.wml"%>
JSP -Création de contenu dynamique comme les servlets, le contenu dynamique est généré : soit à partir de l'utilisation du langage Java composants JavaBean objets implicites
JSP -Unified Expression Language c'est un sous-langage de JSP qui permet d'accéder rapidement à des données association en notation pointée : d'un objet représentant une visibilité un composant à accéder une propriété à lire
JSP -Unified Expression Language exemple : sessionScope.cart.numberOfItems sessionScope est un objet implicite représentant la session cart est un objet stocké dans la session numberOfItems est une propriété de cart
JSP -Unified Expression Language - Evaluation intégration de la syntaxe EL dans un document JSP <element value="${sessionScope.cart.total}"/> ${sessionScope.cart.total} est converti, évalué et le résultat est transmis au « gestionnaire de tags »
JSP -Unified Expression Language - Evaluation ${variable} le conteneur recherche l'objet correspondant : page request session application
JSP -Unified Expression Language – référencer des propriétés notation avec [] ou . ${customer.name} = ${customer[''name'']} deux méthodes différentes pour accéder à une même propriété name les combinaisons sont possibles ${customer.address["street"]}
JSP -Unified Expression Language – référencer des propriétés accéder à une propriété : une classe Java correspondant à l'objet doit exister une méthode correspondante à la propriété doit exister sous la forme : [get|set]XXX
JSP -Objets implicites beaucoup d'objets sont directement accessibles écriture allégée
JSP -Objets implicites servletContext session request response
JSP -Objets implicites param : association d'une valeur à un paramètre d'une requête paramValues : association nom/valeur de paramètres associés à la requête cookie : association d'un cookie à son nom
JSP -Objets implicites Ces objets sont des découpages de la session selon des durées de vie différentes : pageScope : document requestScope : requête sessionScope : session applicationScope : application
JSP -Exemples ${1 > (4/2)} false ${4.0 >= 3} true ${(10*10) ne 100} false ${'a' < 'b'} true ${'hip' gt 'hit'} false ${4 > 3} true ${1.2E4 + 1.4} 12001.4 ${3 div 4} 0.75 ${10 mod 4} 2 ${!empty param.Add} True if the request parameter named Add is null or an empty string ${pageContext.request.contextPath}The context path
JSP -Exemples ${sessionScope.cart.numberOfItems} The value of the numberOfItems property of the session-scoped attribute named cart ${param['mycom.productId']} The value of the request parameter named mycom.productId ${header["host"]} The host ${departments[deptName]} The value of the entry named deptName in the departments map
JSP -Composants JavaBean classes Java réutilisables par différentes applications web (contextes) syntaxe particulière pour être reconnue par le conteneur les JB sont bien intégrés dans la syntaxe JSP