Les Servlets et JSP Korteby Farouk Cours Java Avancée
Les Servlets et JSP Les Servlets Cycle de vie d'une Servlet Traitement des données de formulaires Gestion de l'état avec cookies et sessions Introduction aux JSP Les balises JSP personnalisées Règles de conception Résume
Les Servlets Korteby Farouk Cours Java Avancée
Les  Servlets : qu'est ce que c'est ? Avec JSP, c'est un des composants logiciels Web de l'architecture J2EE C'est une classe Java compilée  (.class ) qui s'exécute dans un conteneur de Servlets (moteur), hébergé par le serveur Web (côté serveur) Permet d'étendre les fonctionnalités du serveur Web de manière portable et efficace
Les  Servlets : qu'est ce que c'est ? Écrit en Java : technologie indépendante de la plate-forme et du serveur S'apparente aux technologies traditionnelles CGI (PERL) mais : –  plus efficaces –  plus pratiques –  plus puissantes –  portables et gratuites
Les Servlets : à quoi ça sert ? Créer des pages dynamiques (HTML/XML) à ‘la volée’  Effectuer des tâches de type CGI (traitements applicatifs) côté serveur Écrire une application en Java dont l'interface utilisateur (en HTML) se situe dans le Browser, côté client
Les Servlets :comment ça marche ? Le serveur Web associe une ou plusieurs URLs à chaque servlet Lorsque ces URLs sont appelées via une requête HTTP de l'utilisateur, côté client, le conteneur de servlet (moteur) déclenche la servlet qui s'exécute côté serveur La servlet génère une réponse HTML/XML vers le client en utilisant la logique métier d'EJB ou en interrogeant directement la BD (via API JDBC)
Architecture WEB : principe
Architecture Servlets
API Servlet Les classes et les interfaces pour les Servlets sont définies dans 2 packages : –  javax.servlet package générique indépendant des protocoles –  javax.servlet.http spécifique à HTTP permet la gestion des sessions Où les trouver : JSWDK –  java.sun.com/products/servlets
Les classes de l'API 2 classes abstraites : –  javax.servlet.GenericServlet –  javax.servlet.http.HttpServlet qui implémentent 2 interfaces abstraites : –  javax.servlet.Servlet –  javax.servlet.ServletConfig
Les classes de l'API
La classe  GenericServlet javax.servlet.GenericServlet –  définit une servlet indépendante des protocoles –  une classe abstraite qui fournit une implémentation de base de l'interface  Servlet La méthode  service()  est le principal point d'entrée –  c'est une méthode abstraite qui doit être implémentée par une classe dérivée
Structure de base d'une servlet import javax.servlet.*; public class first  extends GenericServlet  { public void  init ( ServletConfig  config) throws ServletException {…} public void  service (  ServletRequest  req, ServletResponse  rep) throws ServletException, IOException {…} public void  destroy () {…} }
Communiquer avec le client 2 arguments pour  service()  : –  javax.servlet.ServletRequest •  encapsule la requête du client •  contient le flot d'entrée dans lequel lire les données en provenance du client –  javax.servlet.ServletResponse •  contient le flot de sortie pour répondre au client
Développer des HttpServlet javax.servlet.http.HttpServlet –  dérive de  GenericServlet  et fournit une implémentation spécifique à HTTP de l'interface  Servlet
La méthode service() de HttpServlet HttpServlet  surcharge la méthode  service() –  lit la méthode HTTP à partir de la requête –  transmet la requête à une méthode appropriée, destinée à la traiter Chaque méthode a une méthode "handler«  associée, définie dans une méthode  HttpServlet:doXXX()
Méthodes de HttpServlet Une servlet est une sous-classe de HttpServlet dans laquelle on surcharge la ou les méthodes doXXX() appropriées : –  requête GET, HEAD : doGet() –  requête POST : doPost() – … public void  doXXX (HttpServletRequest req, HttpServletResponse rep)
Squelette d’une servlet Http import  javax.servlet.*; import  javax.servlet.http.*; public class SimpleServlet  extends HttpServlet  { public void  init(ServletConfig c) throws ServletException {…} public void  doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {…} public void  destroy()  {…} public String  getServletInfo()  {…} }
Développer des HttpServlet javax.servlet.http.HttpServlet –  dérive de  GenericServlet  et fournit une implémentation spécifique à HTTP de l'interface  Servlet
Structure de base public class SimpleServlet  extends HttpServlet  { public void  doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { // Lire la requête du client // La traiter // Répondre } }
Lire la requête du client HttpServletRequest  hérite de  ServletRequest  : –  encapsule la requête HTTP et fournit des méthodes pour accéder à toutes les informations –  contient les informations sur l'environnement du serveur
Les méthodes de HttpServletRequest String getMethod() –  retourne la méthode HTTP String getHeader(String name) –  retourne le paramètre name de l'entête HTTP de la requête String getRemoteHost() –  retourne le nom d'hôte du client String getRemoteAddr() –  retourne l'adresse IP du client
Les méthodes de HttpServletRequest String getParameter(String name) –  retourne la valeur d'un champ de formulaire HTML String getServerName() –  retourne le nom du serveur String getServerPort() –  le port sur lequel le serveur écoute
Répondre au serveur HttpServletResponse  hérite de  ServletResponse  : –  utilisé pour construire un message de réponse HTTP renvoyé au navigateur client –  contient les méthodes nécessaires pour définir : type de contenu, en-tête et code de retour –  contient un flot de sortie pour envoyer des données (HTML ou autre) au navigateur
Les méthodes de HttpServletResponse void setStatus(int statusCode) –  définit le code de retour de la réponse void setHeader(String name,String value) –  définit la valeur de l'en-tête  name void setContentType(String type) –  définit le type de contenu MIME
Les méthodes de HttpServletResponse PrintWriter getWriter() –  pour envoyer des données texte au client ServletOutputStream getOutputStream() –  flot pour envoyer des données binaires void sendRedirect(String url) –  redirige le navigateur vers l'URL
Un exemple simple ... package hall; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println("Hello World"); out.flush(); } }
Cycle de vie d'une Servlet Korteby Farouk Cours Java Avancée
Cycle de vie d'une Servlet Méthodes du cycle de vie La classe javax.servlet.Servlet définit les méthodes qui permettent de contrôler le cycle de vie d'une servlet : –  void init() –  void service() –  void destroy() Elles sont héritées par la servlet et doivent être redéfinies
Cycle de vie d'une Servlet import javax.servlet.*; import javax.servlet.http.*; public class SimpleServlet extends HttpServlet { public void init(ServletConfig c) throws ServletException {…} public void doXXX(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {…} public void destroy() {…} }
Cycle de vie d'une Servlet void init() : –  une fois créée, la servlet est initialisée avec cette méthode : elle n'est appelée qu'une seule fois par le serveur au chargement initial. –  Similaire à un constructeur –  on peut y placer (par exemple) des connexions réseaux ou à une BD
Cycle de vie d'une Servlet void service() : –  appelée automatiquement par le serveur à chaque requête cliente void  void destroy() : –  appelée qu'une seule fois quand la servlet est déchargée par le serveur et lorsque le  serveur est arrêté. –  on y place la fermeture de connexions réseaux ou BD (souvent allouées par  init() )
Cycle de vie d'une Servlet
Servlets et concurrence   - Une seule servlet gère les requêtes de plusieurs clients Un thread est généré à chaque requête du client –  conséquences : les attributs de la servlet sont partagés, les variables des méthodes sont locales  Pour des portions de code critique, utiliser  synchronized
Traitement des données de formulaires  Korteby Farouk Cours Java Avancée
Traitement des données de formulaires Les formulaires HTML: Permettent aux utilisateurs de saisir des données dans une interface graphique dans le Navigateur Mécanisme intégré pour envoyer des données au serveur WEB
Traitement des données de formulaires <FORM> : pour définir un formulaire <INPUT> : pour définir une interface : –  text, password, checkbox, radio, submit, reset <TEXTAREA> : zone de texte sur plusieurs lignes <SELECT> : liste déroulante
Traitement des données de formulaires Envoyer les données du formulaire Attributs de la balise <FORM> –  ACTION : l'URL où envoyer les données –  METHOD : la méthode HTTP (GET / POST) Les données sont envoyées quand l'utilisateur clique sur un bouton de type submit
Traitement des données de formulaires Exemple de formulaire <FORM METHOD=&quot;POST&quot; ACTION=&quot;http://host/servlet/demandeServlet&quot; > Nom : <INPUT type=&quot;text&quot; name=&quot;Nom&quot; /> <BR> <INPUT type=&quot;submit&quot; value=&quot;Envoyer&quot; /> </FORM>
Traitement des données de formulaires Les méthodes GET et POST GET : les champs du formulaire sont ajoutés à  l'URL de l'attribut ACTION sous une forme nom=valeur URL?nom1=val1&nom2=val2&... POST : les données sont passées dans le corps du message HTTP –  convient pour l'envoi de données binaires
Traitement des données de formulaires Lire les données dans une servlet La méthode de HttpServletRequest : public String getParameter(String  name) Dans le formulaire : <INPUT type=&quot;text&quot; name=&quot;nom&quot; /> Dans la méthode doXXX() : String n = req.getParameter(&quot;nom&quot;)
Traitement des données de formulaires public class ShowParameters extends HttpServlet { public void doGet(HttpServletRequest req,...) { out.println(req.getParameter(“param1”)); Enumeration paramNames = req.getParameterNames(); String[] paramValues = req.getParameterValues(paramNames); } }
Gestion de l'état avec cookies et sessions Korteby Farouk Cours Java Avancée
Gestion de l'état avec cookies et sessions HTTP gère les paires requête/réponse –  ouverture, requête, réponse, fermeture HTTP : protocole sans états –  aucun historique des différentes requêtes n'est conservé –  les requêtes sont totalement indépendantes les unes des autres
Gestion de l'état avec cookies et sessions Une application WEB a besoin de savoir : –  quel utilisateur a émis la requête courante –  les requêtes déjà émises par l'utilisateur –  l'état général de l'application : •  nombre de visites, nombres de produits  vendus, –  Il faut rajouter à HTTP un mécanisme de gestion des états
Gestion de l'état avec cookies et sessions Qu'est ce qu'un cookie ? Petit fragment d'information textuelle échangé entre le serveur WEB et le Navigateur –  collection de paires nom/valeur –  chargés dans la mémoire du Navigateur –  les cookies permanents sont aussi sauvegardés dans un fichier texte sur le client –  Ils font partie de l'en-tête HTTP
Gestion de l'état avec cookies et sessions Qu'est ce qu'un cookie ? Crées à l'origine par Netscape –  maintenant RFC 2109 Utilisés couramment pour mémoriser les préférences de l'utilisateur ou même pour l'identifier
Gestion de l'état avec cookies et sessions Anatomie d'un cookie Partie  Description Name  Identité du cookie Value  Valeur du cookie Domain  Nom du domaine qui l'a défini Path  Information sur le chemin Max Age  Temps d'expiration du cookie Secure  Vrai si cookie transmis avec SSL
Gestion de l'état avec cookies et sessions Cookie et sécurité ? Jamais interprété ou exécuté : pas de virus Un cookie est limité à 4KB et les navigateurs se limitent à 300 cookies (20 par site) : pas de surcharge de disque Bien pour rendre privées des données non sensibles –  nom, adresse, … mais pas No CB ! …  mais ne constitue pas un traitement sérieux de la sécurité
Gestion de l'état avec cookies et sessions Depuis API 2.1, pris en charge par : javax.servlet.http.Cookie Cette classe construit des cookies avec des  paires nom/valeur : public Cookie( String name,  String value)
Gestion de l'état avec cookies et sessions Méthodes de Cookie: Pour les fixer des attributs supplémentaires void setValue(String val) définit la valeur du cookie void setMaxAge(int expSec) l’age de la cookie en nombre de secondes par défaut  – 1 (expire quand on ferme le navigateur) 0 supprime le cookie
Gestion de l'état avec cookies et sessions Méthodes de Cookie (suite) void setPath(String path) définit le chemin void setSecure(boolean flag) true si SSL, false par défaut void setDomain(String domaine) définit le domaine
Gestion de l'état avec cookies et sessions Envoi des cookies Méthode addCookie() de la classe  HttpServletResponse public void  doGet(HttpServletRequest req, HttpServletResponse rep) { Cookie c = new Cookie (&quot;nom&quot;, &quot;toto&quot;); c.setMaxAge(365*24*60*60); // 1 an rep.addCookie( c ); rep.setContentType(&quot;text/html&quot;); … }
Gestion de l'état avec cookies et sessions Lecture des cookies Le navigateur envoie automatiquement les cookies qui correspondent à domain et path Une servlet peut récupérer les cookies envoyés précédemment au navigateur –  méthode getCookies() de  HttpServletRequest
Gestion de l'état avec cookies et sessions Lecture des cookies Cookie [ ] cookies = request.getCookies(); String nom = getCookieValue(cookies, &quot;nom&quot;, &quot;non trouvé&quot;); ... public static String getCookieValue( Cookie [] cookies, String cookieName,  String defaultValue) { for(int i=0; i < cookies.length; i++) { Cookie cookie = cookies[i]; if(cookieName.equals(cookie.getName()) return(cookie.getValue()); } return(defaultValue); }
Gestion de l'état avec cookies et sessions Les sessions Une session peut se définir : –  une série d'interactions reliées entre un navigateur et un serveur WEB –  englobe plusieurs requêtes HTTP sur une période donnée –  Utilisées pour mémoriser les actions (requêtes HTTP) d'un utilisateur unique au cours du temps –  exple : opérations bancaires
Gestion de l'état avec cookies et sessions Techniques de mémorisation Pour échanger les données d'identification de la session dans chaque requête : –  réécriture d'URL –  champ de formulaire caché (&quot;hidden&quot;) –  cookies –  utilisation des sessions avec les HttpSession
Gestion de l'état avec cookies et sessions Réécriture d'URL Principe : –  ajouter dans la chaîne de requête de la servlet des informations supplémentaires identifiant la session <a href=&quot;http://leo.inria.fr/servlet/foo?uid=itey&quot;> Ac heter</a> –  l'ID utilisateur est transmis en même temps que la requête; il est accédé par chaque servlet mentionnée qui récupère les informations persistantes (BD, fichiers) à partir de cet ID
Gestion de l'état avec cookies et sessions Réécriture d'URL Limitations : –  données volumineuses, –  caractères autorisés, –  longueur URL, –  données visibles (sécurité)
Gestion de l'état avec cookies et sessions Champs de formulaires cachés Principe : –  on cache les données de session dans des  champs &quot;hidden&quot; : <INPUT TYPE=&quot;HIDDEN&quot; NAME=&quot;uid“  VALUE=itey&quot;> Limitations : –  idem la &quot;réécriture d'URL&quot; sauf pour la sécurité (utilisation de POST)
Gestion de l'état avec cookies et sessions L'interface HttpSession Les objets HttpSession mémorisent les données de chaque utilisateur  fonctionne comme une table de &quot;hachage&quot; stockée sur le serveur A chaque ID de session est associé, via la table de hachage, l'ensemble des informations
Gestion de l'état avec cookies et sessions Identification des sessions 2 façons possibles d'échanger l'ID de session : –  par défaut : les cookies (de session : non permanents) –  ajouter l'ID de session à l'URL (réécriture d'URL) L'implémentation est dépendante du moteur de Servlets
Gestion de l'état avec cookies et sessions Obtenir l'objet de session 2 méthodes de HttpServletRequest : –  HttpSession getSession() : retourne la session courante, si elle n'existe pas, elle est créée –  HttpSession getSession(boolean  create) : idem sauf que la session n'est créée que si create = true, sinon retourne null
Gestion de l'état avec cookies et sessions Mémoriser et extraire les données Une fois la session obtenue, on peut mémoriser et extraire les données grâce aux  méthodes de HttpSession : void putValue(String name,  Object Val) Object getValue(String name)
Gestion de l'état avec cookies et sessions Mémoriser et extraire les données HttpSession session =  request.getSession(); session.putValue( &quot;table&quot;,  newArrayList()); ArrayList tab = (ArrayList)session.getValue(&quot;table&quot;);
Gestion de l'état avec cookies et sessions Autres méthodes de HttpSession boolean isNew() : retourne true si nouvelle session void invalidate() : invalide la session et supprime les associations nom / valeur
Gestion de l'état avec cookies et sessions Autres méthodes de HttpSession Les moteurs de servlets gèrent un timeout de durée de vie des sessions : int getMaxInactiveInterval() : retourne l'intervalle maximal d'inactivité en secondes void setMaxInactiveInterval : définit l'intervalle maximal d'inactivité en secondes
Gestion de l'état avec cookies et sessions Autres méthodes de HttpRequest String getRequestedSessionId() : retourne l'ID de session boolean  isRequestedSessionIdFromCookie() retourne true si l'ID de session a été passé dans un cookie boolean  isRequestedSessionIdFromURL() retourne true si l'ID des session a été passé dans l'URL
Gestion de l'état avec cookies et sessions Utiliser HttpSession sans cookies L'implémentation par défaut de HttpSession utilise les cookies –  si les cookies ne sont pas autorisés par le navigateur, la mémorisation des sessions ne fonctionne pas Autre solution : la réécriture d'URL –  ajouter l'ID de session à la fin de l'URL –  la réécriture d'URL doit être activée sur le  serveur
Gestion de l'état avec cookies et sessions Réécriture d'URL Méthodes de HttpServletRequest : String encodeURL(String url) encode l'URL en ajoutant l'ID de session si les cookies sont désactivés String encodeRedirectURL(String url) encode l'URL avant de rediriger le Navigateur
Introduction aux JSP   Korteby Farouk Cours Java Avancée
Introduction aux JSP JSP : Java Server Page La plupart des applications Web produisent des pages HTML dynamiquement en modifiant uniquement les champs de données et pas la structure de base de la page. Les JSP sont la technologie la plus appropriée pour ce type de contenu.
Introduction aux JSP Une page JSP contient un modèle de document statique et des balises spécifiques pour inclure du texte ou exécuter une partie de la logique applicative. Le contenu statique est servi comme du HTML normal.
Introduction aux JSP Une JSP est un fichier texte ( .jsp ) contenant du code HTML et des fragments de code Java contenus dans des balises spécifiques, exécutés sur le serveur WEB Versions 1.0 et maintenant 1.2 En fait, le fichier JSP est traduit en servlet qui est compilée, puis instanciée lors de son invocation via une URL
Introduction aux JSP
Introduction aux JSP Les balises JSP 3 types : –  des directives : instructions qui contrôlent le comportement du compilateur de pages JSP, et qui sont donc évaluées avant la compilation, –  des éléments de scripts (scriptlets) : blocs d’instructions Java inclus dans la page JSP entre des délimiteurs <% et %>.
Introduction aux JSP Les balises JSP (suite) –  des balises personnalisées (custom tags ou custom actions):  elles sont définies par le  programmeur et génèrent du contenu dynamique lorsque la page est demandée.
Introduction aux JSP Un exemple simple de JSP <html><head><title>Un exemple de page JSP</title></head><body> <!-- définit les informations globales a la page --> <%@page language=&quot;java&quot; %> <!-- Déclare la variable c --> <%! char c = 0; %> <!-- Scriplet (code java) %> <%  for(int i = 0; i < 26; i++){ for(int j = 0; j < 26; j++){ c = (char)(0x41 + (26 - i + j)%26); %> <%= c %> <%  } %> <br> <% } %> </body></html>
Introduction aux JSP
Introduction aux JSP Les scriptlets : <% … %> Contient du code JAVA –  tout code JAVA valide –  Objet out pour produire de la sortie HTML, objets request et response Se transforme dans la méthode jspService() de la servlet: –  les variables sont locales à la méthode –  les blocs de code s'insèrent dans la servlet
Introduction aux JSP Les scriptlets : exemple <% String[ ] noms = {&quot;titi&quot;, &quot;toto&quot;}; for(int i = 0; i < noms.length; i++){ out.println(noms[i]); } %>
Introduction aux JSP Les expressions : <%= … %> Pour évaluer une expression ou un objet Java et renvoyer sa valeur : –  retourne une version String de l'expression –  raccourci pour <% out.println(…); %> Se transforme en out.println(…) dans la méthode jspService(…) de la servlet
Introduction aux JSP <% String[ ] noms = {&quot;titi&quot;, &quot;toto&quot;}; for(int i = 0; i < noms.length; i++){ %> Le nom <%= i %> ième nom est <%= noms[i] %> <% } %>
Introduction aux JSP Les déclarations : <%! … %> Pour déclarer des méthodes à l'échelle de la page (méthodes de la servlet générée) –  les méthodes ne sont exécutées que si elles sont appelées explicitement –  on peut aussi déclarer des attributs Se transforme en déclarations de champs et méthodes au niveau de la servlet
Introduction aux JSP <%! private int accessCount = 0; private int incrementCount() { return  accessCount++; } %> … <H2>Nombre et liste des articles</H2> Nombre d'articles : <%= incrementCount() %>
Introduction aux JSP Directives <%@ directive attribut1=&quot;valeur&quot; attribut2=&quot;valeur&quot;... %> 2 directives possibles (jsp1.1) : –  page : informations relatives à la page –  include : fichiers à inclure littéralement
Introduction aux JSP Valeurs possibles : –  <%@  page  language=&quot;java&quot; –  <%@  page  import=&quot;java.util.*, java.net.*&quot; %> –  <%@  page  contentType=&quot;text/plain&quot; %> –  <%@  page  session=&quot;true|false &quot; %> –  <%@  page  errorPage=&quot;pathToErrorPage&quot; %> –  <%@  page  isErrorPage=&quot;true|false&quot; %> –  <%@  page  …
Introduction aux JSP La directive : <%@include … %> Valeurs possibles : –  <%@ include file=&quot;chemin relatif du fichier&quot; %> –  pour se référer au home dir du serveur Web : <%@ include file=&quot;/toto.html&quot; %>Interprété littéralement, le fichier peut être –  HTML, scripting elements, directives, actions, ... L'insertion se fait au moment de la traduction de la page...
Introduction aux JSP Variables prédéfinies Ou &quot;objets implicites&quot;, ils sont accessibles dans les balises JSP : –  request : le HttpServletRequest –  response : le HttpServletResponse –  session : le HttpSession –  out : flot de sortie (idem response.getWriter()) –  application : le ServletContext (idem getServletConfig().getContext() ) –  config, pageContext, page... : peu utiles
Introduction aux JSP Cookies et Sessions fonctionnent de la même façon que dans l'API Servlet  Cookie : <% Cookie c = new Cookie(&quot;Sport&quot;, &quot;Foot&quot;); response.addCookie(c); %>
Introduction aux JSP Gestion des sessions avec les JSP Sessions : –  toutes les pages JSP disposent automatiquement d'un objet session <% String val =  (String)session.getValue(&quot;Sport&quot;); %>
Balises JSP personnalisées Korteby Farouk Cours Java Avancée
Balises JSP personnalisées La technologie JSP permet au programmeur de définir leurs propres bibliothèques de balises; ce type de balises est remplacé par du contenu dynamique lorsque la page est envoyée au client. Le contenu dynamique est crée par un gestionnaire de balises, que le programmeur crée et distribue dans un fichier archive de Bibliothèque  de balises.
Balises JSP personnalisées Le programmeur définit la syntaxe pour chaque balise et implémente le comportement à effectuer pour chaque balise dans la classe de gestion des  balises (tag handler class). Les auteurs de pages peuvent ensuite importer et utiliser les balises définies dans les bibliothèques de balises comme s'ils utilisaient des balises traditionnelles.
Balises JSP personnalisées Les balises personnalisées : –  sont réutilisables –  permettent de définir des services de haut niveau et sont portables –  facilitent la maintenance d'une application pas de répétition du code de pages en pages Modification du code en un seul endroit
Balises JSP personnalisées –  facilitent la lecture et la manipulation des pages plus simples à lire que des bouts de scripts –  fournissent un moyen simple pour utiliser la logique métier –  permettent une séparation claire entre présentation des données et logique métier maintenance plus simple montre plus clairement l'utilité de chaque composant permet aux programmeurs et auteurs de pages de travailler plus indépendamment
Balises JSP personnalisées Les bibliothèques de balises standards sont des jeux de balises qui fournissent un jeu de fonctionnalités basiques pour les pages JSP : –  inclusion de ressources Web, chaînage de requête (request forwarding), –  logique conditionnelle, –  itérations sur des collections d'objets, –  transformations XSLT, –  internationalisation, –  gestion des informations d'état, –  formulaires HTML.
Balises JSP personnalisées Certaines sociétés ont produit leurs propres bibliothèques de balises, profondément intégrées dans leurs outils de développement et J2EE. D'autres organisations produisent des bibliothèques de balises génériques pour les applications J2EE. Exemple : Apache Taglibs (bibliothèque Open source de balises personnalisées).
Balises JSP personnalisées Les librairies standards fournissent souvent la plupart des fonctionnalités requises pour le développement de pages JSP et sont testées et optimisées par la communauté des développeurs. Utiliser une librairie de balises standards de haute qualité permet ainsi de gagner un précieux temps en développement.
Règles de conception   Korteby Farouk Cours Java Avancée
Règles de conception Quand utiliser des servlets ? Elles sont la plupart du temps utilisées pour : –  implémenter la logique de l'application –  générer des données binaires –  implémenter des services Les servlets ne sont pas habituellement des composants visuels, à l'exception de certaines qui  génèrent du contenu binaire. Elles sont surtout utilisées comme un service d'accès aux informations de l'application.
Règles de conception Une servlet peut ainsi rendre n'importe quel service (application de modèles, sécurité, personnalisation, contrôle de l'application) et ensuite choisir un composant de présentation (souvent une page JSP) pour lui transmettre la requête et s'occuper de sa présentation. Comme elle peut être assimilée à un service, un filtre de servlets peut être assimilé à une extension ou une personnalisation du service fourni par la servlet.
Règles de conception Les servlets sont la technologie de prédilection pour implémenter un contrôleur sur le tiers Web,  qui déterminera comment traiter une requête et  choisira la prochaine vue à afficher. Un contrôleur active les opérations d'une application et prend des décisions, qui sont essentiellement des tâches procédurales bien adaptées à l'intégration dans le code d'une servlet.
Règles de conception Les pages JSP ne doivent pas être utilisées comme contrôleur car si l'on mélange les balises  et le code du programme, elles deviennent  difficiles à lire et à maintenir, particulièrement pour les concepteurs Web, qui ne sont pas des programmeurs.
Règles de conception Les pages JSP sont habituellement utilisées pour créer du contenu structuré ou des données textuelles non-structurées. Elles sont particulièrement adaptées lorsque la valeur des données change entre les requêtes mais que leur structuration ne change pas (ou peu).
Règles de conception Utiliser les JSP pour la présentation des données Les vues pour visualiser les données d'une application d'entreprise sont traditionnellement en  HTML, XHTML et DHTML. Les pages JSP sont utilisées lorsque le contenu est partiellement statique, avec quelques éléments remplis dynamiquement à l'exécution.
Règles de conception Utiliser les JSP pour la présentation des données (suite) Une page JSP contient une partie fixe appelée &quot;template data&quot; (à ne pas confondre avec les mécanismes de modèles décrits par la suite). Les balises personnalisées ou les éléments de script peuvent être placés à divers endroits des données statiques et sont substitués à l'exécution par du contenu dynamique.
Règles de conception Utiliser les JSP pour la présentation des données (suite) Les pages JSP ne peuvent pas produire de contenu binaire et ne sont pas très adaptées à la production de contenu à grande variabilité ou à la  direction de requêtes, on préférera utiliser des  servlets dans ce cas. Les pages JSP peuvent accéder facilement à la logique métier d'une application, en incluant des beans par exemple.
Règles de conception Le patron de conception M-V-C Le patron de conception (Design pattern) Modèle-Vue-Contrôleur est recommandé car il permet de créer des applications réutilisables, et d’ajouter de nouveaux types de clients, processus et vues facilement. Le modèle de conception le plus simple a un seul contrôleur qui reçoit les requêtes des navigateurs, les distribue dans l’application et affiche les  résultats.
Règles de conception Le modèle MVC avec Servlet et JSP Utilisation conjointe des servlets et JSP : –  JSP fournit la vue –  les servlets contrôlent et dispatchent –  les composants servent à accéder aux données du modèle
Résumé Korteby Farouk Cours Java Avancée
Résumé Résumé (1/4) Le serveur Web d’une application J2EE rend disponible les applications sur le Web Les pages JSP et servlets sont des composants Web qui succèdent aux anciennes technologies côté serveur telles que les CGIs et qui assurent la portabilité.
Résumé Résumé (2/4) Le conteneur Web fournit des services de haut niveau aux composants Web en matière de : –  transactions, –  accès aux données, –  gestion des états, –  sécurité et distribution.
Résumé Résumé (3/4) Le serveur Web d’une application est une couche de service neutre, habituellement conçu sur le modèle MVC, qui simplifie la création d’applications Web interactives. Les servlets sont principalement utilisées pour générer des données binaires et contrôler l’application (modèle Servlet Dispatcher) Les pages JSP sont principalement utilisées pour créer du contenu textuel et des références à des données externes.
Résumé Résumé (4/4) Pour les JSP, l’utilisation de bibliothèques de balises personnalisées améliore la qualité du code  source et facilite la maintenance des applications  J2EE.
Ateliers Korteby Farouk Cours Java Avancée
Ateliers l'indispensable JDK  de SUN : Il contient un compilateur, un interpréteur, les classes de base, et d'autres outils.  Un Éditeur java :  NetBeans IDE 5.0 Des Neurones frenchs qui tournent
Ateliers Exemple 1: une simple Servlet public class GreetingServlet  extends HttpServlet {}
Ateliers
Ateliers
Ateliers
Ateliers
Ateliers
Ateliers <form action=&quot;GreetingServlet&quot; method=&quot;POST&quot;> First Name:  <input type=&quot;text&quot; name=&quot;firstName&quot; size=&quot;20&quot;> <br /> Surname:  <input type=&quot;text&quot; name=&quot;surname&quot; size=&quot;20&quot;> <br /><br /> <input type=&quot;submit&quot; value=&quot;Submit&quot;> </form>
Ateliers
Ateliers
Ateliers
Ateliers
Ateliers
Ateliers
Ateliers protected void  doPost(HttpServletRequest request, HttpServletResponse response) throws  ServletException, IOException {   String firstName = request.getParameter(&quot;firstName&quot;).toString();          System.out.println(&quot;firstName = &quot; + firstName);          processRequest(request, response);     }
Ateliers
Ateliers
Ateliers
Ateliers Dans processRequest(…) response.setContentType(&quot;text/html;charset=UTF-8&quot;); PrintWriter out = response.getWriter(); String firstName = request.getParameter(&quot;firstName&quot;).toString(); String surname = request.getParameter(&quot;surname&quot;).toString(); out.println(&quot;<h1>Servlet GreetingServlet at &quot; +  request.getContextPath () + &quot;</h1>&quot;); out.println(&quot;<p>Welcome &quot; + firstName + &quot; &quot; +  surname + &quot;</p>&quot;); out.close();
Ateliers Exemple 2: une simple Page JSP <%@ page language=&quot;Java&quot; import=&quot;java.util.*&quot; %> <H1 Align=&quot;center&quot;>Time is :  <%= new Date() %></H1> <% for(int i=1; i<=6; i++) { %> <H<%= i %> align=&quot;center&quot;>Heading <%= i %> </H<%= i %>> <% } %>
Ateliers Exemple 3: Get avec une Page JSP Index.html <form method=&quot;GET&quot; action=&quot;index.jsp&quot;>  Enter Social Security Number:  <input type=&quot;text&quot; name=&quot;ssn&quot;/>  Enter Bonus Multiplier: <input type=&quot;text&quot; name=&quot;multiplier&quot;/>  <input type=&quot;submit&quot; value=&quot;Submit&quot;/>  <input type=&quot;reset&quot;/>  </form>
Ateliers Index.jsp <%! String strMult, ssn; %> <%! Integer integerMult; %> <%! int multiplier=0; %> <%! double bonus; %> <%! double inputBonus; %> <%! public double calculateBonus(int multiplier, double bonus) { double calculatedBonus = (multiplier * bonus); return calculatedBonus; } %>
Ateliers Index.jsp <% strMult = request.getParameter(&quot;multiplier&quot;); ssn = request.getParameter(&quot;ssn&quot;); integerMult = new Integer(strMult); multiplier = integerMult.intValue(); inputBonus = 100.00; bonus = this.calculateBonus(multiplier, inputBonus); %> <P>Social Security Number : <%= ssn %> <P> <P>Multiplier : <%= multiplier %> <P> <P>Bonus Amount retrieved: <%= bonus %> <P>
Ateliers
Merci de votre Attention By Korteby Farouk Cours Java Avancée  -Servlets & JSP-
Pour informations Complémentaires vous pouvez consultez: http://java.developpez.com/cours/servlets/ Tutorial J2EE : les Servlets http:// java.sun.com /docs/books/tutorial/ le site officiel de SUN By Korteby Farouk Cours Java Avancée -Applets-

Les Servlets et JSP

  • 1.
    Les Servlets etJSP Korteby Farouk Cours Java Avancée
  • 2.
    Les Servlets etJSP Les Servlets Cycle de vie d'une Servlet Traitement des données de formulaires Gestion de l'état avec cookies et sessions Introduction aux JSP Les balises JSP personnalisées Règles de conception Résume
  • 3.
    Les Servlets KortebyFarouk Cours Java Avancée
  • 4.
    Les Servlets: qu'est ce que c'est ? Avec JSP, c'est un des composants logiciels Web de l'architecture J2EE C'est une classe Java compilée (.class ) qui s'exécute dans un conteneur de Servlets (moteur), hébergé par le serveur Web (côté serveur) Permet d'étendre les fonctionnalités du serveur Web de manière portable et efficace
  • 5.
    Les Servlets: qu'est ce que c'est ? Écrit en Java : technologie indépendante de la plate-forme et du serveur S'apparente aux technologies traditionnelles CGI (PERL) mais : – plus efficaces – plus pratiques – plus puissantes – portables et gratuites
  • 6.
    Les Servlets :à quoi ça sert ? Créer des pages dynamiques (HTML/XML) à ‘la volée’ Effectuer des tâches de type CGI (traitements applicatifs) côté serveur Écrire une application en Java dont l'interface utilisateur (en HTML) se situe dans le Browser, côté client
  • 7.
    Les Servlets :commentça marche ? Le serveur Web associe une ou plusieurs URLs à chaque servlet Lorsque ces URLs sont appelées via une requête HTTP de l'utilisateur, côté client, le conteneur de servlet (moteur) déclenche la servlet qui s'exécute côté serveur La servlet génère une réponse HTML/XML vers le client en utilisant la logique métier d'EJB ou en interrogeant directement la BD (via API JDBC)
  • 8.
  • 9.
  • 10.
    API Servlet Lesclasses et les interfaces pour les Servlets sont définies dans 2 packages : – javax.servlet package générique indépendant des protocoles – javax.servlet.http spécifique à HTTP permet la gestion des sessions Où les trouver : JSWDK – java.sun.com/products/servlets
  • 11.
    Les classes del'API 2 classes abstraites : – javax.servlet.GenericServlet – javax.servlet.http.HttpServlet qui implémentent 2 interfaces abstraites : – javax.servlet.Servlet – javax.servlet.ServletConfig
  • 12.
  • 13.
    La classe GenericServlet javax.servlet.GenericServlet – définit une servlet indépendante des protocoles – une classe abstraite qui fournit une implémentation de base de l'interface Servlet La méthode service() est le principal point d'entrée – c'est une méthode abstraite qui doit être implémentée par une classe dérivée
  • 14.
    Structure de based'une servlet import javax.servlet.*; public class first extends GenericServlet { public void init ( ServletConfig config) throws ServletException {…} public void service ( ServletRequest req, ServletResponse rep) throws ServletException, IOException {…} public void destroy () {…} }
  • 15.
    Communiquer avec leclient 2 arguments pour service() : – javax.servlet.ServletRequest • encapsule la requête du client • contient le flot d'entrée dans lequel lire les données en provenance du client – javax.servlet.ServletResponse • contient le flot de sortie pour répondre au client
  • 16.
    Développer des HttpServletjavax.servlet.http.HttpServlet – dérive de GenericServlet et fournit une implémentation spécifique à HTTP de l'interface Servlet
  • 17.
    La méthode service()de HttpServlet HttpServlet surcharge la méthode service() – lit la méthode HTTP à partir de la requête – transmet la requête à une méthode appropriée, destinée à la traiter Chaque méthode a une méthode &quot;handler« associée, définie dans une méthode HttpServlet:doXXX()
  • 18.
    Méthodes de HttpServletUne servlet est une sous-classe de HttpServlet dans laquelle on surcharge la ou les méthodes doXXX() appropriées : – requête GET, HEAD : doGet() – requête POST : doPost() – … public void doXXX (HttpServletRequest req, HttpServletResponse rep)
  • 19.
    Squelette d’une servletHttp import javax.servlet.*; import javax.servlet.http.*; public class SimpleServlet extends HttpServlet { public void init(ServletConfig c) throws ServletException {…} public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {…} public void destroy() {…} public String getServletInfo() {…} }
  • 20.
    Développer des HttpServletjavax.servlet.http.HttpServlet – dérive de GenericServlet et fournit une implémentation spécifique à HTTP de l'interface Servlet
  • 21.
    Structure de basepublic class SimpleServlet extends HttpServlet { public void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { // Lire la requête du client // La traiter // Répondre } }
  • 22.
    Lire la requêtedu client HttpServletRequest hérite de ServletRequest : – encapsule la requête HTTP et fournit des méthodes pour accéder à toutes les informations – contient les informations sur l'environnement du serveur
  • 23.
    Les méthodes deHttpServletRequest String getMethod() – retourne la méthode HTTP String getHeader(String name) – retourne le paramètre name de l'entête HTTP de la requête String getRemoteHost() – retourne le nom d'hôte du client String getRemoteAddr() – retourne l'adresse IP du client
  • 24.
    Les méthodes deHttpServletRequest String getParameter(String name) – retourne la valeur d'un champ de formulaire HTML String getServerName() – retourne le nom du serveur String getServerPort() – le port sur lequel le serveur écoute
  • 25.
    Répondre au serveurHttpServletResponse hérite de ServletResponse : – utilisé pour construire un message de réponse HTTP renvoyé au navigateur client – contient les méthodes nécessaires pour définir : type de contenu, en-tête et code de retour – contient un flot de sortie pour envoyer des données (HTML ou autre) au navigateur
  • 26.
    Les méthodes deHttpServletResponse void setStatus(int statusCode) – définit le code de retour de la réponse void setHeader(String name,String value) – définit la valeur de l'en-tête name void setContentType(String type) – définit le type de contenu MIME
  • 27.
    Les méthodes deHttpServletResponse PrintWriter getWriter() – pour envoyer des données texte au client ServletOutputStream getOutputStream() – flot pour envoyer des données binaires void sendRedirect(String url) – redirige le navigateur vers l'URL
  • 28.
    Un exemple simple... package hall; import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class HelloWorld extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); out.println(&quot;Hello World&quot;); out.flush(); } }
  • 29.
    Cycle de vied'une Servlet Korteby Farouk Cours Java Avancée
  • 30.
    Cycle de vied'une Servlet Méthodes du cycle de vie La classe javax.servlet.Servlet définit les méthodes qui permettent de contrôler le cycle de vie d'une servlet : – void init() – void service() – void destroy() Elles sont héritées par la servlet et doivent être redéfinies
  • 31.
    Cycle de vied'une Servlet import javax.servlet.*; import javax.servlet.http.*; public class SimpleServlet extends HttpServlet { public void init(ServletConfig c) throws ServletException {…} public void doXXX(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException {…} public void destroy() {…} }
  • 32.
    Cycle de vied'une Servlet void init() : – une fois créée, la servlet est initialisée avec cette méthode : elle n'est appelée qu'une seule fois par le serveur au chargement initial. – Similaire à un constructeur – on peut y placer (par exemple) des connexions réseaux ou à une BD
  • 33.
    Cycle de vied'une Servlet void service() : – appelée automatiquement par le serveur à chaque requête cliente void void destroy() : – appelée qu'une seule fois quand la servlet est déchargée par le serveur et lorsque le serveur est arrêté. – on y place la fermeture de connexions réseaux ou BD (souvent allouées par init() )
  • 34.
    Cycle de vied'une Servlet
  • 35.
    Servlets et concurrence - Une seule servlet gère les requêtes de plusieurs clients Un thread est généré à chaque requête du client – conséquences : les attributs de la servlet sont partagés, les variables des méthodes sont locales Pour des portions de code critique, utiliser synchronized
  • 36.
    Traitement des donnéesde formulaires Korteby Farouk Cours Java Avancée
  • 37.
    Traitement des donnéesde formulaires Les formulaires HTML: Permettent aux utilisateurs de saisir des données dans une interface graphique dans le Navigateur Mécanisme intégré pour envoyer des données au serveur WEB
  • 38.
    Traitement des donnéesde formulaires <FORM> : pour définir un formulaire <INPUT> : pour définir une interface : – text, password, checkbox, radio, submit, reset <TEXTAREA> : zone de texte sur plusieurs lignes <SELECT> : liste déroulante
  • 39.
    Traitement des donnéesde formulaires Envoyer les données du formulaire Attributs de la balise <FORM> – ACTION : l'URL où envoyer les données – METHOD : la méthode HTTP (GET / POST) Les données sont envoyées quand l'utilisateur clique sur un bouton de type submit
  • 40.
    Traitement des donnéesde formulaires Exemple de formulaire <FORM METHOD=&quot;POST&quot; ACTION=&quot;http://host/servlet/demandeServlet&quot; > Nom : <INPUT type=&quot;text&quot; name=&quot;Nom&quot; /> <BR> <INPUT type=&quot;submit&quot; value=&quot;Envoyer&quot; /> </FORM>
  • 41.
    Traitement des donnéesde formulaires Les méthodes GET et POST GET : les champs du formulaire sont ajoutés à l'URL de l'attribut ACTION sous une forme nom=valeur URL?nom1=val1&nom2=val2&... POST : les données sont passées dans le corps du message HTTP – convient pour l'envoi de données binaires
  • 42.
    Traitement des donnéesde formulaires Lire les données dans une servlet La méthode de HttpServletRequest : public String getParameter(String name) Dans le formulaire : <INPUT type=&quot;text&quot; name=&quot;nom&quot; /> Dans la méthode doXXX() : String n = req.getParameter(&quot;nom&quot;)
  • 43.
    Traitement des donnéesde formulaires public class ShowParameters extends HttpServlet { public void doGet(HttpServletRequest req,...) { out.println(req.getParameter(“param1”)); Enumeration paramNames = req.getParameterNames(); String[] paramValues = req.getParameterValues(paramNames); } }
  • 44.
    Gestion de l'étatavec cookies et sessions Korteby Farouk Cours Java Avancée
  • 45.
    Gestion de l'étatavec cookies et sessions HTTP gère les paires requête/réponse – ouverture, requête, réponse, fermeture HTTP : protocole sans états – aucun historique des différentes requêtes n'est conservé – les requêtes sont totalement indépendantes les unes des autres
  • 46.
    Gestion de l'étatavec cookies et sessions Une application WEB a besoin de savoir : – quel utilisateur a émis la requête courante – les requêtes déjà émises par l'utilisateur – l'état général de l'application : • nombre de visites, nombres de produits vendus, – Il faut rajouter à HTTP un mécanisme de gestion des états
  • 47.
    Gestion de l'étatavec cookies et sessions Qu'est ce qu'un cookie ? Petit fragment d'information textuelle échangé entre le serveur WEB et le Navigateur – collection de paires nom/valeur – chargés dans la mémoire du Navigateur – les cookies permanents sont aussi sauvegardés dans un fichier texte sur le client – Ils font partie de l'en-tête HTTP
  • 48.
    Gestion de l'étatavec cookies et sessions Qu'est ce qu'un cookie ? Crées à l'origine par Netscape – maintenant RFC 2109 Utilisés couramment pour mémoriser les préférences de l'utilisateur ou même pour l'identifier
  • 49.
    Gestion de l'étatavec cookies et sessions Anatomie d'un cookie Partie Description Name Identité du cookie Value Valeur du cookie Domain Nom du domaine qui l'a défini Path Information sur le chemin Max Age Temps d'expiration du cookie Secure Vrai si cookie transmis avec SSL
  • 50.
    Gestion de l'étatavec cookies et sessions Cookie et sécurité ? Jamais interprété ou exécuté : pas de virus Un cookie est limité à 4KB et les navigateurs se limitent à 300 cookies (20 par site) : pas de surcharge de disque Bien pour rendre privées des données non sensibles – nom, adresse, … mais pas No CB ! … mais ne constitue pas un traitement sérieux de la sécurité
  • 51.
    Gestion de l'étatavec cookies et sessions Depuis API 2.1, pris en charge par : javax.servlet.http.Cookie Cette classe construit des cookies avec des paires nom/valeur : public Cookie( String name, String value)
  • 52.
    Gestion de l'étatavec cookies et sessions Méthodes de Cookie: Pour les fixer des attributs supplémentaires void setValue(String val) définit la valeur du cookie void setMaxAge(int expSec) l’age de la cookie en nombre de secondes par défaut – 1 (expire quand on ferme le navigateur) 0 supprime le cookie
  • 53.
    Gestion de l'étatavec cookies et sessions Méthodes de Cookie (suite) void setPath(String path) définit le chemin void setSecure(boolean flag) true si SSL, false par défaut void setDomain(String domaine) définit le domaine
  • 54.
    Gestion de l'étatavec cookies et sessions Envoi des cookies Méthode addCookie() de la classe HttpServletResponse public void doGet(HttpServletRequest req, HttpServletResponse rep) { Cookie c = new Cookie (&quot;nom&quot;, &quot;toto&quot;); c.setMaxAge(365*24*60*60); // 1 an rep.addCookie( c ); rep.setContentType(&quot;text/html&quot;); … }
  • 55.
    Gestion de l'étatavec cookies et sessions Lecture des cookies Le navigateur envoie automatiquement les cookies qui correspondent à domain et path Une servlet peut récupérer les cookies envoyés précédemment au navigateur – méthode getCookies() de HttpServletRequest
  • 56.
    Gestion de l'étatavec cookies et sessions Lecture des cookies Cookie [ ] cookies = request.getCookies(); String nom = getCookieValue(cookies, &quot;nom&quot;, &quot;non trouvé&quot;); ... public static String getCookieValue( Cookie [] cookies, String cookieName, String defaultValue) { for(int i=0; i < cookies.length; i++) { Cookie cookie = cookies[i]; if(cookieName.equals(cookie.getName()) return(cookie.getValue()); } return(defaultValue); }
  • 57.
    Gestion de l'étatavec cookies et sessions Les sessions Une session peut se définir : – une série d'interactions reliées entre un navigateur et un serveur WEB – englobe plusieurs requêtes HTTP sur une période donnée – Utilisées pour mémoriser les actions (requêtes HTTP) d'un utilisateur unique au cours du temps – exple : opérations bancaires
  • 58.
    Gestion de l'étatavec cookies et sessions Techniques de mémorisation Pour échanger les données d'identification de la session dans chaque requête : – réécriture d'URL – champ de formulaire caché (&quot;hidden&quot;) – cookies – utilisation des sessions avec les HttpSession
  • 59.
    Gestion de l'étatavec cookies et sessions Réécriture d'URL Principe : – ajouter dans la chaîne de requête de la servlet des informations supplémentaires identifiant la session <a href=&quot;http://leo.inria.fr/servlet/foo?uid=itey&quot;> Ac heter</a> – l'ID utilisateur est transmis en même temps que la requête; il est accédé par chaque servlet mentionnée qui récupère les informations persistantes (BD, fichiers) à partir de cet ID
  • 60.
    Gestion de l'étatavec cookies et sessions Réécriture d'URL Limitations : – données volumineuses, – caractères autorisés, – longueur URL, – données visibles (sécurité)
  • 61.
    Gestion de l'étatavec cookies et sessions Champs de formulaires cachés Principe : – on cache les données de session dans des champs &quot;hidden&quot; : <INPUT TYPE=&quot;HIDDEN&quot; NAME=&quot;uid“ VALUE=itey&quot;> Limitations : – idem la &quot;réécriture d'URL&quot; sauf pour la sécurité (utilisation de POST)
  • 62.
    Gestion de l'étatavec cookies et sessions L'interface HttpSession Les objets HttpSession mémorisent les données de chaque utilisateur fonctionne comme une table de &quot;hachage&quot; stockée sur le serveur A chaque ID de session est associé, via la table de hachage, l'ensemble des informations
  • 63.
    Gestion de l'étatavec cookies et sessions Identification des sessions 2 façons possibles d'échanger l'ID de session : – par défaut : les cookies (de session : non permanents) – ajouter l'ID de session à l'URL (réécriture d'URL) L'implémentation est dépendante du moteur de Servlets
  • 64.
    Gestion de l'étatavec cookies et sessions Obtenir l'objet de session 2 méthodes de HttpServletRequest : – HttpSession getSession() : retourne la session courante, si elle n'existe pas, elle est créée – HttpSession getSession(boolean create) : idem sauf que la session n'est créée que si create = true, sinon retourne null
  • 65.
    Gestion de l'étatavec cookies et sessions Mémoriser et extraire les données Une fois la session obtenue, on peut mémoriser et extraire les données grâce aux méthodes de HttpSession : void putValue(String name, Object Val) Object getValue(String name)
  • 66.
    Gestion de l'étatavec cookies et sessions Mémoriser et extraire les données HttpSession session = request.getSession(); session.putValue( &quot;table&quot;, newArrayList()); ArrayList tab = (ArrayList)session.getValue(&quot;table&quot;);
  • 67.
    Gestion de l'étatavec cookies et sessions Autres méthodes de HttpSession boolean isNew() : retourne true si nouvelle session void invalidate() : invalide la session et supprime les associations nom / valeur
  • 68.
    Gestion de l'étatavec cookies et sessions Autres méthodes de HttpSession Les moteurs de servlets gèrent un timeout de durée de vie des sessions : int getMaxInactiveInterval() : retourne l'intervalle maximal d'inactivité en secondes void setMaxInactiveInterval : définit l'intervalle maximal d'inactivité en secondes
  • 69.
    Gestion de l'étatavec cookies et sessions Autres méthodes de HttpRequest String getRequestedSessionId() : retourne l'ID de session boolean isRequestedSessionIdFromCookie() retourne true si l'ID de session a été passé dans un cookie boolean isRequestedSessionIdFromURL() retourne true si l'ID des session a été passé dans l'URL
  • 70.
    Gestion de l'étatavec cookies et sessions Utiliser HttpSession sans cookies L'implémentation par défaut de HttpSession utilise les cookies – si les cookies ne sont pas autorisés par le navigateur, la mémorisation des sessions ne fonctionne pas Autre solution : la réécriture d'URL – ajouter l'ID de session à la fin de l'URL – la réécriture d'URL doit être activée sur le serveur
  • 71.
    Gestion de l'étatavec cookies et sessions Réécriture d'URL Méthodes de HttpServletRequest : String encodeURL(String url) encode l'URL en ajoutant l'ID de session si les cookies sont désactivés String encodeRedirectURL(String url) encode l'URL avant de rediriger le Navigateur
  • 72.
    Introduction aux JSP Korteby Farouk Cours Java Avancée
  • 73.
    Introduction aux JSPJSP : Java Server Page La plupart des applications Web produisent des pages HTML dynamiquement en modifiant uniquement les champs de données et pas la structure de base de la page. Les JSP sont la technologie la plus appropriée pour ce type de contenu.
  • 74.
    Introduction aux JSPUne page JSP contient un modèle de document statique et des balises spécifiques pour inclure du texte ou exécuter une partie de la logique applicative. Le contenu statique est servi comme du HTML normal.
  • 75.
    Introduction aux JSPUne JSP est un fichier texte ( .jsp ) contenant du code HTML et des fragments de code Java contenus dans des balises spécifiques, exécutés sur le serveur WEB Versions 1.0 et maintenant 1.2 En fait, le fichier JSP est traduit en servlet qui est compilée, puis instanciée lors de son invocation via une URL
  • 76.
  • 77.
    Introduction aux JSPLes balises JSP 3 types : – des directives : instructions qui contrôlent le comportement du compilateur de pages JSP, et qui sont donc évaluées avant la compilation, – des éléments de scripts (scriptlets) : blocs d’instructions Java inclus dans la page JSP entre des délimiteurs <% et %>.
  • 78.
    Introduction aux JSPLes balises JSP (suite) – des balises personnalisées (custom tags ou custom actions): elles sont définies par le programmeur et génèrent du contenu dynamique lorsque la page est demandée.
  • 79.
    Introduction aux JSPUn exemple simple de JSP <html><head><title>Un exemple de page JSP</title></head><body> <!-- définit les informations globales a la page --> <%@page language=&quot;java&quot; %> <!-- Déclare la variable c --> <%! char c = 0; %> <!-- Scriplet (code java) %> <% for(int i = 0; i < 26; i++){ for(int j = 0; j < 26; j++){ c = (char)(0x41 + (26 - i + j)%26); %> <%= c %> <% } %> <br> <% } %> </body></html>
  • 80.
  • 81.
    Introduction aux JSPLes scriptlets : <% … %> Contient du code JAVA – tout code JAVA valide – Objet out pour produire de la sortie HTML, objets request et response Se transforme dans la méthode jspService() de la servlet: – les variables sont locales à la méthode – les blocs de code s'insèrent dans la servlet
  • 82.
    Introduction aux JSPLes scriptlets : exemple <% String[ ] noms = {&quot;titi&quot;, &quot;toto&quot;}; for(int i = 0; i < noms.length; i++){ out.println(noms[i]); } %>
  • 83.
    Introduction aux JSPLes expressions : <%= … %> Pour évaluer une expression ou un objet Java et renvoyer sa valeur : – retourne une version String de l'expression – raccourci pour <% out.println(…); %> Se transforme en out.println(…) dans la méthode jspService(…) de la servlet
  • 84.
    Introduction aux JSP<% String[ ] noms = {&quot;titi&quot;, &quot;toto&quot;}; for(int i = 0; i < noms.length; i++){ %> Le nom <%= i %> ième nom est <%= noms[i] %> <% } %>
  • 85.
    Introduction aux JSPLes déclarations : <%! … %> Pour déclarer des méthodes à l'échelle de la page (méthodes de la servlet générée) – les méthodes ne sont exécutées que si elles sont appelées explicitement – on peut aussi déclarer des attributs Se transforme en déclarations de champs et méthodes au niveau de la servlet
  • 86.
    Introduction aux JSP<%! private int accessCount = 0; private int incrementCount() { return accessCount++; } %> … <H2>Nombre et liste des articles</H2> Nombre d'articles : <%= incrementCount() %>
  • 87.
    Introduction aux JSPDirectives <%@ directive attribut1=&quot;valeur&quot; attribut2=&quot;valeur&quot;... %> 2 directives possibles (jsp1.1) : – page : informations relatives à la page – include : fichiers à inclure littéralement
  • 88.
    Introduction aux JSPValeurs possibles : – <%@ page language=&quot;java&quot; – <%@ page import=&quot;java.util.*, java.net.*&quot; %> – <%@ page contentType=&quot;text/plain&quot; %> – <%@ page session=&quot;true|false &quot; %> – <%@ page errorPage=&quot;pathToErrorPage&quot; %> – <%@ page isErrorPage=&quot;true|false&quot; %> – <%@ page …
  • 89.
    Introduction aux JSPLa directive : <%@include … %> Valeurs possibles : – <%@ include file=&quot;chemin relatif du fichier&quot; %> – pour se référer au home dir du serveur Web : <%@ include file=&quot;/toto.html&quot; %>Interprété littéralement, le fichier peut être – HTML, scripting elements, directives, actions, ... L'insertion se fait au moment de la traduction de la page...
  • 90.
    Introduction aux JSPVariables prédéfinies Ou &quot;objets implicites&quot;, ils sont accessibles dans les balises JSP : – request : le HttpServletRequest – response : le HttpServletResponse – session : le HttpSession – out : flot de sortie (idem response.getWriter()) – application : le ServletContext (idem getServletConfig().getContext() ) – config, pageContext, page... : peu utiles
  • 91.
    Introduction aux JSPCookies et Sessions fonctionnent de la même façon que dans l'API Servlet Cookie : <% Cookie c = new Cookie(&quot;Sport&quot;, &quot;Foot&quot;); response.addCookie(c); %>
  • 92.
    Introduction aux JSPGestion des sessions avec les JSP Sessions : – toutes les pages JSP disposent automatiquement d'un objet session <% String val = (String)session.getValue(&quot;Sport&quot;); %>
  • 93.
    Balises JSP personnaliséesKorteby Farouk Cours Java Avancée
  • 94.
    Balises JSP personnaliséesLa technologie JSP permet au programmeur de définir leurs propres bibliothèques de balises; ce type de balises est remplacé par du contenu dynamique lorsque la page est envoyée au client. Le contenu dynamique est crée par un gestionnaire de balises, que le programmeur crée et distribue dans un fichier archive de Bibliothèque de balises.
  • 95.
    Balises JSP personnaliséesLe programmeur définit la syntaxe pour chaque balise et implémente le comportement à effectuer pour chaque balise dans la classe de gestion des balises (tag handler class). Les auteurs de pages peuvent ensuite importer et utiliser les balises définies dans les bibliothèques de balises comme s'ils utilisaient des balises traditionnelles.
  • 96.
    Balises JSP personnaliséesLes balises personnalisées : – sont réutilisables – permettent de définir des services de haut niveau et sont portables – facilitent la maintenance d'une application pas de répétition du code de pages en pages Modification du code en un seul endroit
  • 97.
    Balises JSP personnalisées– facilitent la lecture et la manipulation des pages plus simples à lire que des bouts de scripts – fournissent un moyen simple pour utiliser la logique métier – permettent une séparation claire entre présentation des données et logique métier maintenance plus simple montre plus clairement l'utilité de chaque composant permet aux programmeurs et auteurs de pages de travailler plus indépendamment
  • 98.
    Balises JSP personnaliséesLes bibliothèques de balises standards sont des jeux de balises qui fournissent un jeu de fonctionnalités basiques pour les pages JSP : – inclusion de ressources Web, chaînage de requête (request forwarding), – logique conditionnelle, – itérations sur des collections d'objets, – transformations XSLT, – internationalisation, – gestion des informations d'état, – formulaires HTML.
  • 99.
    Balises JSP personnaliséesCertaines sociétés ont produit leurs propres bibliothèques de balises, profondément intégrées dans leurs outils de développement et J2EE. D'autres organisations produisent des bibliothèques de balises génériques pour les applications J2EE. Exemple : Apache Taglibs (bibliothèque Open source de balises personnalisées).
  • 100.
    Balises JSP personnaliséesLes librairies standards fournissent souvent la plupart des fonctionnalités requises pour le développement de pages JSP et sont testées et optimisées par la communauté des développeurs. Utiliser une librairie de balises standards de haute qualité permet ainsi de gagner un précieux temps en développement.
  • 101.
    Règles de conception Korteby Farouk Cours Java Avancée
  • 102.
    Règles de conceptionQuand utiliser des servlets ? Elles sont la plupart du temps utilisées pour : – implémenter la logique de l'application – générer des données binaires – implémenter des services Les servlets ne sont pas habituellement des composants visuels, à l'exception de certaines qui génèrent du contenu binaire. Elles sont surtout utilisées comme un service d'accès aux informations de l'application.
  • 103.
    Règles de conceptionUne servlet peut ainsi rendre n'importe quel service (application de modèles, sécurité, personnalisation, contrôle de l'application) et ensuite choisir un composant de présentation (souvent une page JSP) pour lui transmettre la requête et s'occuper de sa présentation. Comme elle peut être assimilée à un service, un filtre de servlets peut être assimilé à une extension ou une personnalisation du service fourni par la servlet.
  • 104.
    Règles de conceptionLes servlets sont la technologie de prédilection pour implémenter un contrôleur sur le tiers Web, qui déterminera comment traiter une requête et choisira la prochaine vue à afficher. Un contrôleur active les opérations d'une application et prend des décisions, qui sont essentiellement des tâches procédurales bien adaptées à l'intégration dans le code d'une servlet.
  • 105.
    Règles de conceptionLes pages JSP ne doivent pas être utilisées comme contrôleur car si l'on mélange les balises et le code du programme, elles deviennent difficiles à lire et à maintenir, particulièrement pour les concepteurs Web, qui ne sont pas des programmeurs.
  • 106.
    Règles de conceptionLes pages JSP sont habituellement utilisées pour créer du contenu structuré ou des données textuelles non-structurées. Elles sont particulièrement adaptées lorsque la valeur des données change entre les requêtes mais que leur structuration ne change pas (ou peu).
  • 107.
    Règles de conceptionUtiliser les JSP pour la présentation des données Les vues pour visualiser les données d'une application d'entreprise sont traditionnellement en HTML, XHTML et DHTML. Les pages JSP sont utilisées lorsque le contenu est partiellement statique, avec quelques éléments remplis dynamiquement à l'exécution.
  • 108.
    Règles de conceptionUtiliser les JSP pour la présentation des données (suite) Une page JSP contient une partie fixe appelée &quot;template data&quot; (à ne pas confondre avec les mécanismes de modèles décrits par la suite). Les balises personnalisées ou les éléments de script peuvent être placés à divers endroits des données statiques et sont substitués à l'exécution par du contenu dynamique.
  • 109.
    Règles de conceptionUtiliser les JSP pour la présentation des données (suite) Les pages JSP ne peuvent pas produire de contenu binaire et ne sont pas très adaptées à la production de contenu à grande variabilité ou à la direction de requêtes, on préférera utiliser des servlets dans ce cas. Les pages JSP peuvent accéder facilement à la logique métier d'une application, en incluant des beans par exemple.
  • 110.
    Règles de conceptionLe patron de conception M-V-C Le patron de conception (Design pattern) Modèle-Vue-Contrôleur est recommandé car il permet de créer des applications réutilisables, et d’ajouter de nouveaux types de clients, processus et vues facilement. Le modèle de conception le plus simple a un seul contrôleur qui reçoit les requêtes des navigateurs, les distribue dans l’application et affiche les résultats.
  • 111.
    Règles de conceptionLe modèle MVC avec Servlet et JSP Utilisation conjointe des servlets et JSP : – JSP fournit la vue – les servlets contrôlent et dispatchent – les composants servent à accéder aux données du modèle
  • 112.
    Résumé Korteby FaroukCours Java Avancée
  • 113.
    Résumé Résumé (1/4)Le serveur Web d’une application J2EE rend disponible les applications sur le Web Les pages JSP et servlets sont des composants Web qui succèdent aux anciennes technologies côté serveur telles que les CGIs et qui assurent la portabilité.
  • 114.
    Résumé Résumé (2/4)Le conteneur Web fournit des services de haut niveau aux composants Web en matière de : – transactions, – accès aux données, – gestion des états, – sécurité et distribution.
  • 115.
    Résumé Résumé (3/4)Le serveur Web d’une application est une couche de service neutre, habituellement conçu sur le modèle MVC, qui simplifie la création d’applications Web interactives. Les servlets sont principalement utilisées pour générer des données binaires et contrôler l’application (modèle Servlet Dispatcher) Les pages JSP sont principalement utilisées pour créer du contenu textuel et des références à des données externes.
  • 116.
    Résumé Résumé (4/4)Pour les JSP, l’utilisation de bibliothèques de balises personnalisées améliore la qualité du code source et facilite la maintenance des applications J2EE.
  • 117.
    Ateliers Korteby FaroukCours Java Avancée
  • 118.
    Ateliers l'indispensable JDK de SUN : Il contient un compilateur, un interpréteur, les classes de base, et d'autres outils. Un Éditeur java : NetBeans IDE 5.0 Des Neurones frenchs qui tournent
  • 119.
    Ateliers Exemple 1:une simple Servlet public class GreetingServlet extends HttpServlet {}
  • 120.
  • 121.
  • 122.
  • 123.
  • 124.
  • 125.
    Ateliers <form action=&quot;GreetingServlet&quot; method=&quot;POST&quot;> First Name: <input type=&quot;text&quot; name=&quot;firstName&quot; size=&quot;20&quot;> <br /> Surname:  <input type=&quot;text&quot; name=&quot;surname&quot; size=&quot;20&quot;> <br /><br /> <input type=&quot;submit&quot; value=&quot;Submit&quot;> </form>
  • 126.
  • 127.
  • 128.
  • 129.
  • 130.
  • 131.
  • 132.
    Ateliers protected void  doPost(HttpServletRequest request, HttpServletResponse response)throws  ServletException, IOException {   String firstName = request.getParameter(&quot;firstName&quot;).toString();          System.out.println(&quot;firstName = &quot; + firstName);          processRequest(request, response);     }
  • 133.
  • 134.
  • 135.
  • 136.
    Ateliers Dans processRequest(…)response.setContentType(&quot;text/html;charset=UTF-8&quot;); PrintWriter out = response.getWriter(); String firstName = request.getParameter(&quot;firstName&quot;).toString(); String surname = request.getParameter(&quot;surname&quot;).toString(); out.println(&quot;<h1>Servlet GreetingServlet at &quot; +  request.getContextPath () + &quot;</h1>&quot;); out.println(&quot;<p>Welcome &quot; + firstName + &quot; &quot; +  surname + &quot;</p>&quot;); out.close();
  • 137.
    Ateliers Exemple 2:une simple Page JSP <%@ page language=&quot;Java&quot; import=&quot;java.util.*&quot; %> <H1 Align=&quot;center&quot;>Time is : <%= new Date() %></H1> <% for(int i=1; i<=6; i++) { %> <H<%= i %> align=&quot;center&quot;>Heading <%= i %> </H<%= i %>> <% } %>
  • 138.
    Ateliers Exemple 3:Get avec une Page JSP Index.html <form method=&quot;GET&quot; action=&quot;index.jsp&quot;> Enter Social Security Number: <input type=&quot;text&quot; name=&quot;ssn&quot;/> Enter Bonus Multiplier: <input type=&quot;text&quot; name=&quot;multiplier&quot;/> <input type=&quot;submit&quot; value=&quot;Submit&quot;/> <input type=&quot;reset&quot;/> </form>
  • 139.
    Ateliers Index.jsp <%!String strMult, ssn; %> <%! Integer integerMult; %> <%! int multiplier=0; %> <%! double bonus; %> <%! double inputBonus; %> <%! public double calculateBonus(int multiplier, double bonus) { double calculatedBonus = (multiplier * bonus); return calculatedBonus; } %>
  • 140.
    Ateliers Index.jsp <%strMult = request.getParameter(&quot;multiplier&quot;); ssn = request.getParameter(&quot;ssn&quot;); integerMult = new Integer(strMult); multiplier = integerMult.intValue(); inputBonus = 100.00; bonus = this.calculateBonus(multiplier, inputBonus); %> <P>Social Security Number : <%= ssn %> <P> <P>Multiplier : <%= multiplier %> <P> <P>Bonus Amount retrieved: <%= bonus %> <P>
  • 141.
  • 142.
    Merci de votreAttention By Korteby Farouk Cours Java Avancée -Servlets & JSP-
  • 143.
    Pour informations Complémentairesvous pouvez consultez: http://java.developpez.com/cours/servlets/ Tutorial J2EE : les Servlets http:// java.sun.com /docs/books/tutorial/ le site officiel de SUN By Korteby Farouk Cours Java Avancée -Applets-