2. Servlet - Définition
Servlet : Server-side applet
Applet est une classe s’exécutant chez le client alors que
la servlet s’exécute chez server.
Une classe java s’exécutant coté serveur
reçoit et répond aux requêtes de clients web,
généralement via HTTP servlet web ou servlet (pour
simplifier)
Permettre la programmation d'applications web en
Java
Navigateur Web
requête requête
réponseréponse
Servlet
Serveur
Web
3. Environnement d’exécution de
servlets
Les servlets s'exécutent dans un conteneur de servlets, appelé aussi
conteneur web
Conteneur web = serveur web + moteur de servlet
Etablit le lien entre le serveur web et la servlet
Navigateur Web
requête requête
réponseréponse
Servlet
Serveur
Web
Exemples de conteneur de servlets
Tomcat (Implantation de référence)
Jetty
Weblogic
...
Conteneur
de servlets
4. Squelette de base de servlet
import javax.servlet.*;
public class MyServlet implements Servlet {
public void init(ServletConfig config) throws ServletException {
…
}
public void service( ServletRequest request, ServletResponse response )
throws ServletException, IOException {
…
}
public void destroy() {
…
}
5. Cycle de vie d’une servlet
Le conteneur gère le cycle de vie :
charge la classe de servlet et initialise une instance de cette
classe
chaque requête du client est traitée par une instance de
servlet dans un thread séparé
peut supprimer la servlet
peut garder la servlet pour traiter d’autres requêtes
Browser
Browser
Browser
Server
Servlet
Instance
6. Cycle de vie d’une servlet
Lorsque la servlet est instancié, le conteneur appelle la méthode init()
pour initialiser la servlet
Sur demande du client, le conteneur appelle la méthode service()
Avant la suppression de la servlet, le conteneur appelle la méthode
destroy()
Classe Servlet
Appel de la methode
init
Instance de
Servlet
Traitement de requêtes:
appel de la méthode
service
Détruire la Servlet:
appel de la méthode
destroy
Garbage
Collection
ServletConfig
7. Modèle de programmation
Une servlet doit implémenter
l’interface javax.servlet.Servlet
soit directement,
soit en dérivant d’une classe
implémentant cette interface :
javax.servlet.GenericServlet : une
classe abstraite indépendante du
protocole
javax.servlet.http.HttpServlet : une
classe abstraite spécifique au
protocole HTTP
l’interface javax.servlet.Servlet
possède les méthodes pour
initialiser la servlet : init()
recevoir et répondre aux requêtes
des clients : service()
détruire la servlet et ses
ressources : destroy()
8. Servlet web
Pour faciliter le traitement particulier des requêtes web, la
classe Servlet est affinée en javax.servlet.http.HttpServlet
des méthodes remplacent la méthode service() de la classe mère
doGet() pour les requêtes http de type GET
doPost() pour les requêtes http de type POST
....
La classe servlet doit OBLIGATOIREMENT implémenter l’une des
méthodes redéfinies, choisies selon le mode d’envoi du formulaire
html qui l’exécute
service() de HttpServlet appelle automatiquement la bonne
méthode en fonction du type de requêtes http
9. HTTP
HTTP décrit les échanges entre navigateur web (client) et
serveur web : le navigateur effectue une requête HTTP; le
serveur la traite et envoie une réponse HTTP.
Une requête HTTP a le format suivant :
Ligne de commande (Commande, URL, Version de protocole)
En-tête de requête
[Ligne vide]
Corps de requête
Une réponse HTTP a le format suivant :
Ligne de statut (Version, Code-réponse, Texte-réponse)
En-tête de réponse
[Ligne vide]
Corps de réponse
Les commandes essentielles sont GET (obtenir un
document) et POST (envoyer du contenu).
Les données de la requête sont passées dans l’URL pour un
GET et dans le corps pour un POST.
10. Développement de Servlet
Une Servlet web
étend la classe
javax.servlet.http.HttpServlet
implémente des méthodes
spécifiques au protocole HTTP
remplacent la méthode service() :
doGet(), doPost()…
La servlet reçoit les requêtes et renvoie
les réponses via 2 objets :
Objet requête : javax.servlet.ServletRequest
contient les informations nécessaires pour
une communication du client vers le serveur
Objet réponse : javax.servlet.ServletResponse
contient les informations nécessaires pour
une communication du serveur vers le client
11. Développement de Servlet
Si la méthode utilisée est GET, il suffit de redéfinir la
méthode :
public void doGet( HttpServletRequest request,
HttpServletResponse response )
Si la méthode utilisée est POST, il suffit de redéfinir la
méthode :
public void doPost( HttpServletRequest request,
HttpServletResponse response)
12. Développement de Servlet
import javax.servlet.*;
import javax.servlet.http.*;
import java.io.*;
public class ServletName extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) throws
ServletException {
// lecture de la requête
// traitements
// envoi de la réponse
}
public void doPost(HttpServletRequest req, HttpServletResponse res) throws
ServletException {
// lecture de la requête
// traitements
// envoi de la réponse
}
}
13. Principe de fonctionnement
Les fichiers de bytecode (.class) sont stockés sur le
serveur (comme des docs)
Ils sont désignés par une URL
http://depinfo-fst.rnu.tn/MaServlet
Le chargement de l'URL provoque l'exécution de la
servlet
17. Paramètres des méthodes doGet() et
doPost()
Utiliser les objets HttpServletRequest et
HttpServletResponse passés en paramètres de
ces méthodes pour implanter le service
HttpServletRequest contient les informations sur le
formulaire html initial (utile pour doPost())
La méthode getParameter() récupère les paramètres
d’entrée
HttpServletResponse contient le flux de sortie pour la
génération de la page html résultat (getWriter())
18. Aperçu de l’API servlet
Méthodes importantes d’un objet HttpServletRequest
String getParameter(String param)
Retourne la valeur du champ param transmis dans les données
du formulaire
java.util.Enumeration getParameterNames()
retourne l'ensemble des noms de paramètres transmis à la servlet
String getMethod()
retourne la méthode HTTP (GET ou POST) utilisée pour invoquer
la servlet
Méthodes importantes d’un objet HttpServletResponse
void setContentType(String type)
définit le type MIME du document retourné par la servlet
PrintWriter getWriter()
retourne un flux de sortie permettant à la servlet de produire son
résultat
19. Aperçu de l’API servlet
Autres méthodes appelables sur un objet HttpServletRequest
String getProtocol()
retourne le protocole implanté par le serveur (ex. : HTTP/1.1)
String getServerName() / String getServerPort()
retourne le nom/port de la machine serveur
String getRemoteAddr() / String getRemoteHost()
retourne l'adresse/nom de la machine cliente (ayant invoqué la
servlet)
String getScheme()
retourne le protocole utilisé (ex. : http ou https) par le client
java.io.BufferedReader getReader()
retourne un flux d'entrée permettant à une servlet chaînée de
récupérer le résultat produit par la servlet précédente
permet à la servlet chaînée de modifier le résultat
20. Déploiement d’une Servlet
Pour déployer une application
dans un conteneur, il faut lui
fournir deux éléments :
Tous les composants (classes
compilées, ressources ...)
regroupée dans une archive ou
module
Descripteur de déploiement
contenu dans le module qui
précise au conteneur des options
pour exécuter l'application
Une servlet doit faire partie d’un module web pour être
déployée
Un module Web est un ensemble de librairies, de fichiers de
configurations, de code Java (bytecode des servlets...), ...
21. Déploiement d’une application
web
Web Application Archive : une application web (*.html, *.jsp,
servlets, ...) packagée dans un archive (.war) et est
paramétrée dans le fichier WEB-INF/web.xml
Structure
Fichiers web de l’application (HTML, JSP, js, css...)
Répertoire « META-INF » : fichiers de configuration
MANIFEST.MF : informations sur le zip
Répertoire « WEB-INF » : contenu de l’application
WEB-INF/web.xml
Descripteur de déploiement
WEB-INF/classes/
class des servlets et des classes (JavaBean, ...) associées
WEB-INF/lib/
.jar additionnels provenant de tierce parties (comme des drivers JDBC, TagLib (JSF,
...),
WEB-INF/tlds/
.tld décrivant les TagLibs
22. Descripteur de déploiement
web.xml
<web-app>
<servlet>
<servlet-name> nom de servlet </servlet-name>
<servlet-class> nom de la classe de servlet </servlet-class>
<init-param>
< param-name> nom du paramètre d’initialisation
</param-name>
< param-value> valeur du paramètre d’initialisation
</param-value>
</init-param>
</servlet>
<servlet-mapping>
<servlet-name> nom de servlet </servlet-name>
<url-pattern> url d’invocation de servlet </url-pattern>
</servlet-mapping>
</web-app>
24. Initialisation de servlet
La méthode est invoquée pour initialiser la servlet
Les paramètres d’initiation sont définis dans web.xml
peuvent être changés sans avoir à recompiler l'application
La méthode, getInitParameter() de l’interface ServletConfig permet de
récupérer ces paramètres d’initialisation
<web-app>
…
<servlet>
<servlet-name>InitExample</servlet-name>
<servlet-class>ServletInit</servlet-class>
<init-param>
<param-name>login</param-name>
<param-value>snoopy</param-value>
</init-param>
</servlet>
…
</web-app>
25. Chaînage de servlets
Agrégation des résultats fournis par plusieurs servlets
Meilleure modularité
Meilleure réutilisation
Utilisation d'un RequestDispatcher
obtenu via un objet request de type HttpServletRequest
RequestDispatcher rd = request.getRequestDispatcher(
"servlet2" );
Inclusion du résultat d'une autre servlet
rd.include(request, response);
Délégation du traitement à une autre servlet
rd.forward(request, response);
26. Cookies
Cookie = donnée stockée par un serveur web chez un client
Moyen pour récupérer des informations sur le client
nom, adresse email, …
Eviter à l’utilisateur de taper ces informations chaque fois qu’il
est nécessaire
L'utilisateur a la possibilité d'interdire leur dépôt dans son
navigateur
Définis dans la classe javax.servlet.http.Cookie
Créé en donnant un nom (String) et une valeur (String) Cookie
unCookie = new Cookie( "sonNom", "saValeur" );
Positionné via un objet response
response.addCookie( unCookie );
Récupéré via un objet request
Cookie[] desCookies = request.getCookies();
Quelques méthodes : String getName() / String getValue()
27. Sessions
HTTP protocole non connecté (sans état), ne gère
pas les sessions
Deux requêtes successives d'un même client sont
indépendantes pour le serveur
Notion de session : suivi de l'activité du client sur
plusieurs pages
un objet Session associé à toutes les requêtes d’un
utilisateur
Les sessions expirent au bout d'un délai fixé (pas de
requête pendant n secondes ! expiration de la
session)
La gestion des sessions utilise les techniques
28. API de HttpServlet
Les servlets offrent une API simplifiant la gestion de sessions
L’objet request de HttpServletRequest maintient les
informations sur la session
Accessibles via les méthodes:
HttpSession session = request.getSession(boolean flag)
flag=true: retourne l'objet session courant ou en crée un s'il n'y en a
pas.
flag=false: retourne l'objet session courant ou null s'il n'y en a pas
isRequestedSessionIdFromCookie()
vrai si l'id de la session vient d'un cookie
isRequestedSessionIdFromURL()
vrai si l'id de la session vient d'un URL
JSESSIONID est le nom du cookie, utilisé par le conteneur
de servlet, qui maintient un identifiant unique pour chaque
session
29. Configuration de session
Initialisation de la durée d'une session
dans le web.xml (en minutes)
<session-config>
<session-timeout>30</session-timeout>
</session-config>
avec la méthode void setMaxInactiveInterval( int seconds ); de
HttpSession qui spécifie le temps avant la fermeture d’une
session
Terminaison de session
après expiration du timeout
avec la méthode void setMaxInactiveInterval( int seconds );
avec la méthode void invalidate() de l'objet HttpSession,
HttpSession session = request.getSession(true);
session.invalidate(); ou setMaxInactiveInterval(0);
30. Méthodes de session
Méthodes appelables sur un objet de type
HttpSession
void setAttribute( String name, Object value );
ajoute un couple (name, value) pour cette session
Object getAttribute( String name );
retourne l'objet associé à la clé name ou null
void removeAttribute( String name );
enlève le couple de clé name
java.util.Enumeration getAttributeNames();
retourne tous les noms d'attributs associés à la session
long getCreationTime(); /long getLastAccessedTime();
retourne la date de création / de dernier accès de la
session en ms
31. Partage de données entre
servlets
Contexte d'exécution = ensemble de couples (name, value) partagées par
toutes les servlets instanciées
ServletContext ctx = getServletContext()
Méthodes appelables sur un objet de type ServletContext
void setAttribute( String name, Object value )
ajoute un couple (name, value) dans le contexte
Object getAttribute( String name )
retourne l'objet associé à la clé name ou null
void removeAttribute( String name )
enlève le couple de clé name
java.util.Enumeration getAttributeNames()
retourne tous les noms d'attributs associés au contexte
32. Les listeners
Les listeners sont des objets dont les méthodes sont invoquées en
fonction du cycle de vie d'une servlet
A la création et à la destruction d'un contexte (une application)
Javax.servlet.ServletContextListener
Quand on modifie les attributs du contexte
Javax.servlet.ServletContextAttributeListener
A la création, la suppression, d'une session
Javax.servlet.HttpSessionListener
A la création, modification, suppression d'un attribut de session
Javax.servlet.HttpSessionAttributeListener
33. Les listeners du contexte
Void contextDestroyed(ServletContextEvent sce)
Notification that the servlet context is about to be shut
down.
void contextInitialized(ServletContextEvent sce)
Notification that the web application is ready to process
requests.
ServletContextListener
void attributeAdded(ServletContextAttributeEvent scab)
Notification that a new attribute was added to the servlet
context.
void attributeRemoved(ServletContextAttributeEvent scab)
Notification that an existing attribute has been remved from
the servlet context.
void attributeReplaced(ServletContextAttributeEvent scab)
Notification that an attribute on the servlet context has been
replaced.
ServletContextAttributeListener
34. Les listeners de session
Void sessionCreated(HttpSessionEvent se)
Notification that a session was created.
void sessionDestroyed(HttpSessionEvent se)
Notification that a session was invalidated.
HttpSessionListener
void attributeAdded(HttpSessionBindingEvent se)
Notification that an attribute has been added to a
session.
void attributeRemoved(HttpSessionBindingEvent se)
Notification that an attribute has been removed from
a session.
void attributeReplaced(HttpSessionBindingEvent se)
Notification that an attribute has been replaced in a
session.
HttpSessionAttributeListener
35. La déclaration d’un listener
Il faut informer le conteneur de la classe de listener, dans le
descripteur de déploiement web.xml
<listener>
<listener-class>
cours.exemple1.SessionCounter
</listener-class>
</listener>
37. Filtres
Un filtre est un code exécuté entre la requête et le « endpoint »
Permettent de faire du pre et post-processing sur une requête
Lire la requête, modifier la requête, modifier la réponse, retourner des
erreurs au client
Ajouter des fonctions aux applications
Log, Compression, Cache
Même cycle de vie qu’une servlet
Init/doFilter/destroy
Implanter la méthode doFilter()
Déclarer le filtre dans web.xml
Filter
Filter-mapping
Le transfert à la suite de la chaine se fait par la fonction
chain.doFilter()
Transfert à un autre filtre ou à une servlet ou une page HTML ou une
page JSP
La suite s’exécute au retour de doFilter()
39. Filtres
public class LoginFilter extends GenericFilter {
private FilterConfig filterConfig;
public void doFilter(HttpServletRequest request, HttpServletResponse response,
FilterChain chain){
System.out.println("Entering Filter");
request.setAttribute("hello","Hello World!");
chain.doFilter(request,response);
System.out.println("Exiting HelloWorldFilter");
} }
40. Gestion des erreurs
Il est possible de définir les pages à afficher
En fonction d'erreurs http
En fonction d'exceptions java
<error-page>
<exception-type>
cours.event.EventException
</exception-type>
<location>/erreur.html</location>
</error-page>
Dans web.xml
<error-page>
<error-code>404</error-code>
<location>/404.html</location>
</error-page>
Pour une
erreur Http
Pour une
exception
java
41. Gestion de concurrence
Par défaut les servlets sont exécutées de façon multi-
threadée
Si une servlet doit être exécutée en exclusion mutuelle
(ex. : accès à des ressources partagées critiques)
implantation de l'interface SingleThreadModel
public class CompteurServlet extends HttpServlet implements
SingleThreadModel{
public void doGet( ServletRequest request, ServletResponse response )
throws ServletException, IOException {
/* Tout le code de la Servlet est en exclusion avec lui-même */
}
}
Autre solution : définir du code synchronized dans la servlet
Attention aux inter-blocages
42. Conclusion
Servlets : étendent le comportement des serveurs
Web avec des programme Java
Portabilité
facilité d'écriture (Java)
Définition du code, du paquetage, du déploiement
Exécutée en // avec des processus légers (threads)
Limites
Difficile d’écrire du code HTML dans du code Java
Introduction de la technologie Java Server Pages (JSP)
Pas de mécanisme intégré de distribution
Introduction de la technologie Enterprise Java Beans (EJB)
44. Servlet & JSP
Servlet : une classe java
Java Server Pages : insertion du code Java
dans une page HTML
JSP ont les mêmes fonctionnalités que
HttpServlet
Implémentation du mécanisme requête/réponse
Accéder aux mêmes données/objets qu’une
servlet
Inclure ou rediriger la requête vers une autre
servlet/JSP
Génération de différents types de contenus :
HTML, XML, SVG..
Gestion des méthodes, headers, cookies,
sessions...
45. Servlet & JSP
Traitement d’une JSP par le serveur
Une JSP est compilée en servlet à la première
utilisation
Se transforme en classe implémentant:
javax.servlet.jsp.HttpJspPage
Lors du premier chargement d’une jsp
Génération d’une servlet à partir de la jsp
Compilation de la servlet
Instanciation de la servlet
Délai d’attente lors de la première consultation
En cas d’erreur de syntaxe, message envoyé au
navigateur (erreurs détectées à l’exécution)
Lors des chargements suivants
Exécution de la servlet dans un thread
50. Scriptlets <% %>
contient du code Java
insérer dans _jspservice() de la servlet, donc peut utiliser out,
request, response, …
<html> <body>
<%
String[] langages = {"Java", "C++", "Smalltalk", "Simula 67"};
out.println("<h3>Principaux langages orientés objets : </h3>");
for (int i=0; i < langages.length; i++) {
out.println("<p>" + langages[i] + "</p>"); }
%>
</body> </html>
51. Expressions <%= ... %>
<%= expr %> génère l'affichage d'une valeur de
l'expression expr
expr : expression en Java qui renvoie un objet String ou un
type primitif.
raccourci pour <% out.println(expr); %>
52. Déclarations <%! … %>
Méthodes et variables d'instance
Des méthodes et des variables d'instance peuvent
être associées à une JSP entre les directives <%! et
%>
Méthodes et variables d’instance de la servlet
générée
53. Déclarations <%! … %>
Méthodes et variables d’instance
Méthode d’instance de la servlet générée à partir de
la jsp
Pas d’accès aux objets implicites (out, request,
page...) : ce sont des objets définis dans la méthode
principale de la servlet (_jspService())
Attention!
<%! ... %> : définie une variable d’instance (persiste entre deux invocations)
<% ... %> : définie une variable locale à la jsp (réinitialisée à chaque
invocation)
54. Directive <%@directive... %>
Fournit des informations globales relatives à la page
<%@ directive attribut="valeur" %>
Trois types de directives:
page : modifier les données de la page (import de packages,
spécification d’un type de contenu, gestion des sessions)
Forme générale :
<%@ page import="java.io.*, java.sql.*">
<%@ page isErrorPage="false" %>
<%@ page contentType="text/html" %>
include : inclure des fichiers ou autres servlets/JSP, C’est comme si
le contenu du fichier à inclure était directement copié dans le fichier
courant.
<%@ include page="/monJSP.jsp" %>
taglib : utiliser des bibliothèques de balises personnalisées
<%@ taglib uri="..." prefix="..." %>
55. Objets implicites
Objets pré-déclarés utilisables dans le code Java
des JSPs
out : le flux de sortie pour générer le code HTML
request : la requête qui a provoqué le chargement de la
JSP
response : la réponse à la requête de chargement de la
JSP
page : l'instance de servlet associée à la JSP courante (
this)
exception : l'exception générée en cas d'erreur sur une
page
session : suivi de session pour un même client
58. Gestion des erreurs
Erreur de syntaxe
Dans le code HTML
Dans les directives JSP (ex. : oubli d'une directive %>)
Dans le code Java (ex : oubli de ;)
Erreur d’ exécution du code Java (ex. :
NullPointerException)
Dans tous les cas, erreur récupérée dans le navigateur
client
Conserver la page par défaut construite par le moteur
En concevoir une adaptée aux besoins particuliers de
l'application
Utilisation des directives :
<%@ page errorPage="..." %> : URL du gestionnaire d’erreurs
<%@ page isErrorPage="..." %> : vrai si page est un
61. Balises de commentaires
2 manières de placer des commentaires dans une
page JSP
<!-- mon commentaire -->
dans ce cas les commentaires sont transmis à la
réponse. Ils sont donc visibles lorsqu'on visualise le
code source de la page HTML.
ou
<%-- mon commentaire --%>
Le serveur JSP ne les prend pas en compte. Leur
intérêt est uniquement de commenter le code JSP
62. La directive <%@include %>
<%@include
file="/chemin/relatif/auContexte"%>
Cette inclusion se fait au moment de la
conversion, pendant la création de la servlet
correspondante.
Le contenu du fichier externe est inclus comme
s’il était saisi directement dans la page JSP
Les ressources à inclure doivent être contenues
dans le contexte de l'application web
64. TagLib
Un tag JSP est une simple balise XML à laquelle est associée une
classe Java.
A la compilation d'une page JSP, ces tags sont remplacés par
l'utilisation de ces classes Java qui implémentent une interface
particulière.
<prefixe:nomDuTag attribut="valeur">
Corps du tag
</prefix:nomDuTag>
Un préfixe, qui permet de distinguer les différentes taglibs utilisées.
Le nom du tag de la librairie
un certain nombre de couple d'attribut/valeur
un corps.
Une JSP Taglib est une collection d'actions prédéfinies destinée à
être utilisée dans une page JSP sous forme de tags.
Elle se compose:
d'un descripteur de taglib (Tag Librarie Descriptor)
65. TagLib usuels
jsp:useBean associe une instance d’objet Java Bean
jsp:setProperty positionne la valeur d’une propriété d’un bean
jsp:getProperty récupère la valeur de la propriété d’un bean
jsp:include inclut le contenu du page statique ou dynamique
jsp:invoke invoque l’exécution d’un fragment (JSP, ...)
jsp:forward redirige le traitement de la requête à un autre
script
jsp:element insère un élément (XML) dans le document
jsp:attribute attribut d’un élément
jsp:output configure le prélude du document XML
jsp:param paramètre (key/value) pour jsp:forward et
jsp:include
jsp:text ajoute le texte à la sortie
jsp:plugin insère un objet externe
jsp:fallback alternative en cas d’échec du jsp:plugin
66. Le tag <jsp:include>
permet d'inclure le contenu généré par une JSP ou une servlet
dynamiquement au moment ou la JSP est exécutée.
Contrairement à la directive <@include page= > avec laquelle le
fichier est inséré dans la JSP avant la génération de la servlet.
Syntaxe <jsp:include page= "URL" flush="true" />
L'attribut page permet de préciser l'URL relative de l'élément à
insérer.
L'attribut permet d'indiquer si le tampon doit être envoyé au client
est vidé avant de l’inclure.
Par défaut : flush = false
Si flush = true : le serveur envoie le tampon de sortie de la page en
cours (la partie de la page qui a déjà été traitée) dans le navigateur
avant de traiter le fichier inclus.
67. Le tag <jsp:include>
Agrégation des résultats fournis par plusieurs JSP
Inclusion dynamique (délégation de servlets : deux servlets, l’une
appelle l’autre)
Fichierinc.jsp
68. Le modèle de composants Java
Le modèle de composants Java (Java beans)
permet de construire une application en
assemblant des entités logicielles par programme
(ou visuellement)
Ce modèle de composants est décrit par un
ensemble d'APIs
Pour fonctionner, ce modèle repose sur un
ensemble d'outils formant un environnement dans
lequel les composants interagissent
Ce modèle utilise des conteneurs qui fixe un
cadre pour la coopération des composants
Dans l'architecture des applications web (3-tiers),
les composants métiers sont implantés par des
Java beans
69. Persistance - JavaBean
Un bean est un objet Java
Comme tout objet, il possède un état
Cet état doit être mémorisé pour toute utilisation
ultérieure du bean
Tout bean doit donc utiliser un mécanisme de
persistance universel défini par leur conteneur
Ils doivent d'implémenter l'interface
java.io.Serializable
70. JavaBean
Les JavaBeans sont des classes Java qui respectent les
directives suivantes :
un constructeur public sans argument
les propriétés d'un Bean sont accessibles au travers de
méthodes getXXX (lecture) et setXXX (écriture) portant le nom
de la propriété
Méthodes de lecture des propriétés :
type getNomDeLaPropriété()
boolean isNomPropriété()
Méthodes d'écriture des propriétés :
void setNomDeLaPropriété(type) : un seul argument du type de
la propriété et son type de retour est void
Un JavaBean implémente l'interface java.io.Serializable
permettant la sauvegarde de l'état du Bean
72. Bean et JSP
Un bean est inclus dans une page JSP par la balise :
<jsp:useBean>
permet de localiser une instance ou d'instancier un bean pour
l'utiliser dans la JSP
Un bean peut encapsuler des traitements complexes et être
réutilisable par d'autre JSP ou composants
Après exécution, un bean rend son résultat à la page JSP ou
à la servlet
L'utilisation de beans évite l'emploi de la méthode
getRequestParameter(...)
La valeur du paramètre d'une requête peut être utilisée
directement pour renseigner la propriété d'un bean
Un serveur peut gérer la portée (scope) d'un bean en le liant
soit à une page, une requête, une session ou une application
73. JavaBeans - Syntaxe
<jsp:useBean id="nomInstanceJavaBean"
class="nomClasseDuBean"
scope="request|session|application|page">
</jsp:useBean>
Le bean est alors identifié et accessible par :
"nomInstanceJavaBean"
L'attribut scope indique la portée du bean.
75. JSP et Java Beans
Récupération des propriétés du bean:
Par appel de méthode getXXX() ou par la
balise<jsp:getProperty…>
76. JSP et Java Beans
Positionner les propriétés du bean dans une JSP
Par appel de méthode setXXX(...) ou par la balise
<jsp:setProperty…>
77. Exemple
La page JSP qui suit affiche le texte : Bonjour suivi de la
valeur du paramètre nom de la requête.
La classe HelloBean est stockée dans le répertoire entites.
La propriété nom du bean HelloBean est alimentée par le
paramètre de la requête passé dans son en-tête si celui-ci
est renseigné
Sinon c'est sa valeur par défaut qui est utilisée
L'exécution de la page JSP provoque l'affichage du texte
bonjour suivi du contenu de la propriété nom du bean
HelloBean
Intérêt :
pas de code Java dans la page JSP
modularité dans la construction de l'application
80. JSP et JavaBeans – Centré
page!
La logique de l’application est dans
les pages JSP
Mixité de la présentation et la logique
métier
L’enchainement des pages est codé
dans les pages JSP
Contrôle de flux pris en charge par les
JSP
memu.jsp catalog.jsp checkout.jsp
dataBase
page–centric catalog application
81. Modèle MVC
Le modèle Model-View-Controller a pour objectif
d ’organiser une application interactive en séparant :
les données
la représentation des données
le comportement de l’application
Le Model représente la structure des données dans
l ’application et les opérations spécifiques sur ces
données
Une Vue présente les données sous une certaine forme
à l ’utilisateur, suivant un contexte d ’exploitation.
Un Controller traduit les interactions utilisateur par des
appels de méthodes (comportement) sur le modèle et
sélectionne la vue appropriée basée sur l’état du
modèle.
82. Modèle MVC en JAVA
Controlleur : Servlet
View : JSP
Model : JavaBean
83. Exemple - MVC : étape 1
Le client récupère un formulaire (index.html)
pour passer une requête avec paramètres (1, 2,
puis 3)
98. Package javax.servlet.http
HttpServlet gestion des servlet pour recevoir des
requêtes et envoyer des réponses
HttpServletRequest interface des requêtes
HttpServletResponse interface des réponses
HttpSession gestion de la session
ServletContext gestion du contexte de
l'application
RequestDispatcher lancement de servlet
(forward())
99. 105
public class ServletInit extends HttpServlet {
String _login = null;
Calendar _initTime = null;
public void init() throws ServletException {
_login = this.getInitParameter("login");
_initTime = new GregorianCalendar();
}
public void doGet(HttpServletRequest req,
HttpServletResponse res) throws ServletException, IOException {
PrintWriter out = res.getWriter();
res.setContentType("text/html");
out.println("<html><head><title>Initialization</title><body><h2>"
+ "I am the Servlet of <i>" + _login+ "</i><br/>"
+ "I was initialized at " + _initTime.get(Calendar.HOUR_OF_DAY)
+ ":"+ _initTime.get(Calendar.MINUTE)
+ ":"+ _initTime.get(Calendar.SECOND)
+ "</h2></body></html>"); }} ServletInit.java
100. 106
Loading a Servlet on Startup
A Servlet is usually loaded when it is first being
called
You can set Tomcat to load a specific Servlet
on startup in the Servlet declaration inside
web.xml
<servlet>
<servlet-name>InitExample</servlet-name>
<servlet-class>ServletInit</servlet-class>
<load-on-startup/>
</servlet>
101. 107
Destruction de servlets
Le serveur peut détruire des servlets chargées :
arrêt demandé par l’administrateur (exp, arrêt du
serveur)
servlet n’est pas utilisée pour une longue periode
serveur a besoin de ressources libres
Le serveur supprime une servlet seulement si
tous les threads sont terminés et une période de
grâce est expirée
Avant la suppression, le conteneur appelle la
méthode destroy()
Fermer les connexions vers les BDD
….
102. Servlet <<Interface>> ServletConfig <<Interface>>
+ init(…) + getInitParameter(String): String
+ service(…) + getServletName(): String
+ destroy() + …
GenericServlet {abstraite}
+ service(...) {abstraite}
+ ...
HttpServlet
+ service(…)
+ doXXX (…)
Dériver HttpServlet
pour construire des
Servlets spécifiques
au protocole HTTP
en redéfinissant
doGet, doPost…HelloWorld
+ doGet(…)
HttpServlet
définit la
méthode
service
qui appelle
doXXX selon la
requête HTTP
reçue (doGet,
doPost…).
L’implantation
par défaut de
doXXX rend
une erreur
HTTP 405
(méthode non
103. 109
Thread Synchronization
Multiple threads are accessing the same Servlet
object at the same time
Therefore, you have to deal with concurrency
init() and destroy() are guaranteed to be
executed only once (before/after all service
executions)
104. What is Java Servlets?
Servlet
module run inside request/response-oriented server
Browser
Java-enabled
Web Server
Servlet Database
HTML form
Server
Servlet
= Browser
Applet
Servlets are to Servers what Applets are to Browsers
Substitute for CGI scripts
easier to write and fast to run
Not part of the core Java Framework
105. Architecture
Une servlet peut être appelée par un client alors qu’elle s’exécute
déjà pour un autre client. L’objet servlet unique s’exécute alors dans
un autre thread. Certaines parties du code doivent être synchronisées
avec les techniques prévues en Java pour ce faire.
106. Développement de l’application web
Sources java
+ ressources statiques
(ex: images)
+ librairies (.jar)
+ fichier de déploiement
(web.xml)
Création d’une archive
.war (Web Application
ARchive) à déposer sur
le serveur (ex : dans le
répertoire webapps de
Tomcat)
(paquetage)
107. Servlet & HTTP
Une servlet doit
implémenter l’interface
javax.servlet.Servlet
soit directement,
soit en dérivant d’une classe
implémentant cette interface :
javax.servlet.GenericServlet :
une classe abstraite
indépendante du protocole
javax.servlet.http.HttpServlet :
une classe abstraite
spécifique au protocole HTTP