Vous êtes sur la page 1sur 46

Servlet

Pierre-Alexandre Filliolaud 2011 efrei@filliolaud.net

Qu est ce qu une Servlet ?


Elment d une architecture J2EE Classe Java ct serveur charge et excute par un conteneur de servlet Reoit une requte HTTP d un client (navigateur web), la traite et retourne une rponse HTTP Livre compile dans la WebArchive (.war, .ear) Stocke dans le rpertoire WEB-INF/classes de l application

Conteneur Servlet (Contrleur)


Thread java Servlet.java HelloServlet.java

Navigateur Web

Serveur dapplication Web avec conteneur JSP

Caractristiques
Portabilit
Compatible avec tous les serveurs d application Java EE (Java Enterprise Edition, anciennement J2EE) : Tomcat, JBoss, WebLogic, Jonas

Puissance
Mise disposition des API Java Typage Java Gestion des erreurs par exception Gestion des sessions

Dure de vie
Charge qu une seule fois (au lancement du serveur d application) Multithread
3

Exemple Servlet : Hello


Exemple de servlet
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 { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out .println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); <HEAD><TITLE>A Servlet</TITLE></HEAD>"); <BODY>"); Hello World! "); out.println("<HTML>"); out.println(" out.println(" out.print("

out.print(this.getClass()); out.println(", using the GET method"); out.println(" out.flush(); out.close(); } } </BODY>"); out.println("</HTML>");

Architecture fondamentale d une servlet

Selon les spcifications Sun, une servlet doit implmenter l interface Servlet et ServletConfig L API Servlet offre deux implmentations
GenericServlet : pour la conception de Servlets indpendantes du protocole HttpServlet : pour la conception de Servlets spcifiques au protocole HTTP

API Servlet : GenericServlet

Une servlet qui hrite de GenericServlet est une Servlet indpendante du protocole GenericServlet doit obligatoirement implmenter la mthode service(), point principal d entre.

API Servlet : HttpServlet

HttpServlet redfinit la mthode service() pour rpondre aux requtes HTTP La mthode service() appelle la mthode doXxx() correspondate au type de la requte envoye (GET,POST,) Il faut dont redfinir les mthodes doGet() et/ ou doPost()
Conteneur de Servlet 1 Requte GET/POST 2 service()

Navigateur Web

4 Rponse HTTP

3 MaServlet doGet()/ doPost()

2 service() HttpServlet

API Servlet : mthodes de HttpServlet


Mthode doXxx()
Plusieurs mthodes pour traiter les diffrents types de requtes HTTP (GET,POST,) Mthodes de traitement de requtes doXxx()
doGet() mthode pour traiter les requtes de type GET doPost () mthode pour traiter les requtes de type POST doHead(),doTrace()

Objects requte et response de doXxx()


HttpServletRequest : objet qui encapsule la requte envoye au serveur, appel request HttpResponse : objet qui encapsule la rponse au client, appel response

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 { ... } public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { ... } }

HttpServletRequest : objet requte


HttpServletRequest hrite de ServletRequest Encapsule la requte HTTP, fournit des mthodes pour accder aux informations
du client du serveur

Mthodes :
String getMethod() : retourne le type de requte (POST, GET, ...) String getServeurName() : retourne le nom du serveur String getParameter(String name) : retourne la valeur d'un paramtre, le paramtre doit tre une chaine de caractres String[] getParameterNames() : retourne le nom de tous les paramtres String getRemoteHost() : retourne l'IP du client String getServerPort() : retourne le port sur lequel le serveur coute String getQueryString() : retourne la chane d 'interrogation cf API Servlet

HttpServletRequest : objet requte (suite)


Exemple: Servlet affichant les informations de l objet HttpServletRequest
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class InfosServlet 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.01 Transitional//EN\"><HTML><HEAD><TITLE>A Servlet</TITLE></HEAD><BODY>"); out.print(" This is "+this.getClass()+", using the GET method<br>"); out.println("Protocol: " + request.getProtocol()+"<br>"); out.println("Scheme: " + request.getScheme()+"<br>"); out.println("ServerName: " + request.getServerName()+"<br>"); out.println("ServerPort: " + request.getServerPort()+"<br>"); out.println("RemoteAddr: " + request.getRemoteAddr()+"<br>"); out.println("RemoteHost: " + request.getRemoteHost()+"<br>"); out.println("Method: " + request.getMethod()+"<br>"); out.println(" out.flush(); out.close(); } } </BODY></HTML>");

10

HttpServletResponse : objet response (suite)


HttpServletResponse hrite de ServletResponse Construit la rponse HTTP renvoye au client Contient :
les mthodes ncessaires pour dfinir le type de contenu,en-tte et code de retour deux mthodes pour renvoyer des donnes (HTML ou binaire) au navigateur Web du client

Mthodes :
void setStatus(int) : dfinit le code de retour de la rponse void setContentType(String) : dfinit le type de contenu MIME ServletOutputStream getOutputStream() : flot pour envoyer des donnes binaires au client ServletOutputStream getWriter() : flot pour renvoyer des donnes HTML au client void sendRedirect(String) : redirige le navigateur vers l'URL donne

11

HttpServletResponse : objet response (suite)


Exemple: Servlet affichant avec un flux de donnes envoy de type HTML
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class ResponseServet 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.01 Transitional//EN\">"); out.println("<HTML>"); out.println(" out.println(" out.print(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); <BODY>"); Sample code: this is ");

out.print(this.getClass()); out.println(", using the GET method"); out.println(" out.flush(); out.close(); } } </BODY>"); out.println("</HTML>");

12

HttpServletResponse : objet response (suite)


Exemple: Servlet de redirection
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class RedirectionServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.sendRedirect("http://www.efrei.fr"); } }

13

HttpServletResponse : objet response (suite)


Exemple: Servlet pour tlcharger un fichier stock sur le serveur
import java.io.*; import javax.servlet.*; import javax.servlet.http.*; public class DownloadFileServlet extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { try{ //fichier stock sur le serveur InputStream is=new FileInputStream("c:\\test.txt"); OutputStream out=response.getOutputStream(); response.setContentType("application/text"); response.setHeader("Content-Disposition","attachment; filename=file.txt"); int count; byte buf[] = new byte[4096]; while ((count = is.read(buf)) > -1){ out.write(buf, 0, count); } is.close(); out.close(); } catch (Exception e) { //probleme } }

14

Formulaire JSP - Servlet


Page JSP contenant un formulaire HTML avec la balise <FORM></FORM>
Attribut method : POST ou GET Attribut action : URL o les donnes du formulaire sont envoyes Tous les composants de saisie sont placer entre les balises
<FORM method="" action=""> </FORM>

Utilisation des balises <INPUT>,<TEXTAREA><SELECT> pour stocker l information


NE PAS OUBLIER DE METTRE UN NOM AU COMPOSANT DANS L ATTRIBUT NAME

Les donnes sont envoyes aprs un clique sur le bouton de type submit Pour accder aux paramtres dans la servlet via l objet request
String getParameter(String code) : retourne la valeur du paramtre code String[] getParamterValues(String code) : retourne les valeurs du paramtre code, utile lorsque plusieurs composants portent le mme nom

15

Formulaire JSP - Servlet

<body> <FORM action="/MyProject/servlet/GetCustomerInfo" method="post"> Name :<INPUT type="text" name="customerName" value="insert your name here"><br> EMail :<INPUT type="text" name="customerEmail" size="60"><br> Type : M/F<INPUT type="radio" name="customerType" value="M"><INPUT type="radio" name="customerType" value="F"><br> Country : <SELECT name="customerCountry"> <OPTION value="DE">Allemagne</OPTION> <OPTION value="IT">Italie</OPTION> <OPTION value="FR">France</OPTION> <OPTION value="US">Etats Unis</OPTION> </SELECT><BR> Sign me up to receive your newsletter <INPUT type="checkbox" name="customerNewsLetter" value="Y" checked="checked"><BR> <INPUT type="submit" value="send"> </FORM> </body>

Exemple: Formulaire JSP de type POST

16

Formulaire JSPtype POST Servlet (suite) Exemple (suite): Formulaire JSP de


import javax.servlet.ServletException; import javax.servlet.http.*; import com.yourcompany.bean.Customer; public class GetCustomerInfo extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Customer customer=new Customer(); customer.setName(request.getParameter("customerName")); customer.setMen(Boolean.parseBoolean(request.getParameter("customerType"))); customer.setNewsletter(Boolean.parseBoolean(request.getParameter("customerNewsLetter"))); customer.setCountryCode(request.getParameter("customerCountry")); customer.setEmail(request.getParameter("customerEmail")); response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<!DOCTYPE HTML PUBLIC \"-//W3C//DTD HTML 4.01 Transitional//EN\">"); out.println("<HTML>"); out.println(" out.println(" <HEAD><TITLE>A Servlet</TITLE></HEAD>"); <BODY>"); out.print(" Mr "); }else{ out.print(" Mrs "); } if(customer.isNewsletter()){ out.print(customer.getName()+", you will receive our newsletter on "+customer.getEmail()); }else { out.print(customer.getName()+", you will not receive our newsletter on "+customer.getEmail()); } out.println(" out.flush(); out.close(); }} </BODY>"); out.println("</HTML>");

if(request.getParameterValues("customerType")[0].equals("M")){

17

Exemple : Renvoi vers une page JSP partir d une servlet avec des informations en request

Rponse Servlet- JSP

import javax.servlet.ServletException; import javax.servlet.http.*; import com.yourcompany.bean.Customer; public class GetCustomerInfo extends HttpServlet { public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { Customer customer=new Customer(); customer.setName(request.getParameter("customerName")); customer.setMen(Boolean.parseBoolean(request.getParameter("customerType"))); customer.setNewsletter(Boolean.parseBoolean(request.getParameter("customerNewsLetter"))); customer.setCountryCode(request.getParameter("customerCountry")); customer.setEmail(request.getParameter("customerEmail")); request.setAttribute("customer",customer); if(request.getParameter("customerNewsLetter").equals("Y")){ request.getRequestDispatcher("/jsp/coursServlet/confirmation.jsp").forward(request,response); }else { request.getRequestDispatcher("/jsp/coursServlet/infoCustomer.jsp").forward(request,response); } }}

confirmation.jsp
<%Customer user=(Customer)request.getAttribute("customer"); %> <%=user.getName()%>,you are registered.

infoCustomer.jsp
<%Customer user=(Customer)request.getAttribute("customer"); %> <%=user.getName()%>,you are NOT registered.

18

Architecture d une application WEB


Une application Web peut contenir plusieurs Servlets Le serveur d application doit contenir un conteneur de Servlets ou moteur de Servlet Le conteneur ralise le lien entre la Servlet et le serveur Web
Transforme le code Java en code HTML Associe chaque URL virtuelle (Uniform Resource Locator) une servlet

Conteneur Servlet (Contrleur)


Thread java /MyProject/Servlet /MyProject/HelloServlet /MyProject/servlet/* Servlet.java HelloServlet.java

Navigateur Web

Serveur dapplication Web avec conteneur JSP

19

Architecture d une application WEB


Chaque application Web est contenue dans un rpertoire physique sur le serveur d application

Architecture de travail de l application Web


Source *.java non livre dans la WebArchive *.war,*.ear

Hirarchie sur le serveur dapplication

Fichier Web: *.jsp, images


context.xml *.class

Paramtrage du context via le fichier context.xml

Classes (bytescode) des Servlets

*.jar,*.class web.xml *.tld

Bibliothque (API) *.jar,*.class Exemple: framework struts.jar Fichier de configuration de lapplication Web au format XML

20

Descripteur de dploiement
Chaque application Web contient un dcripteur de dploiement stock dans /WEB-INF.web.xml Utilisation du format XML
eXtensible Markup Language Syntaxe universelle pour la structuration des donnes cre par le World Wide Web Consortium (W3C) en 1996 Langage bas sur des balises permettant de crer une information structure Extensible par la possibilit de crer de nouvelles balises Balises XML sensible la case et la rigueur (balise ouvrante balise fermante) La structure du document est dfini par un fichier XSD (XML Schema Description) <?xml version="1.0" encoding="UTF-8"?> <web-app xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/ 2001/XMLSchema-instance" version="2.4" xsi:schemaLocation="http://java.sun.com/ xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd"> <servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>HelloWorld</servlet-name> <servlet-class>com.yourcompany.web.servlet.HelloWorld</servlet-class> </servlet> <servlet-mapping> <servlet-name>HelloWorld</servlet-name> <url-pattern>/servlet/HelloWorld</url-pattern> </servlet-mapping> </web-app>

Description de la servlet

Dfinition du chemin virtuel

21

Descripteur de dploiement (suite)


Sous lments de la racine <web-app> du descripteur web.xml
icon : chemin d acces une icne display-name : nom affich dans un outil de gestion de WebApplication description : description de l application distributable : indique si l application peut tre distribue sur plusieurs serveur d application (clustering) context-param : contient les valeurs des paramtres valables pour l application filter : dfinit une classe filtre qui sera appele avant la Servlet filter-mapping : dfini un alias sur un filtre listener : dfinit une classe de listener qui sera appele par le conteneur la venue d un vnement particulier servlet : dfinit une Servlet par son nom et sa Classe servlet-mapping : dfinit un alias pour une Servlet session-config : dfinit un dlais maximal d inactivit pour les sessions mime-mapping : dfinit une association entre les fichiers publics de l application et des types MIME welcome-file-list : dfinit la ressource retourner par dfaut si aucune ressource n est spcifie error-page : dfinit la page d erreur retourner au client si une erreur particulire se produit taglib : dfinit l emplacement des bibliothques de balises resource-env-ref : configure une ressource externe qui peut tre utilise par la servlet resource-ref : configure une ressource externe qui peut tre utilise par la servlet security-constraint : dcrit les rles des utilisateurs pouvant accder l application Web login-config : configure la mthode d authentification security-role : dfinit un rle de scurit pour l application env-entry : dfinit le nom d une resource accessible grce l interface JNDI ejb-ref : dfinit une rfrence distante un Enterprise Java Bean (EJB) ejb-local-ref : dfinit une rfrence locale un EJB

22

Cycle de vie des Servlets


Cration et initialisation de la servlet
Utilisation de paramtres initiaux
Dbut

Traitement des services demands par les clients (au travers de la mthode service()) Destruction de la servlet et passage au ramasse miettes de la machine virtuelle Entre chaque requte du client les servlets persistent sous forme d instances d objet Au moment o le code d une servlet est charg, le serveur ne cre qu une seule instance de classe L instance (unique) traite chaque requte effectue sur la servlet Les avantages :
L empreinte mmoire reste petite Le surcot en temps li la cration d un nouvel objet pour la servlet est limin La persistance est possible c est--dire la possibilit de conserver l tat de l objet chaque requte (exemple d un compteur)

Chargement et instantiation

Init() Initialise Prte pour le service Fin du thread de la requte Service

Traitement de la requte

Exemple compteur
Fin de vie

public class CountServlet extends HttpServlet { private int count=0; 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.01 Transitional//EN\">"); out.println("<HTML><HEAD><TITLE>A Servlet</TITLE></HEAD><BODY>"); out.print("count :"+count++); out.println(" </BODY></HTML>"); out.flush(); out.close();

Fin, la servlet nexiste plus

23

Cycle de vie des Servlets (suite)


Le rechargement d une servlet a lieu quand il y a :
Modification d au moins une classe de l application WEB Demande explicite de l administrateur du serveur Web Redmarrage du conteneur de Servlets

Remarque :
le conteneur ne s intresse qu aux servlets, si vous modifiez autre chose qu une servlet il n y aura aucun rechargement implicite de Servlet Exemple framework (Struts..)

24

Cycle de vie des Servlets :mthode init ()


Il n y a pas de constructeur dans une Servlet L initialisation des attributs se fait par l intermdiaire de la mthode init()
Pas de paramtre en entre Dfinie et implmente dans la classe abstraite GenericServlet Lorsque du dmarrage du conteneur de Servlet Lors de la premire requte la servlet Sur demande explicite de l administrateur de serveur Web

Peut tre appel

Exemple Servlet compteur

public class CountServlet extends HttpServlet { private int count=0; public void init() throws ServletException { count=100; } 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.01 Transitional//EN\">"); out.println("<HTML><HEAD><TITLE>A Servlet</TITLE></HEAD><BODY>"); out.print("count :"+count++); out.println(" </BODY></HTML>"); out.flush(); out.close(); } }

25

Cycle de vie des Servlets :mthode init () (suite)


Possibilit d utiliser les paramtres dfinis dans le descripteur de dploiement web.xml dans la balise <init-param>
<?xml version="1.0" encoding="UTF-8"?> <web-app . <servlet> <description>This is the description of my J2EE component</description> <display-name>This is the display name of my J2EE component</display-name> <servlet-name>CountServlet</servlet-name> <servlet-class>com.yourcompany.web.servlet.CountServlet</servlet-class> <init-param> <param-name>init_value</param-name> <param-value>200</param-value> <description>Init count</description> </init-param> </servlet> <servlet-mapping> <servlet-name>HelloWorld</servlet-name> <url-pattern>/servlet/HelloWorld</url-pattern> </servlet-mapping> </web-app> public class CountServlet extends HttpServlet { private int count=0; public void init() throws ServletException { count=Integer.parseInt(this.getInitParameter("init_value")); } 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.01 Transitional//EN\">"); out.println("<HTML><HEAD><TITLE>A Servlet</TITLE></HEAD><BODY>"); out.print("count :"+count++); out.println(" </BODY></HTML>"); out.flush(); out.close(); } }

26

Cycle de vie des Servlets :mthode destroy ()


La mthode destroy() est appele lorsque le conteneur doit supprimer la servlet
Servlet arrte Cas de ServletException

Tous les threads en cours doivent tre termins avant l appel de destroy() Utilis pour librer toutes les ressources que la Servlet a acquise et qui ne pourront tre passes au ramasse miette Exemple de resources :
Connexion une base de donnes Ouverture d un fichier sur le disque serveur

La mthode destroy() donne une dernire chance d crire les informations qui ne seront pas encore sauvegard La mthode destroy() est galement utilise pour crire les informations persistantes qui seront lues lors du prochain appel init() Une fois cette mthode appele, le conteneur ne doit plus transmettre de requte la Servlet Exemple

public class CountServlet extends HttpServlet { private int count=0; public void destroy() { super.destroy(); // Just puts "destroy" string in log } 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.01 Transitional//EN\">"); out.println("<HTML><HEAD><TITLE>A Servlet</TITLE></HEAD><BODY>"); out.print("count :"+count++); out.println(" </BODY></HTML>"); out.flush(); out.close(); } }

27

Suivi de session
Le protocole HTTP est un protocole sans tat Impossibilit de garder des informations d une requte l autre (identifier un client l autre) Obligation d utiliser diffrentes solutions pour y remdier
Authentifier l utilisateur Champs de formulaire cachs Rcriture d URL Cookies persistants Suivi de Session

28

Cookies persistants : Cookie


Un cookie est une information envoye un client (navigateur) par un serveur WEB qui peut ensuite tre relue par le client Lorsqu un client reoit un cookie, il le sauve et le renvoie ensuite au serveur chaque fois qu il accde une page sur ce serveur La valeur d un cookie pouvant identifier de faon unique un client, ils sont souvent utiliss pour le suivi de session Les cookies ont t introduits par la premire fois dans Netscape Navigator
home.netscape.com/newsref/std/cookie_spec.html www.cookie-central.com Cookie(String name, String value) : construit un cookie String getName() : retourne le nom du cookie String getValue() : retourne la valeur du cookie setValue(String new_value) : donne une nouvelle valeur au cookie setMaxAge(int expiry) : spcifie l ge maximum du cookie addCookie(Cookie mon_cook) : ajoute la rponse un cookie Cookie[] getCookies() : rcupre l ensemble des cookies du site

L API Servlet fournit la classe javax.servlet.http.Cookie pour travailler avec les Cookies

Pour la cration d un nouveau cookie, il faut l ajouter la rponse (HttpServletResponse)


La Servlet rcupre les cookies du client en exploitant la rponse (HttpServletRequest) Code pour crer un cookie et l ajouter au client Code pour rcuprer les cookies

Cookie cookie = new Cookie("Id", "123"); res.addCookie(cookie);

Cookie[] cookies = req.getCookies(); if (cookies != null) { for (int i = 0; i < cookies.length; i++) { String name = cookies[i].getName(); String value = cookies[i].getValue(); } }

29

Cookies persistants : Cookie


Exemple : Servlet qui permet la gestion de session (identifier un client d un autre) par l intermdiaire des cookies persitants
public class CookiesServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { ... String sessionId = null; Cookie[] cookies = req.getCookies(); if (cookies != null) { for (int i = 0; i < cookies.length; i++) { if (cookies[i].getName().equals("sessionid")) { sessionId = cookies[i].getValue(); } } } if (sessionId = null) { sessionId = new java.rmi.server.UID().toString(); Cookie c = new Cookie("sessionid", sessionId); res.addCookie(c); out.println("Bonjour le nouveau"); } else { out.println("Encore vous"); ... } } }

Le plus gros problme des cookies est que les navigateurs ne les acceptent pas toujours L utilisateur peut configurer son navigateur pour qu il refuse ou pas les cookies Les navigateurs n acceptent que 20 cookies par site, 300 par utilisateur et la taille d un cookie peut tre limite 4096 octets
30

Suivi de session : HttpSession


Solutions : utilisation de l API de suivi de session javax.servlet.http.HttpSession Mthodes de cration lies la requte (HttpServletRequest) HttpSession getSession() : retourne la session associe l utilisateur HttpSession getSession(boolean p) : cration selon la valeur de p Gestion d association (HttpSession) Enumeration getAttributNames() : retourne les noms de tous les attributs Object getAttribut(String name) : retourne l objet associ au nom setAttribut(String na, Object va) : modifie na par la valeur va removeAttribut(String na) : supprime l attribut associ na Destruction (HttpSession) invalidate() : expire la session logout() : termine la session Exemple : Servlet qui permet d utiliser la suivi de session pour un compteur

public class HttpSessionServlet extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { res.setContentType("text/plain"); PrintWriter out = res.getWriter(); HttpSession session = req.getSession(); Integer count = (Integer)session.getAttribute("count"); if (count == null) count = new Integer(1); else count = new Integer(count.intValue() + 1); session.setAttribute("count", count); out.println("Vous avez visit cette page " + count + " fois."); } }

31

Collaboration de Servlets
Les Servlets s excutant dans le mme serveur peuvent dialoguer entre elles Deux principaux styles de collaboration Partage d information : un tat ou une ressource. Exemple : un magasin en ligne pourrait partager les informations sur le stock des produits ou une connexion une base de donnes Partage du contrle : une requte. Rception d une requte par une Servlet et laisser l autre Servlet une partie ou toute la responsabilit du traitement

Impossible de communiquer avec des servlets de serveurs diffrents

32

Collaboration de Servlets : partage d information


La collaboration est obtenue par l interface ServletContext L utilisation de ServletContext permet aux applications web de disposer de son propre conteneur d informations unique Une Servlet retrouve le ServletContext de son application web par un appel getServletContext() Exemples de mthodes : void setAttribute(String name, Object o) : lie un objet sous le nom indiqu Object getAttribute(String name) : retrouve l objet sous le nom indiqu Enumeration getAttributeNames() : retourne l ensemble des noms de tous les attributs lis void removeAttribute(String name) : supprime l objet li sous le nom indiqu

33

Collaboration de Servlets : partage d information (suite)


Exemple : Servlets qui vendent des pizzas et partagent une spcialit du jour
public class PizzasAdmin extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/plain"); PrintWriter out = response.getWriter(); ServletContext context = this.getServletContext(); context.setAttribute("Specialite", "Jambon Fromage"); context.setAttribute("Date", new Date()); out.println("La pizza du jour a t dfinie."); } }

public class PizzasClient extends HttpServlet { protected void doGet(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); ServletContext context = this.getServletContext(); String pizza_spec = (String)context.getAttribute("Specialite"); Date day = (Date)context.getAttribute("Date"); DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM); String today = df.format(day); out.println("Aujourd'hui (" + today + "), notre specialite est : " + pizza_spec); } }

34

Collaboration de Servlets : partage d information (suite)


Possibilit de partager des informations entre contextes web Premire solution : utilisation d un conteneur d informations externes (une base de donnes par exemple) Seconde solution : la Servlet recherche un autre contexte partir de son propre contexte ServletContext getContext(String uripath) : obtient le contexte partir d un chemin URI (uripath = chemin absolu)

Conteneur Servlet (Contrleur)


Servlet 2

Servlet 1

Thread java
Servlet 3

Servlet 4

Communiction par contexte

Navigateur Web

Serveur dapplication Web avec conteneur JSP

35

Collaboration de Servlets : partage d information (suite)


Exemple : permet d afficher la spcialit du jour de l application web prcdente
public class LireSharePizzas extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); ServletContext my_context = this.getServletContext(); ServletContext pizzas_context = my_context.getContext("/SharePizzasServlet"); String pizza_spec = (String)pizzas_context.getAttribute("Specialite"); Date day = (Date)pizzas_context.getAttribute("Date"); DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM); String today = df.format(day); out.println("Aujourd'hui (" + today + "), notre specialite est : " + pizza_spec); } }

36

Collaboration de Servlets : partage de contrle


Les Servlets peuvent partager ou distribuer le contrle de la requte Deux types de distribution Distribuer un renvoi : une Servlet peut renvoyer une requte entire Distribuer une inclusion : une Servlet peut inclure du contenu gnr Les avantages sont : La dlgation de comptences Une meilleure abstraction et une plus grande souplesse Architecture logicielle MVC (Servlet = contrle et JSP = prsentation) Le support de la dlgation de requte est obtenu par l interface RequestDispatcher Une Servlet obtient une instance sur la requte (ServletRequest) RequestDispatcher getRequestDispatcher(String path) : retourne une instance de type RequestDispatcher par rapport un composant Un composant peut-tre de tout type : Servlet, JSP, fichier statique, path est un chemin relatif ou absolu ne pouvant pas sortir du contexte Pour distribuer en dehors du contexte courant il faut : Identifier le contexte extrieur (utilisation de getContext()) Utiliser la mthode getRequestDispatcher(String path) Le chemin est uniquement en absolu 37

Partage du contrle : distribuer un renvoi


La mthode forward(...) de l interface RequestDispatcher renvoie une requte d une Servlet une autre ressource sur le serveur void forward(ServletRequest request, ServletResponse response) : redirection de requte
RequestDispatcher dispat =request.getRequestDispatcher("/index.html"); dispat.forward(request,response);

Exemple p18 Possibilit de transmettre des informations lors de la distribution en attachant une chane d interrogation (au travers de l URL) en utilisant les attributs de requte via la mthode setAttribute(...) Les choses ne pas faire ... ne pas effectuer de modification sur la rponse avant un renvoi ne rien faire sur la requte et la rponse aprs une distribution d un renvoi

38

Partage du contrle : distribuer un renvoi


Exemple : permet de distribuer un renvoi de Emetteur Recepteur
public class Emetteur extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { request.setAttribute("seconde", "au revoir"); RequestDispatcher dispatcher = request.getRequestDispatcher("/servlet/ recepteur.html?mot=bonjour"); dispatcher.forward(request,response); } } public class Recepteur extends HttpServlet { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/plain"); PrintWriter out = response.getWriter(); out.println(request.getParameter("mot")); out.println(request.getAttribute("seconde")); } }

Nous avons vu au dbut de cette partie qu il existait une mthode de redirection sendRedirect() est une redirection effectue par le client forward() est une redirection effectue par le serveur Est-il prfrable d utiliser forward() ou sendRedirect() ??? forward() est utiliser pour la partage de rsultat avec un autre composant sur le mme serveur sendRedirect() est utiliser pour des redirections externes car aucune 39 recherche getContext(...) n est ncessaire

Partage du contrle : distribuer une inclusion


La mthode include() de l interface RequestDispatcher inclut le contenu d une ressource dans la rponse courante
RequestDispatcher dispat = request.getRequestDispatcher("/index.html"); dispat.include(request,response);

La diffrence avec une distribution par renvoi est : la Servlet appelante garde le contrle de la rponse elle peut inclure du contenu avant et aprs le contenu inclus Possibilit de transmettre des informations lors de la distribution en attachant une chane d interrogation (au travers de l URL) en utilisant les attributs de requte via la mthode setAttribute(...) Les choses ne pas faire ... ne pas dfinir le code d tat et les en-ttes (pas de setContentType()) supprimer les balises <HTML> et <BODY>

40

Partage du contrle : distribuer une inclusion


Exemple : permet de distribuer une inclusion
public class Regroupage extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { response.setContentType("text/html"); PrintWriter out = response.getWriter(); out.println("<HTML><BODY>"); RequestDispatcher dispat = request.getRequestDispatcher("/servlet/Inclus"); dispat.include(request,response); out.println("<br>"); request.setAttribute("bonjour", "Bonjour"); dispat.include(request,response); out.println("<br>"); request.setAttribute("bonsoir", "Bonsoir"); dispat.include(request,response); out.println("<br>"); out.println("</BODY></HTML>"); } } public class Inclus extends HttpServlet { protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { PrintWriter out = response.getWriter(); if(request.getAttribute("bonjour") != null) { out.println(request.getAttribute("bonjour")); if (request.getAttribute("bonsoir") != null) { out.println(request.getAttribute("bonsoir")); } else { out.println("Pas Bonsoir"); } } else { out.println("Rien de rien"); } }

41

Servlet 3.0 - JSR 315: Annotations


@WebServlet
Dfinit un Servlet Dfinit le mapping du Servlet Configuration: load-on-startup, init-params, etc
@WebServlet(name=MonServlet, urlPatterns={"/path1", "/path2"}) public class MonServlet extends HttpServlet{ public void doGet(HttpServletRequest req, HttpServletResponse Res) { .. } }

@WebFilter
Dfinit un filtre Dfinit mapping (urlPatterns, servletNames, dispatcherTypes) Configration des initParams
@WebFilter(/path) public class MonFiltre implements Filter { Res) public void doFilter(HttpServletRequest req, HttpServletResponse { } }

42

Servlet 3.0 : Annotations


@WebListener
Dfinit un listener Sur tous les types de listeners
@WebListener public class MonListener implements ServletContextListener{ public void contextInitialized(ServletContextEvent sce) { ... } }

@ServletSecurity
Dfinit des contraintes de scurit Attention: attach une classe ! Assez intuitif
@WebServlet(name=MonServlet, urlPatterns={"/path1", "/path2"}) @ServletSecurity(@HttpConstraint(rolesAllowed={"user", "guest"}), httpMethodConstraints=@HttpMethodConstraint("POST", rolesAllowed={"admin"})) public class MonServlet extends HttpServlet ........

@MultipartConfig
Sur un Servlet Configuration des fonctions d'envoi de fichiers Voir API correspondante 43

Web fragment

Servlet 3.0 : Nouveauts

Fichier /META-INF/web-fragment.xml Similaire web.xml Element racine <web-fragment> au lieu de <web-app> Fusionn dans web.xml suivant un ordre configurable Nom logique associ au fragment (lment <name>)

Ordre absolu
Dans web.xml, lment <absolute-ordering> Liste de noms de fragments Element spcial <others/>

<web-app> <name>MonApplication</name> <absolute-ordering> <name>Fragment2</name> <name>Fragment1</name> <others/> <name>Fragment3</name> </absolute-ordering> .... </web-app>

Requtes asynchrones : Async


Permet de dmarrer un processus asynchrone Ensuite, d'utiliser un callback du container ... qui va rinvoquer un Servlet pour finir le traitement Avantage: meilleure scalabilit 44 Attention: ceci n'est pas de l'IO non bloquante, ni spcifique HTTP (et peut fonctionner avec java.io, AJP, etc)

Rfrences
http://java.developpez.com/cours/ http://java.developpez.com/faq/javaee/ http://tahe.developpez.com/java/web/ Servlet 3.0 : http://www.jcp.org/en/jsr/summary?id=315

45

Questions/Rponses

46