NOUVELLES TECHNOS DU WEB INTRODUCTION. LI385 - Nouvelles Technologies du web



Documents pareils
Le développement d applications Web

Web Tier : déploiement de servlets

Traitement des données de formulaires. Accès aux BD avec JDBC Servlets - M. Baron - Page

JavaServer Pages (JSP)

HTTP 1.1. HyperText Transfer Protocol TCP IP ...

Avant-propos 1. Avant-propos Organisation du guide À qui s'adresse ce guide?...4

TP JEE Développement Web en Java. Dans ce TP nous commencerons la programmation JEE par le premier niveau d une application JEE : l application web.

Le développement d applications Web. François Charoy Pascal Molli Pascal Urso

Extension SSO Java. Cette note technique décrit la configuration et la mise en œuvre du filtre de custom SSO Java.

Les architectures 3-tiers Partie I : les applications WEB

Application Web et J2EE

Architecture Orientée Service, JSON et API REST

Outil de planification en ligne pour des créations de rendez-vous ou de sondage

Groupe Eyrolles, 2005, ISBN :

1. Installation d'un serveur d'application JBoss:

Serveur d'application Client HTML/JS. Apache Thrift Bootcamp

Application web de gestion de comptes en banques

Projet Java EE Approfondi

Mise en œuvre des serveurs d application

Documentation CAS à destination des éditeurs

Aspects techniques : guide d interfaçage SSO

Patrons de conception [Krakowiak06]

INTRODUCTION A JAVA. Fichier en langage machine Exécutable

Jahia CMS ET Portal Version 5.0

Formation : WEbMaster

Application de lecture de carte SESAM-Vitale Jeebop

Programmer en JAVA. par Tama

Bases Java - Eclipse / Netbeans

Formation en Logiciels Libres. Fiche d inscription

Jacques Lonchamp. Conception. d applications en Java/JEE. Principes, patterns et architectures

Pour plus de détails concernant le protocole TCP conférez vous à la présentation des protocoles Internet enseignée pendant.

WEBSERVICES. Michael Fortier. Master Informatique 2ème année. A308, Université de Paris 13

Pour signifier qu'une classe fille hérite d'une classe mère, on utilise le mot clé extends class fille extends mère

TP1 : Initiation à Java et Eclipse

Java pour le Web. Cours Java - F. Michel

RMI le langage Java XII-1 JMF

Compte Rendu d intégration d application

Utilisation de Jakarta Tomcat

as Architecture des Systèmes d Information

A DESTINATION DES SERVICES TIERS. Editeurs d applications et ressources pédagogiques connectées à l ENT

SIO Page 1 de 5. Applications Web dynamiques. Prof. : Dzenan Ridjanovic Assistant : Vincent Dussault

Développement des Systèmes d Information

Cours 1: Java et les objets

24/11/2011. Cours EJB/J2EE Copyright Michel Buffa. Plan du cours. EJB : les fondamentaux. Enterprise Java Bean. Enterprise Java Bean.

Java Naming and Directory Interface

Quelques patterns pour la persistance des objets avec DAO DAO. Principe de base. Utilité des DTOs. Le modèle de conception DTO (Data Transfer Object)

Technologies du Web. Créer et héberger un site Web. Pierre Senellart. Page 1 / 26 Licence de droits d usage

Cours 14 Les fichiers

TP Composants Java ME - Java EE. Le serveur GereCompteBancaireServlet

Applications et Services WEB: Architecture REST

Institut Supérieur de Gestion. Cours pour 3 ème LFIG. Java Enterprise Edition Introduction Bayoudhi Chaouki

Programmation Web. Introduction

Architectures client/serveur

Programmation Web. Madalina Croitoru IUT Montpellier

Formation Webase 5. Formation Webase 5. Ses secrets, de l architecture MVC à l application Web. Adrien Grand <jpountz@via.ecp.fr> Centrale Réseaux

Programmation Orientée Objet

RMI. Remote Method Invocation: permet d'invoquer des méthodes d'objets distants.

Technologies Web. Ludovic Denoyer Sylvain Lamprier Mohamed Amine Baazizi Gabriella Contardo Narcisse Nya. Université Pierre et Marie Curie

Classe ClInfoCGI. Fonctions membres principales. Gestion des erreurs

Authentification et contrôle d'accès dans les applications web

4. SERVICES WEB REST 46

Initiation à JAVA et à la programmation objet.

Programmation Réseau. Sécurité Java. UFR Informatique jeudi 4 avril 13

INITIATION AU LANGAGE JAVA

WEB & DÉVELOPPEMENT LES BASES DU WEB LE LANGAGE HTML FEUILLES DE STYLES CSS HISTORIQUE D INTERNET ET DU WEB LES DIFFÉRENTS LANGAGES

TP3. Mail. Attention aux fausses manoeuvres lors de ce TP vous pouvez endommager votre mail sur ouindose.

Encapsulation. L'encapsulation consiste à rendre les membres d'un objet plus ou moins visibles pour les autres objets.

LANGAGUE JAVA. Public Développeurs souhaitant étendre leur panel de langages de programmation

Généralités sur le Langage Java et éléments syntaxiques.

Un exemple d'authentification sécurisée utilisant les outils du Web : CAS. P-F. Bonnefoi

Alfstore workflow framework Spécification technique

WebSSO, synchronisation et contrôle des accès via LDAP

Apache Tomcat 6. Guide d'administration du serveur Java EE sous Windows et Linux. Résumé. Étienne LANGLET

Architecture JEE. Objectifs attendus. Serveurs d applications JEE. Architectures JEE Normes JEE. Systèmes distribués

Cloud. Définition? 08/11/2012. James Urquhart The Wisdom of Clouds

Architecture N-Tier. Ces données peuvent être saisies interactivement via l interface ou lues depuis un disque. Application

Module BD et sites WEB

contact@nqicorp.com - Web :

Stockage du fichier dans une table mysql:

Serveur d'archivage 2007 Installation et utilisation de la BD exist

Devenez un véritable développeur web en 3 mois!

Plan du cours. Historique du langage Nouveautés de Java 7

contact@nqicorp.com - Web :

Développement Logiciel

Introduction à Java. Matthieu Herrb CNRS-LAAS. Mars

Structure d un programme et Compilation Notions de classe et d objet Syntaxe

Authentification avec CAS sous PRONOTE.net Version du lundi 19 septembre 2011

PHP 5.4 Développez un site web dynamique et interactif

les techniques d'extraction, les formulaires et intégration dans un site WEB

Implementing a simple RMI Application over the Internet (using and comparing HTTP tunneling, RMI Proxy)

Architectures Web Services RESTful

Java c est quoi? Java. Java. Java : Principe de fonctionnement 31/01/ Vue générale 2 - Mon premier programme 3 - Types de Programme Java

arcopole Studio Version 3.3

Programmation Orientée Objet - Licence TIS CM8/9. Rappel sur la séance précédente. Lancelot Pecquet Lancelot.Pecquet@math.univ-poitiers.

Principales failles de sécurité des applications Web Principes, parades et bonnes pratiques de développement

Sécurité des sites Web Pas un cours un recueil du net. INF340 Jean-François Berdjugin

Projet gestion d'objets dupliqués

Le stockage local de données en HTML5

Langage Java. Classe de première SI

Transcription:

NOUVELLES TECHNOS DU WEB INTRODUCTION LI385 - Nouvelles Technologies du web

Me contacter Jean-Loup Guillaume Jean-loup.guillaume@lip6.fr 0144278844 Les supports sur : http://jlguillaume.free.fr/www/

Contenu du cours Java : Servlets/JSP Base de données : JDBC/NoSQL Javascript/Ajax/Jquery/HTML5 Pré requis : Bonne connaissance de HTML Connaissance minimale de javascript Java

Organisation Semaines du : 4, 11, 18 février (Java : Servlets/JSP/JDBC/Mysql) 18, 25 mars (Javascript et Jquery) 15, 22 avril (HTML5 et canvas) 13 mai (NoSQL) Chaque semaine : Lundi matin : cours Lundi après-midi : TME Mercredi matin : projet

Notation TME noté sur la partie HTML/Javascript Intégration des TME HTML5/Javascript/Jquery Nécessite d'avoir terminé tous les TME! Développement supplémentaire Projet : Utilise toutes les technologies vues en cours Possibilité d'utiliser d'autres technos

Présentation projet

DÉVELOPPEMENT WEB JAVA SERVLETS/JSP/BD LI385 Jean-Loup Guillaume

Programme La base : les servlets Du pur java Création de page web directement en Java avec des println Le JSP : dissocier le html du code Java Appels java au milieu du code HTML (similaire au php) Les bases de données en Java JDBC et MySQL NoSQL (MongoDB) au dernier cours

SERVLETS - INTRODUCTION

Servlets Composant Java générant du contenu dynamiquement : Similaire à Php Les Servlets s'exécutent sur le serveur Web Peuvent être considérées comme le Contrôleur dans le modèle MVC JSP = Vue, classes Java = Modèle Avantages = code Java : Tout est géré par la JVM Portable Utilisation de processus légers (threads) Langage compilé (plus efficace, code source "caché")

Servlets La spécification décrit l'api Servlet (interface) L'implémentation dépend du serveur utilisé En pratique, on doit implémenter l interface javax.servlet.servlet Soit directement Soit en étendant une classe qui l'implémente GenericServlet ou HttpServlet C'est ce qu'on fera par la suite Actuellement version 3.0 de l'api

Servlets - remarques Exécution sur le serveur Etablissement de connexions (RMI, ) Appels systèmes/connexions BD/ Manipulation des ressources locales (fichiers, ) Pas d'interface graphique Java pur : génération de pages HTML Le navigateur fait le reste

Servlet Container Servlet container : Partie du serveur web qui gère les services réseaux Support HTTP obligatoire Autres protocoles possibles Ou ajouté à un serveur d'application gérant le web Gère le cycle de vie des servlets (création, gestion, mort) Mécanismes pouvant être implémentés : Cache Modification des requêtes (resp. réponses) avant transmission à la Servlet (resp. client)

Fonctionnement classique 1. Un client (navigateur) fait une requête vers un serveur 2. La requête est transmise au container par le serveur 3. Le container décide à quelle Servlet passer la requête 4. La Servlet : 1. Utilise l'objet requête pour récupérer les informations nécessaires (utilisateur, paramètres passés, cookies, etc.) 2. Exécute le code nécessaire (appels BD, génération de code html, etc.) 3. Retourne un objet réponse au container (code HTML en général) 5. Le container s'assure de l'envoi de la réponse au client et rend la main au serveur

Servlet Container Les serveurs implémentent les servlets comme ils veulent Respect du cycle de vie des Servlets : Création et initialisation de la Servlet Gestion d'un certain nombre de requêtes Destruction de la Servlet et libération des ressources Le reste dépend de l'implémentation : Le serveur peut créer une Servlet par requête (peu efficace) Savoir quand une Servlet va être détruite dépend donc de l'implémentation Persistance des informations dans la Servlet

Développement Nombreux outils gratuits, nécessite : Java installé (et savoir programmer) Un serveur web : Serveur classique + moteur de servlets ou Serveur avec support intégré des servlets (Jboss, Apache Tomcat, Glassfish, ) Pour que tout soit plus simple : Utiliser un IDE (Eclipse typiquement) Installer les plugins associés au serveur web.

Exemple de configuration Java Enterprise Environment 7 : JDK : Java Development Kit dernière version. JRE : Java Runtime Environment dernière version. Jboss AS 7.1.1 : serveur d'application. Eclipse : Version récente (type Juno 4.2) Avec plugin Jboss : permet de tout gérer dans Eclipse

Une application Web Une application web = un espace virtuel Contient html, js, images, servlets, jsp, classes Java, etc. Un fichier web.xml Fichier web.xml Décrit ce qui est disponible et comment y accéder : Nom de la servlet, Classe associée, URLs associées À placer dans le répertoire /WEB-INF Généré automatiquement par Eclipse (case à cocher) Optionnel depuis la version 3.0 des servlets (voir annotations) Inutile si aucune servlet/listener/filter

Fichier web.xml - exemple <?xml version="1.0" encoding="utf-8"?> <web-app> <servlet> <servlet-name>hello</servlet-name> <servlet-class>hello</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/hello.html</url-pattern> </servlet-mapping> </web-app>

Fichier web.xml - exemple Servlet associée à toutes les URLs <?xml version="1.0" encoding="utf-8"?> <web-app> <servlet> <servlet-name>hello</servlet-name> <servlet-class>hello</servlet-class> </servlet> <servlet-mapping> <servlet-name>hello</servlet-name> <url-pattern>/*</url-pattern> </servlet-mapping> </web-app>

La gestion des erreurs Récupération des erreurs : Java (exceptions) http : page inexistante (erreur 404) ou autre Association d'une page à ces erreurs dans web.xml <error-page> <exception-type>java.lang.arithmeticexception</exception-type> <location>/exception.jsp</location> </error-page> <error-page> <error-code>404</error-code> <location>/erreur</location> </error-page>

SERVLETS LA BASE

Cycle de vie Création de la Servlet Géré par le container (création d'une instance) Initialisation Méthode "init" Appel Méthode "service" Récupération de la requête et création de la réponse Destruction Méthode "destroy"

Méthodes d'une Servlet void init(servletconfig config) throws ServletException init est appelé avant la première requête : On peut faire ce qu'on veut, notamment des choses longues qu'on ne souhaite pas faire à chaque fois (connection à une BD) Ne pas passer de paramètres à la fonction si on étend la méthode init (voir GenericServlet plus loin) Sinon on récupère des informations générales sur le contexte d'exécution

Méthodes d'une Servlet void service(servletrequest req, ServletResponse res) throws ServletException, IOException ServletRequest : informations venant du client : Paramètres passés (par GET ou POST) Session, Cookies, ServletResponse : réponse pour le client : Typiquement envoi du code HTML On verra plus loin comment utiliser ces objets

Méthodes d'une Servlet void destroy() Destruction de la servlet : On libère tout ce qu'on aurait pu allouer Fermeture de connexion BD...

Méthodes d'une Servlet ServletConfig getservletconfig() Getter pour la configuration de la Servlet : L'objet ServletConfig a été passé à la méthode init init doit sauver des objets pour que cette méthode le retourne à la demande

Méthodes d'une Servlet abstract String getservletinfo() Informations sur la Servlet : Auteur, version, Retourne une chaîne en texte brut

Exemple compteur d'appels import java.io.*; import java.util.*; import javax.servlet.*; public class Hello implements Servlet { private int count; private ServletConfig config; } public void init(servletconfig config) throws ServletException { this.config=config; count=0; } public ServletConfig getservletconfig() { return this.config; } public String getservletinfo() { String t = "info sur la servlet"; return t; } public void service(servletrequest req, ServletResponse res) throws ServletException, IOException { count++; } public void destroy() {}

Paramètres d initialisation Paramètre pour une Servlet : Dans la définition de la Servlet Paramètre de l'application : <servlet> Lié à l'application complète et pas à une Servlet particulière <servlet-name>hello</servlet-name> <servlet-class>hello</servlet-class> <init-param> <param-name>message1</param-name> <param-value>niveau servlet</param-value> </init-param> </servlet> <context-param> <param-name>message2</param-name> <param-value>niveau application (contexte)</param-value> </context-param>

Paramètres d initialisation Récupération via ServletConfig Passé en paramètre à init() Ou récupéré ailleurs avec getservletconfig() private String message1; private String message2; public void init(servletconfig c) throws ServletException { super.init(c); message1 = c.getinitparameter("message1"); message2 = c.getservletcontext().getinitparameter("message2"); }

Concurrence Les Servlets sont potentiellement exécutées en parallèle (requête concurrentes) : Faire attention aux problèmes de synchronisation, type écriture dans un fichier par plusieurs clients en même temps En dehors du cadre du cours Remarques : SingleThreadModel déprécié Synchronized : ne pas utiliser sur la méthode service (pb de performances)

GENERIC SERVLET

Classe GenericServlet Une implémentation de Servlet et de ServletConfig. En pratique on utilise GenericServlet ou HttpServlet Versions de base des méthodes : Simplifie la conception La méthode service doit par contre être codée entièrement (et éventuellement getservletinfo) La méthode service utilise : ServletRequest ServletResponse

ServletRequest Récupération des valeurs des paramètres : String getparameter(string name) String[] getparametervalues(string name) import java.io.*; import java.util.*; import javax.servlet.*; public class Hello extends GenericServlet { public void service(servletrequest req, ServletResponse res) throws ServletException, IOException { String t = req.getparameter("test"); PrintWriter out = res.getwriter(); out.println(t + "<br />"); } }

ServletRequest Récupération des paramètres : Enumeration getparameternames() Map getparametermap() import java.io.*; import java.util.*; import javax.servlet.*; public class Hello extends GenericServlet { public void service(servletrequest req, ServletResponse res) throws ServletException, IOException { PrintWriter out = res.getwriter(); for (Enumeration e = req.getparameternames () ; e.hasmoreelements() ;) { out.println(e.nextelement()); } } }

ServletRequest autres méthodes Entête de la requête : int getcontentlength() String getcontenttype() String getprotocol() Contenu de la requête (transfert de fichier par ex.) ServletInputStream getinputstream() BufferedReader getreader()

ServletResponse Données à envoyer au client. Création du contenu : ServletOutputStream getoutputstream() PrintWriter getwriter() (Il faut choisir entre les deux). Création de l'entête (par exemple HTTP) : void setcontentlenght(int length) Taille du contenu, placé dans l'entête HTTP "Content-Length" void setcontenttype(string mime) void setcharacterencoding(string encoding)

Exemple : un compteur d'appels import java.io.*; import java.util.*; import javax.servlet.*; public class Hello extends GenericServlet { int count; public void init() throws ServletException { count=0; } } public void service(servletrequest req, ServletResponse res) throws ServletException, IOException { count++; res.setcontentlength(10); PrintWriter out = res.getwriter(); out.println(count + " appels et du texte qui ne va pas forcément s'afficher"); }

ServletResponse autres méthodes void setbuffersize(int size) / int getbuffersize() Taille du buffer avant envoi. Utile si on a beaucoup de données à envoyer. int flushbuffer() Force l'envoi au client void reset() Vide tout, entêtes inclus boolean iscommitted() Permet de savoir si la réponse a été envoyée

HTTPSERVLET

HttpServlet Sous-classe de GenericServlet spécifique pour le web : A utiliser dans la grande majorité des cas 2 méthodes à utiliser en remplacement de service() : void doget(httpservletrequest req, HttpServletResponse res) requêtes HTTP GET void dopost(httpservletrequest req, HttpServletResponse res) requêtes HTTP POST service() appelle automatiquement la bonne méthode en fonction du type de la requête Au moins une des deux doit être redéfinie L'une peut appeler l'autre si les traitements sont les mêmes.

Discussion client serveur Comme avant, on utilise les objets HttpServletRequest : pour la réception de données via la méthode getparameter() par exemple HttpServletResponse : pour l'envoi de données en créant un writer avec getwriter() par exemple

Un exemple import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Hello extends HttpServlet { public void doget(httpservletrequest req, HttpServletResponse res) throws ServletException, IOException { String value1 = req.getparameter("param1"); if(value1 == null) {...} } } PrintWriter out = res.getwriter(); out.println("bonjour"); out.flush();

Un autre exemple (version HTML) import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class Hello extends HttpServlet { } public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { response.setcontenttype("text/html"); PrintWriter out = response.getwriter(); } out.println( "<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.0 " + "Transitional//EN\">\n" + "<html>\n" + "<head><title>bonjour</title></head>\n" + "<body><h1>bonjour</h1></body></html>");

Informations sur la requête public void doget(httpservletrequest req, HttpServletResponse res) throws ServletException, IOException { res.setcontenttype("text/plain"); PrintWriter out = res.getwriter(); out.println("protocol: " + req.getprotocol()); out.println("scheme: " + req.getscheme()); out.println("servername: " + req.getservername()); out.println("serverport: " + req.getserverport()); out.println("remoteaddr: " + req.getremoteaddr()); out.println("remotehost: " + req.getremotehost()); out.println("method: " + req.getmethod()); out.println("requesturi: " + req.getrequesturi()); out.println("servletpath: " + req.getservletpath()); out.println("pathinfo: " + req.getpathinfo()); out.println("pathtranslated: " + req.getpathtranslated()); out.println("querystring: " + req.getquerystring()); out.println("remoteuser: " + req.getremoteuser()); out.println("authtype: " + req.getauthtype()); out.flush(); }

Redirection et inclusion Objectif : Utiliser d'autres servlets pour répondre au client : transfert de la requête à une autre requête ou inclusion de la réponse d'une autre servlet Transparent pour le client : tout se fait au niveau du serveur. Se fait via l interface RequestDispatcher et deux fonctions : forward(request,response) include(request,response) Pour obtenir un RequestDispatcher : getservletcontext().getrequestdispatcher(path)

Forward Faire suivre la requête à une autre servlet : Sert à rediriger uniquement Pas à inclure des choses avant ou après. protected void doget(httpservletrequest req, HttpServletResponse res) throws ServletException, IOException { } RequestDispatcher rd = req.getrequestdispatcher("hello"); rd.forward(req,res);

Include Inclure le résultat d'une autre requête. Permet d'inclure plusieurs résultats d'autres pages Attention aux ajouts de éventuels de balises <html> ou <body> par les servlets appelées. protected void doget(httpservletrequest req, HttpServletResponse res) throws ServletException, IOException { res.setcontenttype("text/html"); RequestDispatcher rd = req.getrequestdispatcher("hello"); rd.include(req, res); rd.include(req, res); }

Exemple import java.io.*; import java.util.*; import javax.servlet.*; public class Hello extends GenericServlet { boolean hasbeencalled = false; public void service(servletrequest req, ServletResponse res) throws ServletException, IOException { if(hasbeencalled) { PrintWriter out = res.getwriter(); out.println("ceci est affiché par la servlet fille"); this.hasbeencalled=false; } else { this.hasbeencalled=true; RequestDispatcher rd = req.getrequestdispatcher("hello.html"); rd.include(req, res); PrintWriter out = res.getwriter(); out.println("ceci est affiché par la servlet pere"); } } }

Remarques On perd du temps si on doit retaper les entêtes HTML à chaque fois : Créer des méthodes, attributs ou toute autre solution pour alléger le doget(); Passer au JSP : Seulement après avoir fait des servlets "à la main"

SERVLETS CONTEXTE ET SESSIONS

Problématique HTTP = protocole non connecté Chaque requête est indépendante des précédentes. Différent de Telnet, Ftp, Besoin de stocker des informations entre des requêtes successives Equivalent à être en mode connecté

Solutions avec les servlets Utilisation des cookies Réécriture d'url Ajouter des informations d'identification dans l'url Problème : taille, caractères autorisés, sécurité Utilisation de champs de formulaire "hidden" Mêmes problèmes Utilisation de ServletContext ou de HttpSession

Sauvegarde d'information Deux moyens de sauvegarder de l'information Contexte = configuration de la servlet Via l'objet ServletContext. Ou indirectement avec ServletConfig (cf fonction init). Méthodes pour obtenir la configuration, échanger des données Session = session HTTP HTTP est sans état, on maintient une session en faisant passer des informations d'un manière ou d'une autre (cookie, URL rewriting, )

ServletContext Obtenu par la méthode getservletcontext() On peut y placer des attributs void setattribute(string name, Object value) Stocke un objet quelconque accessible par son nom En récupérer Enumeration getattributenames() Liste les noms d'attributs disponibles dans le contexte Object getattribute(string name) Récupérer un objet par son nom Ou en supprimer void removeattribute(string name)

L objet session Simple avec l'api des servlets objet HttpSession Principe : Un objet "session" peut être associé à chaque requête Il va servir de "container" pour des informations persistantes Durée de vie limitée et réglable

Exemple de base HttpSession session = request.getsession(true); Caddy caddy = (Caddy) session.getvalue("caddy"); if(caddy!= null) { // le caddy n'est pas vide! affichelecontenuducaddy(caddy); } else { caddy = new Caddy(); caddy.ajouterunachat(request.getparameter("id")); session.putvalue("caddy", caddy); }

Méthodes de la classe HttpSession getid() Génération de l'identifiant de session isnew() Vrai si la session a été créée mais pas encore envoyée au navigateur. getcreationtime() / getlastaccessedtime() Heure de création de la session getmaxinactiveinterval() Durée de vie de la session invalidate() Supprime la session en cours

FILTRES

Principe Modification à la volée : Des entêtes et contenus Avant le passage de la requête à la Servlet Avant l'envoi de la réponse au client Exemples : Authentification Compression Encryption Conversion d'image Equivalent à un include

Exemple - Filtre Utilisation de dofilter : Transfère la requête au filtre/servlet suivant public class HelloFilter implements Filter { }... public void dofilter(servletrequest req, ServletResponse res, FilterChain chain) throws IOException, ServletException { PrintWriter out = res.getwriter(); out.println("avant Servlet"); chain.dofilter(req, res); } out.println("après Servlet");

Exemple web.xml... <filter> <filter-name>filtre inutile</filter-name> <filter-class>hellofilter</filter-class> </filter> <filter-mapping> <filter-name>filtre inutile</filter-name> <url-pattern>/*</url-pattern> </filter-mapping>...

LISTENERS

Les listeners Permet de suivre le cycle de vie d'une Servlet : Lié au contexte : Création/destruction : javax.servlet.servletcontextlistener Modification des attributs : javax.servlet.servletcontextattributelistener Lié à la Servlet : Création/destruction : javax.servlet.servletrequestlistener Modification des attributs : javax.servlet.servletrequestattributelistener Lié à la session http : Création/destruction : javax.servlet.httpsessionlistener Javax.servlet.HttpSessionAttributeListener Selon le Listener créé on peut observer différents événements

Exemple import javax.servlet.servletcontext; import javax.servlet.servletrequest; import javax.servlet.servletrequestevent; import javax.servlet.servletrequestlistener; import javax.servlet.http.httpservletrequest; public class RequestListener implements ServletRequestListener { private static long reqcount; public void requestinitialized(servletrequestevent sre) { ServletContext context = sre.getservletcontext(); HttpServletRequest request = (HttpServletRequest) sre.getservletrequest(); context.log("request.getrequesturi() + " : appels=" + ++reqcount); } } public void requestdestroyed(servletrequestevent sre) {}

Annotations Objectif : alléger le fichier web.xml Annotation mise avant la déclaration de la classe Plus de détails dans la doc Servlets : @WebServlet("/Test") Filtres : @WebFilter("/*") Listener : @WebListener

SERVLETS ET COOKIES

Manipuler les cookies Tout est inclus dans l API des servlets : Méthode addcookie(cookie) de HttpServletResponse Ajoute le cookie à la réponse (pour stockage chez le client) Méthode getcookies() de HttpServletRequest Retourne tous les cookies envoyés par le client Classe Cookie pour créer des cookies : Cookie(String name, String value)

Méthodes de la classe Cookie String getvalue() / void setvalue(string) Valeur contenue dans le cookie String getname() Nom du cookie String getcomment() / void setcomment(string) Ajout d'un commentaire sur le cookie int getmaxage() / void setmaxage(int) Durée de vie du cookie en secondes Par défaut -1 : jusqu'à la fin de la session courante

Récupération des cookies public class Hello extends HttpServlet { int count=0; private static String getcookievalue(cookie [] cookies, String cookiename, String defaultvalue) { for(int i=0 ; i < cookies.length ; i++) if(cookiename.equals(cookies[i].getname())) return(cookies[i].getvalue()); return(defaultvalue); } public void doget(httpservletrequest request, HttpServletResponse response) throws ServletException, IOException { Cookie [] cookies = request.getcookies(); String cookiename="nom"; String cookievalue = getcookievalue(cookies, cookiename, "inconnu"); PrintWriter out = response.getwriter(); out.println("contenu du cookie " + cookiename + " : " + cookievalue); response.addcookie(new Cookie("nom",String.valueOf(++count))); } }