Programmation Internet et Java
Transcription
Programmation Internet et Java
ISI 1022 : Programmation Internet et Java Programmation Internet et Java Jean-Noël Sorenti. Année 2002/2003 Les Java Server Pages ISI 1022 : Programmation Internet et Java 1 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Les Java Server Pages l Programmation Internet et Java Plan du Cours : • Définition d’une JSP • Syntaxes des JSP • Utilisation conjointe de Servlets et JSP 2 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Introduction l Programmation Internet et Java Problème des Servlets avec le HTML : • Il n ’est pas souhaitable d’écrire du HTML dans les • • • instructions out.println, surtout si ce dernier n ’a pas besoin d ’être généré dynamiquement Tout changement HTML nécessite un changement dans le source Java et une recompilation. L ’équipe de conception HTML est souvent séparée ce celle des développeurs Java. La lecture est plus lourde et souvent difficile ! 3 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Introduction l Programmation Internet et Java Pourquoi des pages JSP ? • Les Java Server Pages constituent une autre approche de la production de contenu dynamique : • code JSP directement dans une page HTML • pas de recompilation ‘ manuelle ’ si changement du code HTML. On a une Auto-re compilation effectuée par le Serveur transparente pour l’utilisateur. • Meilleure lisibilité 4 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Rôle des JSP l Programmation Internet et Java Chacun son rôle : • Une bonne attribution des rôles entre les Servlets, JSP, JavaBeans est vitale pour la fabrication d ’application Web de qualités (faciles à maintenir, …) • La séparation entre HTML et Java grâce à une association de Servlet, de JSP, de JavaBeans, et de classes Java est l’un des thèmes majeurs de ce cours. 5 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Programmation Internet et Java Les Java Server Pages l Comparaison avec les Servlets : • • Une Servlet est une classe Java générant généralement des sorties HTML en réponse aux requêtes HTTP. Une page JSP est une page HTML contenant du code Java, exécuté par le serveur lorsque cette dernière est demandée : • On parle de Servlet inversé : …java <%…java%> out.println(variable); <%=variable%> out.println(‘ <HTML >’); out.println(‘ </HTML> ’); servlet <HTML> </HTML> jsp 6 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Mécanisme des JSP l Programmation Internet et Java Mécanisme des Java Server Pages : • Au premier appel d ’une JSP : • Le serveur détecte l’extension .jsp • Implémente la classe java correspondante sous forme de Servlet ! (Génère une classe java). • Compilation de la classe. • Instancie la Servlet générée… • Chaque fois qu’une page JSP est appelée : • Appel de la méthode service() de l ’instance. 7 Remarque : Une page JSP peut être déployée avec sa classe compilée. Une page JSP peut aussi être chargée au démarrage. Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Programmation Internet et Java Mécanisme des JSP l Mécanisme des Java Server Pages : Date_jsp.class Public class Date_jsp implements HttpServlet { <HTML> <BODY> public void service(HttpServletRequest request HttpServletResponse response) { … <%=new java.util.Date()%> response.setContentType(‘ text/html ’); </HTML> … JspWriter out = response.getWriter(); </BODY> out.println(‘ <HTML> ’); out.println(‘ <BODY> ’); out.println(new java.util.Date()); out.println(‘ </BODY> ’); out.println(‘ </HTML> ’); date.jsp Répertoire cache temporaire … } } Date_jsp.java Génération automatique de la Servlet associée. Compilation automatique de la classe 8 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Mécanisme des JSP l Programmation Internet et Java Exemple JSP avec sample.jsp : <HTML> <BODY> <% String nom = request.getParameter(‘NOM’); if (nom!=null) { %> Vous avez bien passé votre nom dans le paramètre NOM qui est égal à <%=nom%> <% } else { %> Veuillez entrer un nom ! <% } %> </BODY> </HTML> l Utilisation : • /sample.jsp?NOM=Toto 9 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Eléments de Scripts l Programmation Internet et Java Dans une page JSP, le code Java est embarquée à l’aide d’éléments de scripts. Ces derniers sont de plusieurs types : • • • • Déclaration : <%! Java %> : on pourra ajouter des attributs et méthodes à la Servlet. Expression : <%= Java %> : les expressions sont évaluées et les résultats insérés. Scriplets : <% Java %> : code java directement copié dans la servlet. Directives : <%@directive [option=‘value’]* %> : Pour « effectuer des import de classes, packages ou documents,… 10 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Eléments de Scripts l Programmation Internet et Java Autre exemple de JSP : Directive <%@ include file=‘entete.jsp’ %> <% ! private int nbAppels; Déclaration private int getNbAppels() { return ++nbAppels; } %> <html> Expression <head><title>Autre exemple</title></head> <body> </body> </html> Cette page a été appelée <%=getNbAppels()%> fois. <% if (nbAppels==1) { out.println(‘premier appel’) } %> <% if (nbAppels==10) { %> dixième appel <% } %> Scriplet 11 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Eléments de Scripts : Directives l Programmation Internet et Java Liste de directives définies dans la spécification JSP : • include : inclusion d’un fichier spécifié au moment de la traduction (compilation). • tabglib : pour l’utilisation de balises personnalisées*. • page : multi directive. (comprend un certain nombre d’option) 12 (*) Nous aborderons la notion de taglib dans les prochains cours. Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Eléments de Scripts : Directive page l Programmation Internet et Java Option de la directive page : <%@page option %> • • • • • • import : Identique à l’instruction ‘import’ dans un fichier source java : import = ‘java.util.*,java.text.*’ buffer : Ajuste la taille mémoire tampon de sortie : soit ‘none’, ou une certaine taille : buffer=’16k’ contentType : définit la sortie de la page JSP : contentType=‘text/html’ errorPage : page à afficher si une exception est récupérée à partir de cette page : errorPage=‘fichier’ isErrorPage : cette page s’affiche en réponse aux exceptions issues d’autres pages. La valeur par défaut est ‘false’: isErrorPage=‘true’ autoFlush : la valeur par défaut est ‘true’. L’exception est levée si l’option est réglée sur ‘false’ et que la mémoire tampon déborde. 13 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Commandes JSP l Programmation Internet et Java Il existe aussi des actions JSP interprétées à l’exécution de la page (contraire au éléments de scripts utilisés à la compilation) : <jsp : action param1="value1" param2="value2" /> • • • • • • Récupération d’un bean dans le request ou la session • <jsp:useBean id="nom" scope="conteneur" class="tp1servlet.Table" /> Inclusion dynamique d’une page • <jsp:include page="nompage" flush="true" /> Chaînage vers une autre ressource • <jsp: forward page="url" /> ou <jsp:forward page="url" >(*)</jsp:forward> Ajout de paramètres dans le request.(*) • <jsp:param name="message" value="hello" /> • <jsp:param name="peter" value="<%=peterVal%>" /> Modifications et récupération d’une valeur d’un bean • • <jsp:setProperty name=‘’beanID’’ property=‘’propName’’ value=‘’val’’ /> <jsp:getProperty name=‘’beanID’’ property=‘’propName’’ /> Appel d’un plugin externe • <jsp:plugin type=‘’applet’’ code=‘’jweb.samples.SimpeApplet.class’’ /> 14 <jsp:plugin type=‘’applet’’ code=‘’jweb.samples.SimpeApplet.class’’ /> est une autre façons d’inclure une applet dans une page HTML. Le fait de l’écrire coté serveur fait que le processeur JSP insèrera la balise <applet> adaptée au navigateur. Nous verrons par la suite plus en détail le fonctionnement de ces actions JSP. Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Utilisation d’objets implicites Programmation Internet et Java l L’environnement donne accès à certains objets dans les JSP : • • • • • • • • out de type JspWriter : flux de sortie pour écrire la réponse. request de type HttpServletRequest : requête du client. response de type HttpServletResponse : réponse renvoyée au client. session de type HttpSession : la session en cours pour le client qui a émis la requête. config de type ServletConfig : les paramètres d’initialisation de la servlet en cours de traitement. pageContext : le contexte de la page JSP page : l’instance de la page elle même. exception : l’exception qui a engendré l’appel de la page 15 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Commentaires l Programmation Internet et Java Plusieurs façons d’insérer des commentaires dans une JSP : • Commentaires du HTML (sur le contenu). Envoyé au • • navigateur : <!– commentaires --> Commentaires du JSP (Visible uniquement dans le fichier source JSP) : <%-- commentaires --%> Commentaires du Java (Visible uniquement dans les scriplets) : <% /* commentaires */ %> 16 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Options pour le déploiement de JSP l Programmation Internet et Java On peut aussi déployer une JSP avec une entrée dans le fichier web.xml : • Si on désire créer un mapping pour la page • Passage de paramètres d’initialisation <web-app> <servlet> <servlet-name>Simple.jsp</servlet-name> <jsp-file>/examples/Simple.jsp</jsp-file> <init-param> <param-name>nom</param-name> <param-value>valeur</param-value> </init-param> </servlet> <servlet-mapping> <servlet-name>simple</servlet-name> <url-pattern>/simple</url-pattern> </servlet-mapping> </web-app> 17 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Programmation Internet et Java Utilisation conjointe de Servlets et JSP l l l L’utilisation conjointe de Servlets et JSP dans une application Web est monnaie courante. Les Servlets et JSP ont donc des atouts différents. Utiliser tous les atouts possibles impliquera une utilisation conjointe. 18 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Programmation Internet et Java Utilisation conjointe de Servlets et JSP l Rappel : • L’aspect métier et traitement peut être réservé aux • • • Servlets. L’aspect présentation des données peut être réservé aux JSPs. Une Servlet doit pouvoir appeler une JSP. Une JSP doit pouvoir appeler une autre JSP,… 19 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Programmation Internet et Java Utilisation conjointe : Exemple du login l Application Login : première approche 1 Login Login Demande de saisie de l’utilisateur et de son password. 3 Re Demande de saisie de l’utilisateur et de son password avec erreur. 2 4 Bienvenue Vous êtes maintenant logué en tant que ‘user’. Servlet ou JSP user/password 5 Client Web Serveur 20 1: La login Servlet génère un HTML avec la demande de Login. 2: Le user/password est envoyé au serveur 3: Login mauvais : renvoie d’une page avec signalement d’erreur et redemande de Login 4: Le nouveau user/password est envoyé au serveur 5: Login ok. Une page de bienvenue est renvoyée au navigateur. Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Programmation Internet et Java Utilisation conjointe : Exemple du login l Problème de l’exemple précédent : • Complexité de la Servlet : • Effectue les tests de login. • Gère la présentation de saisie login • Gère la présentation de login ok. • Solution : • Répartition des tâches. • Formulaires multiples 21 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Programmation Internet et Java Utilisation conjointe : Exemple du login l Application Login : nouvelle approche 1 Login Demande de saisie de l’utilisateur et de son password. Login 3 Re Demande de saisie de l’utilisateur et de son password avec erreur. user/password forwards 5 Bienvenue Vous êtes maintenant logué en tant que ‘user’. 2 4 Login ServerPage 5 Client Web Bienvenue ServerPage Serveur 22 On sépare la présentation de l’écran Bienvenue de celle de l’écran Login. Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Programmation Internet et Java Utilisation conjointe : Exemple du login l Application Login : nouvelle approche 1 Login Demande de saisie de l’utilisateur et de son password. Login 3 Re Demande de saisie de l’utilisateur et de son password avec erreur. Bienvenue Vous êtes maintenant logué en tant que ‘user’. 5 Client Web Login ServerPage Présentation forwards 2,4 user/password 1,3 Login Servlet (Traitements) Servlet Front Controller : gère la logique applicative forwards 5 Bienvenue ServerPage Serveur 23 Dans ce cas, pour l’action Login, on sépare aussi les traitements de la présentation. Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Programmation Internet et Java Utilisation conjointe : Répartiteur de requêtes l Les ‘forwards’ s’effectuent à l’aide d’un répartiteur de requêtes de type RequestDispatcher : • RequestDispatcher dispatcher = • l request.getRequestDispatcher(’’/next.jsp’’); dispatcher.forward(request,response) Dans une page JSP, l’écriture est simplifiée, on utilise l’action forward : • <jsp:forward page= ’’/next.jsp’’ /> • <jsp:forward page= ’’<%=url%>’’ /> 24 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Répartiteur de requête : forward l Programmation Internet et Java Exemple d’utilisation de forward Public class Login extends HttpServlet { … public void service(HttpServletRequest request, HttpServletResponse response) { String user = request.getParameter(‘’user’’); String pass= request.getParameter(‘’password’’); RequestDispatcher dispatcher = null; if (verif(user,pass)==true) dispatcher = request.getRequestDispatcher(‘’/login.jsp’’); else dispatcher = request.getRequestDispatcher(‘’/bienvenue.jsp’’); … } } dispatcher.forward(request,response); 25 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Répartiteur de requête : forward l Programmation Internet et Java Restriction dans l’utilisation de forward : • Aucune sortie ne doit être effectuée en amont ou en aval d’un forward, on aurais alors une IllegalStateException générée : public void service(HttpServletRequest request, HttpServletResponse response) { PrintWriter out = response.getWriter(); out.println(‘’ce message ne s’affichera pas car forward en aval… car le tampon va être vidé par le dispatcher.forward…’’); RequestDispatcher dispatcher = request.getRequestDispatcher(‘’/login.jsp’’); dispatcher.forward(request,response); } out.println(‘’Ce message ne s’affichera pas car forward en amont (implique que le tampon est fermé…’’); 26 La mémoire tampon de out est effacée lors du transfert. (au moment du forward). La mémoire tampon de out est fermée et vidée lorsque l’on reprend la main. Le message en amont ne va pas s’afficher car en réalité, il est affiché lors d’un out.flush() qui est normalement lancé à la fin de la méthode service de la Servlet. Dans le forward, si le flux out contient de l’information (String en amont), alors une IllegalStateException est générée. Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Répartiteur de requête : include l Programmation Internet et Java Nous avons include() fonctionnant exactement comme forward(), sauf que : • La mémoire tampon n’est pas vidée avant le transfert et exception n’est levée • La mémoire tampon n’est pas vidée, ni fermé lorsque l’on reprend la main . public void service(HttpServletRequest request, HttpServletResponse response) { PrintWriter out = response.getWriter(); out.println(‘’ce message s’affichera avant l’inclusion’’); RequestDispatcher dispatcher = request.getRequestDispatcher(‘’/login.jsp’’); dispatcher.include(request,response); } out.println(‘’Ce message s’affichera après l’inclusion’’); 27 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Répartiteur de requête : include l Programmation Internet et Java Comme pour le forward, l’include peut s’écrire de façon simplifiée dans une page JSP : • <jsp:include page= ’’/next.jsp’’ /> • <jsp:include page= ’’<%=url%>’’ /> • <jsp:include page= ’’<%=url%>’’ flush=’’true’’/> l Cette fonction est primordiale dans le développement d’application Web.Elle permet de structurer les développement (factorisation de pages,…) 28 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Programmation Internet et Java Répartiteur de requête : format des documents l Le Répartiteur de requête nous permet de transférer et/ou d’inclure n’importe quel type de ressources via une URL: • • • • l Une Servlet Une page JSP Un fichier HTML etc.… Les URL utilisées pour forward() et include() sont soit : • • Relatives au contexte Web.* Relative à la Servlet en cours.* 29 Une URL relative au contexte Web débute par ‘/’. On récupère l’information à partir de la racine de l’application. (webapp,…) Une URL relative à la Servlet ne commence pas par ‘/’. L’URL pattern du servlet-mapping est utilisé pour récupérer la ressource. Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Répartiteur de requête nommé l Programmation Internet et Java Le Répartiteur de requête nommé nous permet le transfert à une Servlet directement avec son nom et non avec son URL de mapping : RequestDispatcher dispatcher = getServletContext().getNamedDispatcher("Simple"); <web-app> <servlet> <servlet-name>Simple</servlet-name> <servlet-class>package.Simple</ servlet-class > </servlet> <servlet-mapping> <servlet-name>Simple</servlet-name> <url-pattern>/simpleURL</url-pattern> </servlet-mapping> </web-app> 30 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Programmation Internet et Java Comparaison entre sendRedirect() et forward() l l l Différent de forward et include ! (Ou toute la ‘chaîne de traitement’ s’effectue sur le Serveur). HttpResponse.sendRedirect(URL) emploie la commande de re direction de HTTP. sendRedirect(URL) envoie le code (302 Found) au navigateur qui doit automatiquement se rediriger vers la nouvelle URL. (Dans ce cas, on ordonne au client de se rediriger vers la nouvelle ressource). 31 Jean-Noël Sorenti – Année 2002/2003 ISI 1022 : Programmation Internet et Java Programmation Internet et Java Comparaison entre sendRedirect() et forward() R2 Page 2 forwards Page 1 R1 Page 2 R2 sendRedirect (R2) Page 1 Navigateur R1 Serveur 32 Jean-Noël Sorenti – Année 2002/2003