Servlet
Servlet
Servlet
Servlets
Creative Commons
Contrat Paternité
Partage des Conditions Initiales à l'Identique
2.0 France
keulkeul.blogspot.com
http://creativecommons.org/licenses/by-sa/2.0/fr
Servlets et API
Architecture de développement
Cycle de vie
Suivi de session
Collaboration de Servlets
keulkeul.blogspot.com
Sécurité : authentification
Processus principal
Réponse HTTP
Requête HTTP
Conteneur de Servlets
Servlet
Servlet11
Servlet
Servlet22
Client WEB
Servlet
Servlet33
Thread
Applet (SWING)
Téléphone portable (WAP)
Navigateur (HTML)
Servlets - M. Baron - Page 6
Puissance des Servlets
Portabilité
Technologie indépendante de la plate-forme et du serveur
Un langage (Java) et plusieurs plate-forme (.NET plusieurs langages
et une plate-forme)
Puissance
Disponibilité de l’API de Java
Manipulation d’images, connectivité aux bases de données (JDBC), …
Efficacité et endurance
Une Servlet est chargée une seule fois (CGI chargée puis déchargée
après utilisation)
keulkeul.blogspot.com
out.println("<HTML>");
out.println("<HEAD><TITLE>Bonjour tout le monde</TITLE></HEAD>");
out.println("<BODY>");
out.println("<BIG>Bonjour tout le monde</BIG>");
keulkeul.blogspot.com
out.println("</BODY></HTML>");
}
}
requête
keulkeul.blogspot.com
service(...)
réponse
réponse
requête GET doGet(...)
keulkeul.blogspot.com
service(...)
réponse doPost(...)
requête POST
HelloWorldError.java
du projet
keulkeul.blogspot.com
HelloWorldServlet
InfosServlet.java du
projet InfosServlet
Exemples de méthodes
void setStatus(int) : définit le code de retour de la réponse
keulkeul.blogspot.com
out.println("Premier Message");
out.println("Coucou voilà comment écrire un message");
out.println("Second Message");
}
}
keulkeul.blogspot.com
HelloWorldPrintWriter.java
du projet HelloWorld
SendRedirect.java du
projet HelloWorld
keulkeul.blogspot.com
int count;
byte buf[] = new byte[4096];
while ((count = is.read(buf)) > -1)
os.write(buf, 0, count);
keulkeul.blogspot.com
is.close();
os.close(); En-tête de la réponse
} catch (Exception e) { adaptée pour retourner
// Y a un problème. un fichier
}
} DownloadFileServlet.java du
} projet DownloadFileServlet
if (count > 0) {
resp.setHeader("Refresh","1"); Toutes les 1 seconde
count-- la page est rechargée
out.println(count + "...");
et cela 10 fois de suite
} else {
out.println("Fin");
}
}
keulkeul.blogspot.com
PullClientServlet.java du projet
PullClient
}
out.println("Content-Type: text/plain");
out.println(); Connexion fermée
out.println("Fin"); réponse envoyée au
out.println("--End--");
out.flush(); client
}
} PushServerServlet.java du
projet PushServer Servlets - M. Baron - Page 23
Servlets et formulaires : du coté HTML
<body>
<p>Formulaire de satisfaction du cours Servlet/JSP </p> Le formulaire appelle
<form name="form1" method="get" action="form.html">
<p> une Servlet avec une
Nom : <input type="text" name="nom">
Prénom : <input type="text" name="prenom"> requête de type GET
</p>
<p>
Sexe :
<input type="radio" name="radio1" value="sexe" checked>masculin
<input type="radio" name="radio1" value="sexe">féminin
</p>
<p>Commentaire :<br>
<textarea name="textarea" cols="50" rows="10"> </textarea><br>
<input type="submit" name="Submit" rows="5" value="Soumettre">
</p>
</form>
index.html du projet
UIForm
keulkeul.blogspot.com
} else {
out.print("C'est une femme. Elle");
}
UIFormServlet.java du projet
UIForm Servlets - M. Baron - Page 26
Architecture de développement d'une application WEB
/HelloWorldServlet/* Servlet
Servlet 11
requête
keulkeul.blogspot.com
réponse /*.html
Servlet
/FormulaireServlet/*.htm Servlet 22
Conteneur de Servlets
Serveur Web
classes
Classes (bytecode) des Servlets
</servlet-mapping>
<servlet-mapping>
<servlet-name>HelloWorldServlet</servlet-name>
<url-pattern>/msg.hello</url-pattern>
</servlet-mapping>
Une seule façon d’appeler <servlet-mapping>
<servlet-name>HelloWorldPrintWriter</servlet-name>
la Servlet <url-pattern>/printwriter.html</url-pattern>
HelloWorldPrintWriter </servlet-mapping>
</web-app>
Servlets - M. Baron - Page 32
Le fichier web.xml : c’est quoi ?
http://localhost:8080/HelloWorldServlet
http://localhost:8080/HelloWorldServlet/bonjour.toutpourservlet
keulkeul.blogspot.com
http://localhost:8080/HelloWorldServlet/hello.toutpourservlet
http://localhost:8080/HelloWorldServlet/HelloWorldServlet/msg.hello
InitCounterServlet.java du
projet Counter Servlets - M. Baron - Page 39
Cycle de vie d'une Servlet : méthode init()
<servlet>
<servlet-name>InitConfigFileCounterServlet</servlet-name>
Balise qui détermine la <servlet-class>InitConfigFileCounterServlet</servlet-class>
valeur du paramètre <init-param>
<param-name>initial_counter_value</param-name>
<param-value>50</param-value>
<description>Valeur initiale du compteur</description>
keulkeul.blogspot.com
</init-param>
Balise qui explique
</servlet>
le rôle du paramètre ...
(optionnelle) </web-app>
count++;
Exemples de ressources
Connexion à une base de données
...
} finally {
if (bufferedReader != null)
bufferedReader.close();
}
}
} InitDestoryCounterServlet.java
du projet Counter
Servlets - M. Baron - Page 44
Envoyer un contenu multimédia
g = buffer_image.createGraphics();
g.setFont(new Font("Serif", Font.ITALIC, 48));
g.drawString("Bonjour tout le monde !", 10,50);
encode.encode(buffer_image);
out.close();
}
}
GenerateImageServlet.java du
projet Multimedia
Servlets - M. Baron - Page 46
Suivi de session
Réécriture d’URL
Cookies persistants
Suivi de session
Servlets - M. Baron - Page 47
Cookies persistants : Cookie
res.addCookie(c);
out.println("Bonjour le nouveau");
Génère un identifiant
} else {
out.println("Encore vous"); ... } unique pour chaque client
}
}
CookiesServlet.java du projet
Cookies Servlets - M. Baron - Page 51
Suivi de session : HttpSession
L’utilisateur peut
configurer son
navigateur pour qu’il
refuse ou pas les
cookies
keulkeul.blogspot.com
HttpSessionServlet.java
du projet HttpSession
keulkeul.blogspot.com
Client n°2
PizzasClient.java du projet
ServletContext Servlets - M. Baron - Page 57
Partage d’information
Servlet
Servlet11
keulkeul.blogspot.com
Servlet
Servlet22
Servlet
Servlet33
Ne fonctionne
que dans le Servlet
Servlet44
Communication
par le contexte
même serveur
Serveur Web
WEB Servlets - M. Baron - Page 58
Partage d’information
DateFormat df = DateFormat.getDateInstance(DateFormat.MEDIUM);
String today = df.format(day);
ReadSharePizzas.java du projet
Pour communiquer entre contextes, CrossServletContext
il faut autoriser la communication
inter-contextes (voir partie suivante)
Servlets - M. Baron - Page 59
Collaboration de Servlets : partage du contrôle
req.setAttribute("bonsoir", "Bonsoir");
keulkeul.blogspot.com
dispat.include(req,res);
out.println("<br>");
out.println("</BODY></HTML>");
}
} IncluderServlet.java du projet
ForwardInclude
Servlets - M. Baron - Page 66
Partage du contrôle : distribuer une inclusion
IncludedServlet.java du projet
ForwardInclude
GET / HTTP/1.1
Application
Application
HTTP/1.1 401 Unauthorized
WWW-Authenticate: BASIC
WEB
WEB
realm="Users"
GET / HTTP/1.1
Autorisation: BASIC RkfddsIRSddO=
Client Web Serveur Web Vérification si l'utilisateur
est connu et son mot de
Principe des autorisations de type FORM passe correct
GET / HTTP/1.1
keulkeul.blogspot.com
Application
Application
HTTP/1.1 200 OK
Content-Type: text/html
WEB
WEB
...
POST / HTTP/1.1
...
Serveur Web
Client Web
Données cachées et non visible
Servlets - M. Baron - Page 69
Sécurité : deux familles d'identification pour les Servlets
No
ti
en si
n
Id réus
keulkeul.blogspot.com
loginpage.html
</web-app>
page des erreurs de
web.xml du projet connexion
AuthentificationFormByRoles
<INPUT TYPE=SUBMIT>
</FORM>
return false;
Servlet
Servletde
de Correcte
traitement
traitement
login.html
Erronée
} else {
req.getSession().setAttribute("logon.isDone", account);
out.println("Bravo : " + account); L’identification est
}
}
réussie et on modifie la
... session en ajoutant le
} nom de l’utilisateur
SecurityFormServlet.java du projet
AuthentificationFormByServlet
Servlets - M. Baron - Page 78
Se connecter aux bases de données
Charger le pilote
Se connecter à la base
Créer et exécuter une requête SQL
Traiter le résultat si nécessaire Servlets - M. Baron - Page 79
Se connecter aux bases de données : charger un pilote
pas trouvée
Class.forName("org.apache.derby.jdbc.ClientDriver");
Class.forName("sun.jdbc.odbc.JdbcOdbcDriver");
Chargement du
pilote ODBC Servlets - M. Baron - Page 80
Se connecter aux bases de données : se connecter à la
base
Pour se connecter à une base de données il faut fournir une
URL qui indique où se trouve la base
URL ORACLE : jdbc:oracle:thin:host:port:idbase
URL ODBC : jdbc:odbc:IDDSN
URL mySQL : jdbc:mysql:host
Exception levée si la connexion à
URL Derby : jdbc:derby:host la base est impossible
DriverManager.getConnection("jdbc:mysql://localhost/Espoir","michael","baro
n");
Connection ma_connexion =
DriverManager.getConnection("jdbc:oracle:thin:@dbhost:1528:ORCL","michael",
"baron");
Connexion à une base
ORACLE nommée ORCL Servlets - M. Baron - Page 81
Se connecter aux bases de données : créer et exécuter
une requête SQL
La requête ne peut être créée et exécutée que si le pilote et
la connexion à la base se sont valides
Il faut avant tout créer une instruction SQL sur la base
createStatement() throws SQLException
Exception levée si l ’instruction
SQL ne peut être créée
La référence de la connexion à
une base de données
Il faut enfin exécuter la requête en écrivant concrètement le
requête SQL executeQuery(String requete) throws SQLException
keulkeul.blogspot.com
La requête SQL
Référence de l’instruction SQL
Servlets - M. Baron - Page 82
Se connecter aux bases de données : traiter le résultat
while (mon_resultat.next()) {
String colonne1 = mon_resultat.getString(1);
out.println("Nom:" + colonne1);
}
} catch(SQLException e) {
...
}
}
}
N’oubliez pas dans la requête
SQL les cotes ` ` entre les
différentes tables
Servlets - M. Baron - Page 84