O slideshow foi denunciado.
Seu SlideShare está sendo baixado. ×

Servlets et JSP

Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Anúncio
Carregando em…3
×

Confira estes a seguir

1 de 111 Anúncio

Mais Conteúdo rRelacionado

Diapositivos para si (20)

Quem viu também gostou (20)

Anúncio

Semelhante a Servlets et JSP (20)

Mais recentes (20)

Anúncio

Servlets et JSP

  1. 1. SERVLETS heithem.abbes@gmail.com2014/2015
  2. 2. Servlet - Définition  Servlet : Server-side applet  Applet est une classe s’exécutant chez le client alors que la servlet s’exécute chez server.  Une classe java s’exécutant coté serveur  reçoit et répond aux requêtes de clients web,  généralement via HTTP  servlet web ou servlet (pour simplifier)  Permettre la programmation d'applications web en Java Navigateur Web requête requête réponseréponse Servlet Serveur Web
  3. 3. Environnement d’exécution de servlets  Les servlets s'exécutent dans un conteneur de servlets, appelé aussi conteneur web  Conteneur web = serveur web + moteur de servlet  Etablit le lien entre le serveur web et la servlet Navigateur Web requête requête réponseréponse Servlet Serveur Web  Exemples de conteneur de servlets  Tomcat (Implantation de référence)  Jetty  Weblogic  ... Conteneur de servlets
  4. 4. Squelette de base de servlet import javax.servlet.*; public class MyServlet implements Servlet { public void init(ServletConfig config) throws ServletException { … } public void service( ServletRequest request, ServletResponse response ) throws ServletException, IOException { … } public void destroy() { … }
  5. 5. Cycle de vie d’une servlet  Le conteneur gère le cycle de vie :  charge la classe de servlet et initialise une instance de cette classe  chaque requête du client est traitée par une instance de servlet dans un thread séparé  peut supprimer la servlet  peut garder la servlet pour traiter d’autres requêtes Browser Browser Browser Server Servlet Instance
  6. 6. Cycle de vie d’une servlet  Lorsque la servlet est instancié, le conteneur appelle la méthode init() pour initialiser la servlet  Sur demande du client, le conteneur appelle la méthode service()  Avant la suppression de la servlet, le conteneur appelle la méthode destroy() Classe Servlet Appel de la methode init Instance de Servlet Traitement de requêtes: appel de la méthode service Détruire la Servlet: appel de la méthode destroy Garbage Collection ServletConfig
  7. 7. Modèle de programmation  Une servlet doit implémenter l’interface javax.servlet.Servlet  soit directement,  soit en dérivant d’une classe implémentant cette interface :  javax.servlet.GenericServlet : une classe abstraite indépendante du protocole  javax.servlet.http.HttpServlet : une classe abstraite spécifique au protocole HTTP  l’interface javax.servlet.Servlet possède les méthodes pour  initialiser la servlet : init()  recevoir et répondre aux requêtes des clients : service()  détruire la servlet et ses ressources : destroy()
  8. 8. Servlet web  Pour faciliter le traitement particulier des requêtes web, la classe Servlet est affinée en javax.servlet.http.HttpServlet  des méthodes remplacent la méthode service() de la classe mère  doGet() pour les requêtes http de type GET  doPost() pour les requêtes http de type POST  ....  La classe servlet doit OBLIGATOIREMENT implémenter l’une des méthodes redéfinies, choisies selon le mode d’envoi du formulaire html qui l’exécute  service() de HttpServlet appelle automatiquement la bonne méthode en fonction du type de requêtes http
  9. 9. HTTP  HTTP décrit les échanges entre navigateur web (client) et serveur web : le navigateur effectue une requête HTTP; le serveur la traite et envoie une réponse HTTP.  Une requête HTTP a le format suivant : Ligne de commande (Commande, URL, Version de protocole) En-tête de requête [Ligne vide] Corps de requête  Une réponse HTTP a le format suivant : Ligne de statut (Version, Code-réponse, Texte-réponse) En-tête de réponse [Ligne vide] Corps de réponse  Les commandes essentielles sont GET (obtenir un document) et POST (envoyer du contenu).  Les données de la requête sont passées dans l’URL pour un GET et dans le corps pour un POST.
  10. 10. Développement de Servlet  Une Servlet web  étend la classe javax.servlet.http.HttpServlet  implémente des méthodes spécifiques au protocole HTTP remplacent la méthode service() : doGet(), doPost()…  La servlet reçoit les requêtes et renvoie les réponses via 2 objets :  Objet requête : javax.servlet.ServletRequest  contient les informations nécessaires pour une communication du client vers le serveur  Objet réponse : javax.servlet.ServletResponse  contient les informations nécessaires pour une communication du serveur vers le client
  11. 11. Développement de 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)
  12. 12. Développement de Servlet import javax.servlet.*; import javax.servlet.http.*; import java.io.*; public class ServletName extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException { // lecture de la requête // traitements // envoi de la réponse } public void doPost(HttpServletRequest req, HttpServletResponse res) throws ServletException { // lecture de la requête // traitements // envoi de la réponse } }
  13. 13. Principe de fonctionnement  Les fichiers de bytecode (.class) sont stockés sur le serveur (comme des docs)  Ils sont désignés par une URL  http://depinfo-fst.rnu.tn/MaServlet  Le chargement de l'URL provoque l'exécution de la servlet
  14. 14. Exemple - HelloServlet
  15. 15. Exemple - HelloServlet
  16. 16. Exemple - HelloServlet
  17. 17. Paramètres des méthodes doGet() et doPost()  Utiliser les objets HttpServletRequest et HttpServletResponse passés en paramètres de ces méthodes pour implanter le service  HttpServletRequest contient les informations sur le formulaire html initial (utile pour doPost())  La méthode getParameter() récupère les paramètres d’entrée  HttpServletResponse contient le flux de sortie pour la génération de la page html résultat (getWriter())
  18. 18. Aperçu de l’API servlet  Méthodes importantes d’un objet HttpServletRequest  String getParameter(String param)  Retourne la valeur du champ param transmis dans les données du formulaire  java.util.Enumeration getParameterNames()  retourne l'ensemble des noms de paramètres transmis à la servlet  String getMethod()  retourne la méthode HTTP (GET ou POST) utilisée pour invoquer la servlet  Méthodes importantes d’un objet HttpServletResponse  void setContentType(String type)  définit le type MIME du document retourné par la servlet  PrintWriter getWriter()  retourne un flux de sortie permettant à la servlet de produire son résultat
  19. 19. Aperçu de l’API servlet Autres méthodes appelables sur un objet HttpServletRequest  String getProtocol()  retourne le protocole implanté par le serveur (ex. : HTTP/1.1)  String getServerName() / String getServerPort()  retourne le nom/port de la machine serveur  String getRemoteAddr() / String getRemoteHost()  retourne l'adresse/nom de la machine cliente (ayant invoqué la servlet)  String getScheme()  retourne le protocole utilisé (ex. : http ou https) par le client  java.io.BufferedReader getReader()  retourne un flux d'entrée permettant à une servlet chaînée de récupérer le résultat produit par la servlet précédente  permet à la servlet chaînée de modifier le résultat
  20. 20. Déploiement d’une Servlet  Pour déployer une application dans un conteneur, il faut lui fournir deux éléments :  Tous les composants (classes compilées, ressources ...) regroupée dans une archive ou module  Descripteur de déploiement contenu dans le module qui précise au conteneur des options pour exécuter l'application  Une servlet doit faire partie d’un module web pour être déployée  Un module Web est un ensemble de librairies, de fichiers de configurations, de code Java (bytecode des servlets...), ...
  21. 21. Déploiement d’une application web  Web Application Archive : une application web (*.html, *.jsp, servlets, ...) packagée dans un archive (.war) et est paramétrée dans le fichier WEB-INF/web.xml  Structure  Fichiers web de l’application (HTML, JSP, js, css...)  Répertoire « META-INF » : fichiers de configuration  MANIFEST.MF : informations sur le zip  Répertoire « WEB-INF » : contenu de l’application  WEB-INF/web.xml  Descripteur de déploiement  WEB-INF/classes/  class des servlets et des classes (JavaBean, ...) associées  WEB-INF/lib/  .jar additionnels provenant de tierce parties (comme des drivers JDBC, TagLib (JSF, ...),  WEB-INF/tlds/  .tld décrivant les TagLibs
  22. 22. Descripteur de déploiement web.xml <web-app> <servlet> <servlet-name> nom de servlet </servlet-name> <servlet-class> nom de la classe de servlet </servlet-class> <init-param> < param-name> nom du paramètre d’initialisation </param-name> < param-value> valeur du paramètre d’initialisation </param-value> </init-param> </servlet> <servlet-mapping> <servlet-name> nom de servlet </servlet-name> <url-pattern> url d’invocation de servlet </url-pattern> </servlet-mapping> </web-app>
  23. 23. Descripteur de déploiement web.xml <web-app> <servlet> <servlet-name> HelloServlet </servlet-name> <servlet-class> server.HelloServlet </servlet-class> <init-param> < param-name> compteur </param-name> < param-value> 0 </param-value> </init-param> </servlet> <servlet-mapping> <servlet-name> HelloServlet </servlet-name> <url-pattern> /hello </url-pattern> </servlet-mapping> </web-app>
  24. 24. Initialisation de servlet  La méthode est invoquée pour initialiser la servlet  Les paramètres d’initiation sont définis dans web.xml  peuvent être changés sans avoir à recompiler l'application  La méthode, getInitParameter() de l’interface ServletConfig permet de récupérer ces paramètres d’initialisation <web-app> … <servlet> <servlet-name>InitExample</servlet-name> <servlet-class>ServletInit</servlet-class> <init-param> <param-name>login</param-name> <param-value>snoopy</param-value> </init-param> </servlet> … </web-app>
  25. 25. Chaînage de servlets  Agrégation des résultats fournis par plusieurs servlets  Meilleure modularité  Meilleure réutilisation  Utilisation d'un RequestDispatcher  obtenu via un objet request de type HttpServletRequest RequestDispatcher rd = request.getRequestDispatcher( "servlet2" );  Inclusion du résultat d'une autre servlet rd.include(request, response);  Délégation du traitement à une autre servlet rd.forward(request, response);
  26. 26. Cookies  Cookie = donnée stockée par un serveur web chez un client  Moyen pour récupérer des informations sur le client  nom, adresse email, …  Eviter à l’utilisateur de taper ces informations chaque fois qu’il est nécessaire  L'utilisateur a la possibilité d'interdire leur dépôt dans son navigateur  Définis dans la classe javax.servlet.http.Cookie  Créé en donnant un nom (String) et une valeur (String) Cookie unCookie = new Cookie( "sonNom", "saValeur" );  Positionné via un objet response response.addCookie( unCookie );  Récupéré via un objet request Cookie[] desCookies = request.getCookies();  Quelques méthodes : String getName() / String getValue()
  27. 27. Sessions  HTTP protocole non connecté (sans état), ne gère pas les sessions  Deux requêtes successives d'un même client sont indépendantes pour le serveur  Notion de session : suivi de l'activité du client sur plusieurs pages  un objet Session associé à toutes les requêtes d’un utilisateur  Les sessions expirent au bout d'un délai fixé (pas de requête pendant n secondes ! expiration de la session)  La gestion des sessions utilise les techniques
  28. 28. API de HttpServlet  Les servlets offrent une API simplifiant la gestion de sessions  L’objet request de HttpServletRequest maintient les informations sur la session  Accessibles via les méthodes:  HttpSession session = request.getSession(boolean flag)  flag=true: retourne l'objet session courant ou en crée un s'il n'y en a pas.  flag=false: retourne l'objet session courant ou null s'il n'y en a pas  isRequestedSessionIdFromCookie()  vrai si l'id de la session vient d'un cookie  isRequestedSessionIdFromURL()  vrai si l'id de la session vient d'un URL  JSESSIONID est le nom du cookie, utilisé par le conteneur de servlet, qui maintient un identifiant unique pour chaque session
  29. 29. Configuration de session  Initialisation de la durée d'une session  dans le web.xml (en minutes) <session-config> <session-timeout>30</session-timeout> </session-config>  avec la méthode void setMaxInactiveInterval( int seconds ); de HttpSession qui spécifie le temps avant la fermeture d’une session  Terminaison de session  après expiration du timeout  avec la méthode void setMaxInactiveInterval( int seconds );  avec la méthode void invalidate() de l'objet HttpSession, HttpSession session = request.getSession(true); session.invalidate(); ou setMaxInactiveInterval(0);
  30. 30. Méthodes de session  Méthodes appelables sur un objet de type HttpSession  void setAttribute( String name, Object value );  ajoute un couple (name, value) pour cette session  Object getAttribute( String name );  retourne l'objet associé à la clé name ou null  void removeAttribute( String name );  enlève le couple de clé name  java.util.Enumeration getAttributeNames();  retourne tous les noms d'attributs associés à la session  long getCreationTime(); /long getLastAccessedTime();  retourne la date de création / de dernier accès de la session en ms
  31. 31. Partage de données entre servlets  Contexte d'exécution = ensemble de couples (name, value) partagées par toutes les servlets instanciées ServletContext ctx = getServletContext()  Méthodes appelables sur un objet de type ServletContext  void setAttribute( String name, Object value )  ajoute un couple (name, value) dans le contexte  Object getAttribute( String name )  retourne l'objet associé à la clé name ou null  void removeAttribute( String name )  enlève le couple de clé name  java.util.Enumeration getAttributeNames()  retourne tous les noms d'attributs associés au contexte
  32. 32. Les listeners  Les listeners sont des objets dont les méthodes sont invoquées en fonction du cycle de vie d'une servlet  A la création et à la destruction d'un contexte (une application) Javax.servlet.ServletContextListener  Quand on modifie les attributs du contexte Javax.servlet.ServletContextAttributeListener  A la création, la suppression, d'une session Javax.servlet.HttpSessionListener  A la création, modification, suppression d'un attribut de session Javax.servlet.HttpSessionAttributeListener
  33. 33. Les listeners du contexte Void contextDestroyed(ServletContextEvent sce) Notification that the servlet context is about to be shut down. void contextInitialized(ServletContextEvent sce) Notification that the web application is ready to process requests. ServletContextListener void attributeAdded(ServletContextAttributeEvent scab) Notification that a new attribute was added to the servlet context. void attributeRemoved(ServletContextAttributeEvent scab) Notification that an existing attribute has been remved from the servlet context. void attributeReplaced(ServletContextAttributeEvent scab) Notification that an attribute on the servlet context has been replaced. ServletContextAttributeListener
  34. 34. Les listeners de session Void sessionCreated(HttpSessionEvent se) Notification that a session was created. void sessionDestroyed(HttpSessionEvent se) Notification that a session was invalidated. HttpSessionListener void attributeAdded(HttpSessionBindingEvent se) Notification that an attribute has been added to a session. void attributeRemoved(HttpSessionBindingEvent se) Notification that an attribute has been removed from a session. void attributeReplaced(HttpSessionBindingEvent se) Notification that an attribute has been replaced in a session. HttpSessionAttributeListener
  35. 35. La déclaration d’un listener  Il faut informer le conteneur de la classe de listener, dans le descripteur de déploiement web.xml <listener> <listener-class> cours.exemple1.SessionCounter </listener-class> </listener>
  36. 36. Exemple de classe de listener
  37. 37. Filtres  Un filtre est un code exécuté entre la requête et le « endpoint »  Permettent de faire du pre et post-processing sur une requête  Lire la requête, modifier la requête, modifier la réponse, retourner des erreurs au client  Ajouter des fonctions aux applications  Log, Compression, Cache  Même cycle de vie qu’une servlet  Init/doFilter/destroy  Implanter la méthode doFilter()  Déclarer le filtre dans web.xml  Filter  Filter-mapping  Le transfert à la suite de la chaine se fait par la fonction chain.doFilter()  Transfert à un autre filtre ou à une servlet ou une page HTML ou une page JSP  La suite s’exécute au retour de doFilter()
  38. 38. Filtres
  39. 39. Filtres public class LoginFilter extends GenericFilter { private FilterConfig filterConfig; public void doFilter(HttpServletRequest request, HttpServletResponse response, FilterChain chain){ System.out.println("Entering Filter"); request.setAttribute("hello","Hello World!"); chain.doFilter(request,response); System.out.println("Exiting HelloWorldFilter"); } }
  40. 40. Gestion des erreurs  Il est possible de définir les pages à afficher  En fonction d'erreurs http  En fonction d'exceptions java <error-page> <exception-type> cours.event.EventException </exception-type> <location>/erreur.html</location> </error-page> Dans web.xml <error-page> <error-code>404</error-code> <location>/404.html</location> </error-page> Pour une erreur Http Pour une exception java
  41. 41. Gestion de concurrence  Par défaut les servlets sont exécutées de façon multi- threadée  Si une servlet doit être exécutée en exclusion mutuelle (ex. : accès à des ressources partagées critiques)  implantation de l'interface SingleThreadModel public class CompteurServlet extends HttpServlet implements SingleThreadModel{ public void doGet( ServletRequest request, ServletResponse response ) throws ServletException, IOException { /* Tout le code de la Servlet est en exclusion avec lui-même */ } }  Autre solution : définir du code synchronized dans la servlet  Attention aux inter-blocages
  42. 42. Conclusion  Servlets : étendent le comportement des serveurs Web avec des programme Java  Portabilité  facilité d'écriture (Java)  Définition du code, du paquetage, du déploiement  Exécutée en // avec des processus légers (threads)  Limites  Difficile d’écrire du code HTML dans du code Java  Introduction de la technologie Java Server Pages (JSP)  Pas de mécanisme intégré de distribution  Introduction de la technologie Enterprise Java Beans (EJB)
  43. 43. JAVA SERVER PAGES (JSP)
  44. 44. Servlet & JSP  Servlet : une classe java  Java Server Pages : insertion du code Java dans une page HTML  JSP ont les mêmes fonctionnalités que HttpServlet  Implémentation du mécanisme requête/réponse  Accéder aux mêmes données/objets qu’une servlet  Inclure ou rediriger la requête vers une autre servlet/JSP  Génération de différents types de contenus : HTML, XML, SVG..  Gestion des méthodes, headers, cookies, sessions...
  45. 45. Servlet & JSP  Traitement d’une JSP par le serveur  Une JSP est compilée en servlet à la première utilisation  Se transforme en classe implémentant: javax.servlet.jsp.HttpJspPage  Lors du premier chargement d’une jsp  Génération d’une servlet à partir de la jsp  Compilation de la servlet  Instanciation de la servlet  Délai d’attente lors de la première consultation  En cas d’erreur de syntaxe, message envoyé au navigateur (erreurs détectées à l’exécution)  Lors des chargements suivants  Exécution de la servlet dans un thread
  46. 46. JSP : illustration du fonctionnement
  47. 47. JSP : illustration du fonctionnement
  48. 48. JSP : illustration du fonctionnement
  49. 49. JSP: Syntaxe  4 parties d'une JSP  Scriptlets <% %>  Déclarations <%! %>  Expressions <%= %>  Directives <%@directive %>
  50. 50. Scriptlets <% %>  contient du code Java  insérer dans _jspservice() de la servlet, donc peut utiliser out, request, response, … <html> <body> <% String[] langages = {"Java", "C++", "Smalltalk", "Simula 67"}; out.println("<h3>Principaux langages orientés objets : </h3>"); for (int i=0; i < langages.length; i++) { out.println("<p>" + langages[i] + "</p>"); } %> </body> </html>
  51. 51. Expressions <%= ... %>  <%= expr %> génère l'affichage d'une valeur de l'expression expr  expr : expression en Java qui renvoie un objet String ou un type primitif.  raccourci pour <% out.println(expr); %>
  52. 52. Déclarations <%! … %>  Méthodes et variables d'instance  Des méthodes et des variables d'instance peuvent être associées à une JSP entre les directives <%! et %>  Méthodes et variables d’instance de la servlet générée
  53. 53. Déclarations <%! … %>  Méthodes et variables d’instance  Méthode d’instance de la servlet générée à partir de la jsp  Pas d’accès aux objets implicites (out, request, page...) : ce sont des objets définis dans la méthode principale de la servlet (_jspService()) Attention! <%! ... %> : définie une variable d’instance (persiste entre deux invocations) <% ... %> : définie une variable locale à la jsp (réinitialisée à chaque invocation)
  54. 54. Directive <%@directive... %>  Fournit des informations globales relatives à la page <%@ directive attribut="valeur" %>  Trois types de directives:  page : modifier les données de la page (import de packages, spécification d’un type de contenu, gestion des sessions)  Forme générale : <%@ page import="java.io.*, java.sql.*"> <%@ page isErrorPage="false" %> <%@ page contentType="text/html" %>  include : inclure des fichiers ou autres servlets/JSP, C’est comme si le contenu du fichier à inclure était directement copié dans le fichier courant. <%@ include page="/monJSP.jsp" %>  taglib : utiliser des bibliothèques de balises personnalisées <%@ taglib uri="..." prefix="..." %>
  55. 55. Objets implicites  Objets pré-déclarés utilisables dans le code Java des JSPs  out : le flux de sortie pour générer le code HTML  request : la requête qui a provoqué le chargement de la JSP  response : la réponse à la requête de chargement de la JSP  page : l'instance de servlet associée à la JSP courante ( this)  exception : l'exception générée en cas d'erreur sur une page  session : suivi de session pour un même client
  56. 56. Objets implicites
  57. 57. <HTML> <BODY BGCOLOR="#ffffcc"> <CENTER> <% if (request.getParameter("nom")==null && request.getParameter("email")== null) { %> <H2>Information utilisateur</H2> <FORM method="GET" action="/exemple2/web/process.jsp"> <P>Votre nom: <input type="text" name="nom" size=26> <P>Votre email: <input type="text" name="email" size=26> <P><input type="submit" value="Envoyer"> </FORM> <% } else { %> <%! String nom, email; %> <% nom = request.getParameter("nom"); email = request.getParameter("email"); %> <P><B>Vous avez fourni les informations suivantes:</B> <P><B>Name</B>: <%= nom %> <P><B>Email</B>: <%= email %> <% } %> </CENTER> </BODY> </HTML>
  58. 58. Gestion des erreurs  Erreur de syntaxe  Dans le code HTML  Dans les directives JSP (ex. : oubli d'une directive %>)  Dans le code Java (ex : oubli de ;)  Erreur d’ exécution du code Java (ex. : NullPointerException)  Dans tous les cas, erreur récupérée dans le navigateur client  Conserver la page par défaut construite par le moteur  En concevoir une adaptée aux besoins particuliers de l'application  Utilisation des directives :  <%@ page errorPage="..." %> : URL du gestionnaire d’erreurs  <%@ page isErrorPage="..." %> : vrai si page est un
  59. 59. Gestion des erreurs
  60. 60. Gestion des erreurs
  61. 61. Balises de commentaires  2 manières de placer des commentaires dans une page JSP <!-- mon commentaire -->  dans ce cas les commentaires sont transmis à la réponse. Ils sont donc visibles lorsqu'on visualise le code source de la page HTML.  ou <%-- mon commentaire --%>  Le serveur JSP ne les prend pas en compte. Leur intérêt est uniquement de commenter le code JSP
  62. 62. La directive <%@include %> <%@include file="/chemin/relatif/auContexte"%>  Cette inclusion se fait au moment de la conversion, pendant la création de la servlet correspondante.  Le contenu du fichier externe est inclus comme s’il était saisi directement dans la page JSP  Les ressources à inclure doivent être contenues dans le contexte de l'application web
  63. 63. Exemple <%@include %>
  64. 64. TagLib  Un tag JSP est une simple balise XML à laquelle est associée une classe Java.  A la compilation d'une page JSP, ces tags sont remplacés par l'utilisation de ces classes Java qui implémentent une interface particulière. <prefixe:nomDuTag attribut="valeur"> Corps du tag </prefix:nomDuTag>  Un préfixe, qui permet de distinguer les différentes taglibs utilisées.  Le nom du tag de la librairie  un certain nombre de couple d'attribut/valeur  un corps.  Une JSP Taglib est une collection d'actions prédéfinies destinée à être utilisée dans une page JSP sous forme de tags.  Elle se compose:  d'un descripteur de taglib (Tag Librarie Descriptor)
  65. 65. TagLib usuels  jsp:useBean associe une instance d’objet Java Bean  jsp:setProperty positionne la valeur d’une propriété d’un bean  jsp:getProperty récupère la valeur de la propriété d’un bean  jsp:include inclut le contenu du page statique ou dynamique  jsp:invoke invoque l’exécution d’un fragment (JSP, ...)  jsp:forward redirige le traitement de la requête à un autre script  jsp:element insère un élément (XML) dans le document  jsp:attribute attribut d’un élément  jsp:output configure le prélude du document XML  jsp:param paramètre (key/value) pour jsp:forward et jsp:include  jsp:text ajoute le texte à la sortie  jsp:plugin insère un objet externe  jsp:fallback alternative en cas d’échec du jsp:plugin
  66. 66. Le tag <jsp:include>  permet d'inclure le contenu généré par une JSP ou une servlet dynamiquement au moment ou la JSP est exécutée.  Contrairement à la directive <@include page= > avec laquelle le fichier est inséré dans la JSP avant la génération de la servlet.  Syntaxe <jsp:include page= "URL" flush="true" />  L'attribut page permet de préciser l'URL relative de l'élément à insérer.  L'attribut permet d'indiquer si le tampon doit être envoyé au client est vidé avant de l’inclure.  Par défaut : flush = false  Si flush = true : le serveur envoie le tampon de sortie de la page en cours (la partie de la page qui a déjà été traitée) dans le navigateur avant de traiter le fichier inclus.
  67. 67. Le tag <jsp:include>  Agrégation des résultats fournis par plusieurs JSP  Inclusion dynamique (délégation de servlets : deux servlets, l’une appelle l’autre) Fichierinc.jsp
  68. 68. Le modèle de composants Java  Le modèle de composants Java (Java beans) permet de construire une application en assemblant des entités logicielles par programme (ou visuellement)  Ce modèle de composants est décrit par un ensemble d'APIs  Pour fonctionner, ce modèle repose sur un ensemble d'outils formant un environnement dans lequel les composants interagissent  Ce modèle utilise des conteneurs qui fixe un cadre pour la coopération des composants  Dans l'architecture des applications web (3-tiers), les composants métiers sont implantés par des Java beans
  69. 69. Persistance - JavaBean  Un bean est un objet Java  Comme tout objet, il possède un état  Cet état doit être mémorisé pour toute utilisation ultérieure du bean  Tout bean doit donc utiliser un mécanisme de persistance universel défini par leur conteneur  Ils doivent d'implémenter l'interface java.io.Serializable
  70. 70. JavaBean  Les JavaBeans sont des classes Java qui respectent les directives suivantes :  un constructeur public sans argument  les propriétés d'un Bean sont accessibles au travers de méthodes getXXX (lecture) et setXXX (écriture) portant le nom de la propriété  Méthodes de lecture des propriétés :  type getNomDeLaPropriété()  boolean isNomPropriété()  Méthodes d'écriture des propriétés :  void setNomDeLaPropriété(type) : un seul argument du type de la propriété et son type de retour est void  Un JavaBean implémente l'interface java.io.Serializable  permettant la sauvegarde de l'état du Bean
  71. 71. Exemple de JavaBean
  72. 72. Bean et JSP  Un bean est inclus dans une page JSP par la balise : <jsp:useBean>  permet de localiser une instance ou d'instancier un bean pour l'utiliser dans la JSP  Un bean peut encapsuler des traitements complexes et être réutilisable par d'autre JSP ou composants  Après exécution, un bean rend son résultat à la page JSP ou à la servlet  L'utilisation de beans évite l'emploi de la méthode getRequestParameter(...)  La valeur du paramètre d'une requête peut être utilisée directement pour renseigner la propriété d'un bean  Un serveur peut gérer la portée (scope) d'un bean en le liant soit à une page, une requête, une session ou une application
  73. 73. JavaBeans - Syntaxe <jsp:useBean id="nomInstanceJavaBean" class="nomClasseDuBean" scope="request|session|application|page"> </jsp:useBean>  Le bean est alors identifié et accessible par : "nomInstanceJavaBean"  L'attribut scope indique la portée du bean.
  74. 74. JSP et Java Beans
  75. 75. JSP et Java Beans  Récupération des propriétés du bean:  Par appel de méthode getXXX() ou par la balise<jsp:getProperty…>
  76. 76. JSP et Java Beans  Positionner les propriétés du bean dans une JSP  Par appel de méthode setXXX(...) ou par la balise <jsp:setProperty…>
  77. 77. Exemple  La page JSP qui suit affiche le texte : Bonjour suivi de la valeur du paramètre nom de la requête.  La classe HelloBean est stockée dans le répertoire entites.  La propriété nom du bean HelloBean est alimentée par le paramètre de la requête passé dans son en-tête si celui-ci est renseigné  Sinon c'est sa valeur par défaut qui est utilisée  L'exécution de la page JSP provoque l'affichage du texte bonjour suivi du contenu de la propriété nom du bean HelloBean  Intérêt :  pas de code Java dans la page JSP  modularité dans la construction de l'application
  78. 78. Exemple
  79. 79. Exemple
  80. 80. JSP et JavaBeans – Centré page!  La logique de l’application est dans les pages JSP  Mixité de la présentation et la logique métier  L’enchainement des pages est codé dans les pages JSP  Contrôle de flux pris en charge par les JSP memu.jsp catalog.jsp checkout.jsp dataBase page–centric catalog application
  81. 81. Modèle MVC  Le modèle Model-View-Controller a pour objectif d ’organiser une application interactive en séparant :  les données  la représentation des données  le comportement de l’application  Le Model représente la structure des données dans l ’application et les opérations spécifiques sur ces données  Une Vue présente les données sous une certaine forme à l ’utilisateur, suivant un contexte d ’exploitation.  Un Controller traduit les interactions utilisateur par des appels de méthodes (comportement) sur le modèle et sélectionne la vue appropriée basée sur l’état du modèle.
  82. 82. Modèle MVC en JAVA  Controlleur : Servlet  View : JSP  Model : JavaBean
  83. 83. Exemple - MVC : étape 1  Le client récupère un formulaire (index.html)  pour passer une requête avec paramètres (1, 2, puis 3)
  84. 84. index.html
  85. 85. MVC : étape 2 1. Le client envoie son formulaire (GET/POST avec paramètres) 2. Le conteneur transmet au servlet correspondant (le controller)
  86. 86. Controller : SelectPromo.java
  87. 87. Configuration : web.xml
  88. 88. MVC : étape 3 3. La servlet contrôleur interroge le model sur «ing2» 4. Le model retourne au contrôleur le résultat correspondant
  89. 89. Model : Promo.java
  90. 90. MVC : étape 4 5. Le controller utilise les données du model pour sa réponse 6. Le controller transmet sa réponse à la view (JSP)
  91. 91. Controller : SelectPromo.java
  92. 92. MVC : étape 5 7. La JSP (view) traite la réponse transmise par le controller 8. La page HTML résultante est reçue par le client
  93. 93. View : result.jsp
  94. 94. Ex : AREL V6 - liste des promos
  95. 95.  Package javax.servlet.http  HttpServlet gestion des servlet pour recevoir des requêtes et envoyer des réponses  HttpServletRequest interface des requêtes  HttpServletResponse interface des réponses  HttpSession gestion de la session  ServletContext gestion du contexte de l'application  RequestDispatcher lancement de servlet (forward())
  96. 96. 105 public class ServletInit extends HttpServlet { String _login = null; Calendar _initTime = null; public void init() throws ServletException { _login = this.getInitParameter("login"); _initTime = new GregorianCalendar(); } public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { PrintWriter out = res.getWriter(); res.setContentType("text/html"); out.println("<html><head><title>Initialization</title><body><h2>" + "I am the Servlet of <i>" + _login+ "</i><br/>" + "I was initialized at " + _initTime.get(Calendar.HOUR_OF_DAY) + ":"+ _initTime.get(Calendar.MINUTE) + ":"+ _initTime.get(Calendar.SECOND) + "</h2></body></html>"); }} ServletInit.java
  97. 97. 106 Loading a Servlet on Startup  A Servlet is usually loaded when it is first being called  You can set Tomcat to load a specific Servlet on startup in the Servlet declaration inside web.xml <servlet> <servlet-name>InitExample</servlet-name> <servlet-class>ServletInit</servlet-class> <load-on-startup/> </servlet>
  98. 98. 107 Destruction de servlets  Le serveur peut détruire des servlets chargées :  arrêt demandé par l’administrateur (exp, arrêt du serveur)  servlet n’est pas utilisée pour une longue periode  serveur a besoin de ressources libres  Le serveur supprime une servlet seulement si tous les threads sont terminés et une période de grâce est expirée  Avant la suppression, le conteneur appelle la méthode destroy()  Fermer les connexions vers les BDD  ….
  99. 99. Servlet <<Interface>> ServletConfig <<Interface>> + init(…) + getInitParameter(String): String + service(…) + getServletName(): String + destroy() + … GenericServlet {abstraite} + service(...) {abstraite} + ... HttpServlet + service(…) + doXXX (…) Dériver HttpServlet pour construire des Servlets spécifiques au protocole HTTP en redéfinissant doGet, doPost…HelloWorld + doGet(…) HttpServlet définit la méthode service qui appelle doXXX selon la requête HTTP reçue (doGet, doPost…). L’implantation par défaut de doXXX rend une erreur HTTP 405 (méthode non
  100. 100. 109 Thread Synchronization  Multiple threads are accessing the same Servlet object at the same time  Therefore, you have to deal with concurrency  init() and destroy() are guaranteed to be executed only once (before/after all service executions)
  101. 101. What is Java Servlets?  Servlet  module run inside request/response-oriented server Browser Java-enabled Web Server Servlet Database HTML form Server Servlet = Browser Applet Servlets are to Servers what Applets are to Browsers Substitute for CGI scripts easier to write and fast to run Not part of the core Java Framework
  102. 102. Architecture Une servlet peut être appelée par un client alors qu’elle s’exécute déjà pour un autre client. L’objet servlet unique s’exécute alors dans un autre thread. Certaines parties du code doivent être synchronisées avec les techniques prévues en Java pour ce faire.
  103. 103. Développement de l’application web  Sources java + ressources statiques (ex: images) + librairies (.jar) + fichier de déploiement (web.xml)  Création d’une archive .war (Web Application ARchive) à déposer sur le serveur (ex : dans le répertoire webapps de Tomcat) (paquetage)
  104. 104. Servlet & HTTP  Une servlet doit implémenter l’interface javax.servlet.Servlet  soit directement,  soit en dérivant d’une classe implémentant cette interface :  javax.servlet.GenericServlet : une classe abstraite indépendante du protocole  javax.servlet.http.HttpServlet : une classe abstraite spécifique au protocole HTTP
  105. 105. HttpServletRequest HttpSession ServletContext En résumé Niveau de la requête client Niveau de la session client Niveau de l’application web
  106. 106. 115 Sessions And the server knows that all of these requests are from a different client.
  107. 107. HttpServletRequest
  108. 108. HttpServletResponse

×