Plan 1 Introduction, UTF­8 et XML ✔ 2 XPath ✔ 3 XPath (suite) ✔ 4 XSLT ✔ 5 DOM ✔ 6 XPath et XSLT en Java ✔ 7 JSP/Services Web REST 7.1 Principe 7.2 Contrôleur : HttpServlet 7.3 Services Web REST DONNÉES ET CONNAISSANCES POUR LE WEB Cours 7 [email protected] 2/22 Programmation Web coté serveur JSP (rappel) génération de pages­web dynamiques (i.e. dont le contenu est calculé en fonction de la requête HTTP). Plusieurs choix de langage côté serveur. JSP (Java Server Pages) est un framework permettant de créer des pages Web dynamiques en Java. Il fait partie de la suite Java EE (Entreprise Edition). Rappel : ⏹ PHP (déploiement de site très simple, langage merdique particulier) ⏹ Python, Ruby (manque de standardisation, plusieurs framework concurrents, problèmes de performances) ⏹ ASP .NET (microsoft) ⏹ Java/JSP (langage raisonnable, déploiement complexe) 3/22 ⏹ ⏹ ⏹ ⏹ Java Card (Java pour cartes de crédit, très peu de choses, pas de GC) Java ME (Micro Edition, pour les périphériques embarqués, mobiles, etc.) Java SE (Standard Edition, java « normal ») Java EE (Entreprise Edition, SE + packages pour JSP, et autres) 4/22 Architecture Exemple Nécessite un serveur Web particulier. Le standard est Apache Tomcat. <%@ page contentType="text/html; charset=UTF-8" %> ⏹ Le programmeur écrit des fichiers .jsp, contenant du HTML + du java dans des balises spéciales ⏹ (Le programmeur déploie les fichiers sur le serveur Tomcat) ⏹ L'utilisateur navigue vers une page foo.jsp ⏹ Le serveur Tomcat génère fooServlet.class ⏹ La classe est chargée dans la JVM java et (sa métode principale) est exécutée, produisant une page HTML ⏹ La page HTML est envoyée au navigateur <!DOCTYPE html> <html> <head><title>test JSP</title> <meta charset="UTF-8"/> </head> <body> Page created on <% java.util.Date d = new java.util.Date(); out.println(d.toString()); %> </body> </html> 5/22 balises spéciales JSP 6/22 Exemple complet JSP introduit 4 balises spéciales qui sont interprétée par le serveur Tomcat. Balise de configuration : <%@ … %> (options HTML, import de packages, …) Balise de déclarations : <%! … %> (déclarer des attributs et des méthodes) Balises d'instructions : <% … %> (permet de mettre une suite d'instructions) Balises d'expressions : <%= … %> (permet de mettre une expression dont le résultat est converti en String) ⏹ ⏹ ⏹ ⏹ <%@ page contentType="text/html; charset=UTF-8" %> <%@ page import="java.util.Date" %> <!DOCTYPE html> <html> <head><title>test JSP</title> <meta charset="UTF-8"/> </head> <%! Date maDate; Date maMethode() { return new Date(); } 7/22 %> <body> <% maDate = maMethode(); %> Page created on <%= maDate %> </body> </html> 8/22 Objets par défaut Classe JspWriter Le code placé dans les balises spéciales a accès à certains objets automatiquement déclarés. Parmi les principaux : Fonctionne comme System.out (on peut donc appeler .print/.println) mais correspond a un endroit particulier de la page HTML ⏹ out de type JspWriter (comme System.out mais écrit dans la page Web générée ⏹ session de type HttpSession : permet de définir et récupérer des variables de sessions (i.e. Objets que l'on stocke « globalement » et que l'on peut récupérer d'une page à l'autre) ⏹ request de type HttpServletRequest : permet de récupérer les paramètres passés dans une requête HTTP (par exemple les valeurs d'un formulaire) ⏹ response de type HttpServletResponse : permet de spécialiser la réponse envoyée au client (en­têtes HTTP, cookies, …) 9/22 10/22 Classe HttpSession Classe HttpServletRequest Propose plusieurs méthodes : Propose plusieurs méthodes : //Renvoie la valeur stockée sous le nom name Object getAttribute(String name) //Récupère la valeur des cookies: String[] getCookies() //Stocke l'objet value sous le nom name void setAttribute(String name, Object value) //Récupère les paramètres passés par un formulaire : Map<String, String[]> getParameterMap() //Supprime l'association name value void removeAttribute(String name) //Récupère un paramètre particulier String[] getParameter(String name) //Définit la durée (en secondes) d'inactivité d'une session void setMaxInactiveInterval(int interval) //Renvoie la durée (en secondes) d'inactivité d'une session int getMaxInactiveInterval() //Renvoie la date (en mili-secondes depuis EPOCH) de dernière utilisation long getLastAccessedTime() //Détruit la session en cours void invalidate() 11/22 12/22 Classe HttpServletResponse Classe Cookie Propose plusieurs méthodes : Propose plusieurs méthodes : //Renvoie une erreur HTTP (404 par exemple) void sendError(int code) //Constructeur Cookie(String name, String value) //Ajoute un cookie au site void addCookie(Cookie c) //Expiration en secondes void setMaxAge(int a) //Effectue une redirection temporaire void sendRedirect(String url) //Récupère le writer vers la sortie renvoyée au client PrintWriter getWriter() //Définit le Content-Type de la réponse void setContentType(String ct) //Définit l'encodage de la réponse void setCharacterEncoding(String ct) Les deux derniers doivent êtres appelés avant getWriter ! 13/22 Plan 14/22 HttpServlet La classe HttpServlet permet d'implémenter le contrôleur du modèle MVC. En effet il est considéré comme inélégant et contraire au modèle MVC de faire d'exécuter de la logique d'application dans des pages JSP (qui représentent la vue). On préfère l'implémenter dans des classes auxiliaires reliées au site par un Servlet. 1 Introduction, UTF­8 et XML ✔ 2 XPath ✔ 3 XPath (suite) ✔ 4 XSLT ✔ 5 DOM ✔ 6 XPath et XSLT en Java ✔ 7 JSP/Services Web REST 7.1 Principe ✔ 7.2 Contrôleur : HttpServlet 7.3 Services Web REST 15/22 16/22 Le contrôleur Plan ⏹ On annote la classe Java avec l'URL à laquelle elle correspond. @WebServlet("Foo") connecte le servlet avec l'URL http://site.com/Foo. ⏹ Pour chaque type de requête HTTP (POST, GET, …) redéfinit une méthode doXXX (où XXX vaut Get, Post, …) ⏹ Les requêtes ne peuvent lever que des ServletException ou IOException ⏹ Ces méthodes prennent en argument une request (la requête HTTP que qui nous a amené sur ce servlet) et un response (qui sera envoyé au client 1 Introduction, UTF­8 et XML ✔ 2 XPath ✔ 3 XPath (suite) ✔ 4 XSLT ✔ 5 DOM ✔ 6 XPath et XSLT en Java ✔ 7 JSP/Services Web REST 7.1 Principe ✔ 7.2 Contrôleur : HttpServlet ✔ 7.3 Services Web REST 17/22 18/22 Service Web REST Un service Web est un moyen pour une application d'exposer son API au moyen du protocole HTTP Un service Web REST se caractérise de manière suivante : Il existe plusieurs méthodologies : ⏹ Web API : utilise différents standards tels que WSDL (fichier XML décrivant le service), SOAP (protocole avec des messages XML au dessus de HTTP), UDDI (annuaire de service), … ⏹ REST : Representational State Transfer. Approche plus simple basée sur des URL et les méthodes HTTP (GET, POST, PUT, DELETE) ⏹ Une ou plusieurs URL servant de point d'entrée ⏹ Un comportement implémenté pour les requêtes GET, POST, PUT, DELETE. Les contraintes de méthode sont les suivantes ⏹ GET : le traitement du serveur doit être sans effet (read­only) ⏹ PUT/DELETE : le traîtement doit être idempotent (l'état exposé par le système ne doit pas varier après un appel à la méthode avec un paramètre donné) Le contenu renvoyé par le service Web peut être quelconque, mais on privilégiera le XML dans ce cours On utilisera des services Web REST 19/22 20/22 Démo Classe utilitaire/Appel de service Web La classe HTTPUrlConnection permet de créer des requêtes HTTP en Java (voir la Javadoc). Pour des requêtes simples (GET) on poura utiliser uniquement la classe URL. 21/22 22/22