Les « containers» J2EE
Les applications multi-tiers sont difficiles à écrire
Beaucoup de code entrelacé pour gérer les
transactions, l’état, le pooling des ressources, etc.
Container
Sert d’interface entre les fonctionalités de bas niveau
qui sont spécifiques à une plateforme
Avant de pouvoir exécuter un composant web,
EJB ou d’application client
L’assembler dans un module J2EE
Le déployer dans son conteneur
Types de containers
Le container serveur J2EE
Fournit les containers web et EJB
Le container EJB
Gère l’exécution des EJB
Le container Web
Gère l’exécution des pages JSP et des servlets
Le container d’applets
Browser + Java plug-in
10.
Exemples de conteneurs
ServeursJ2EE
JBoss : http://www.jboss.org
Glassfish : https://glassfish.dev.java.net/
JOnAS:http://wiki.jonas.objectweb.org/xwiki/bin/view/Main/WebHome
Oracle AS : http://www.oracle.com/appserver/index.html
Conteneur Web
Tomcat : http://www.apache.org
Jetty : http://jetty.mortbay.org/jetty/index.html
Conteneur EJB3
EasyBeans:http://www.easybeans.net/xwiki/bin/view/Main/WebHome
11.
API J2EE
J2EE(Java 2 Edition Enterprise) propose les API :
• L'invocation de méthodes distantes : RMI, CORBA, Web Services
• L'accés aux bases de données relationnelles : JDBC
• L'accés aux annuaires et services de nommage : JNDI
• L'utilisation du XML : DOM et SAX
• HTML dynamique et traitement de requêtes HTTP : JSP et Servlet
• La gestion du Mail : Java Mail
• La gestion des messages : Java Message Service
• La gestion des composants : EJB
• La connection à des ERP : Java Connector
• La gestion des droits d'accès : Java Authentication and
Authorization Service
Rappel :LE PROTOCOLEHTTP
HTTP :HyperText Tranfert Protocol
(RFC 1945 et 2068)
Protocole de rapatriement des documents
Protocole de soumission de formulaires
Fonctionnement (très simple en HTTP/1.0)
Connexion
demande (GET, POST) d’un document
renvoi du document (status=200) ou d’une
erreur
déconnexion
14.
Dialogue HTTP
Typesde dialogue
Récupération d’un document
méthode GET
Soumission d’un formulaire
méthodes GET ou POST
Envoi de Document et Gestion de Site
méthodes PUT, DELETE
Méthode HEAD (Récupération des infos sur le
document).
15.
Le client envoiela requête : Méthode POST
Post /Nom_Script HTTP/1.0
host: www.intra.net
HTTP_ACCEPT_LANGUAGE : fr
User-Agent : Mozilla/4.0
*** saut de ligne ***
login=Value1& pass=Value2
& Var3=Value3
Entête de la requête
corps de la requête
Méthode,chemin,version
Nom de domaine
Code de la langue
Type et version du
navigateur
Paramètres des différents
champs du formulaire.
16.
Le client envoiela requête : Méthode GET
GET /Nom_Script?login=val1&pass=val2&…. HTTP/1.0
host: www.intra.net
HTTP_ACCEPT_LANGUAGE : fr
User-Agent : Mozilla/4.0
Entête de la requête
corps de la requête est vide
17.
Le Serveur retournela réponse :
HTTP/1.0 200 OK
Date : Wed, 05Feb02 15:02:01 GMT
Server : Apache/1.3.24
Last-Modified : Wed 02Oct01 24:05:01GMT
Content-Type : Text/html
Content-legnth : 4205
*** saut de ligne ***
<HTML><HEAD>
….
</BODY></HTML>
Entête de la réponse
corps de la réponse
Ligne de Status
Date du serveur
Nom du Serveur
Dernière modification
Type de contenu
Sa taille
Le fichier que le client
va afficher
18.
Introduction aux servlets
Une servlet est une classe Java , exécutée
par un moteur de servlets, fonctionnant du
côté serveur au même titre que les
langages de script côté serveur tels que
ASP ou bien PHP
Les servlets permettent donc de gérer des
requêtes HTTP et de fournir au client une
réponse HTTP dynamique.
19.
Architecture du
package servlet.jar
Toutes les servlets implémentent
directement ou indirectement l'interface
Servlet, en dérivant une classe qui
l'implémente: c'est-à-dire généralement la
classe HttpServlet, elle-même issue de
GenericServlet.
La classe GenericServlet
(javax.servlet.GenericServlet) définit une
classe abstraite (implémentation de base
de l'interface Servlet).
Servlet
GenericSrvlet
service()
HttpServlet
doPost()
doGet()
NotreServlet
doPost()
doGet()
20.
Gestion des servlets
Moteurde
Servlets
Réponse HTTP 1
Réponse HTTP 2
Thread Thread
Créer un pool
de threads
Servlet
Instancier la servlet
Appeler la méthode init()
Requête HTTP 2
Affecter une requête à un thread
Requête HTTP 1
Affecter une requête à un thread Appeler la méthode service()
Appeler la méthode service()
Appeler la méthode destroy()
Terminer le pool de threads
Initialisation
Exécution
service
Exécution
service
21.
Cycle de vied’une servlet
Le serveur crée un pool de threads auxquels il va pouvoir affecter
chaque requête
La servlet est chargée au démarrage du serveur ou lors de la
première requête
La servlet est instanciée par le serveur
La méthode init() est invoquée par le conteneur
Lors de la première requête, le conteneur crée les objets Request
et Response spécifiques à la requête
La méthode service() est appelée à chaque requête dans un
nouveau thread. Les objets Request et Response lui sont passés en
paramètre
Grâce à l'objet request, la méthode service() va pouvoir analyser
les informations en provenance du client
Grâce à l'objet response, la méthode service() va fournir une
réponse au client
La méthode destroy() est appelée lors du déchargement de la
servlet, c'est-à-dire lorsqu'elle n'est plus requise par le serveur. La
servlet est alors signalée au garbage collector .
22.
Fonctionnement d’une servlet
Lorsqu'une servlet est appelée par un
client, la méthode service() est exécutée.
Celle-ci est le principal point d'entrée de
toute servlet et accepte deux objets en
paramètres:
L'objet HttpServletRequest encapsulant la
requête du client, c'est-à-dire qu'il contient
l'ensemble des paramètres passés à la servlet
(informations sur l'environnement du client,
cookies du client, URL demandée, ...)
L'objet HttpServletResponse permettant de
renvoyer une réponse au client (envoyer des
informations au navigateur).
23.
Développement d’une servlet
Afin de développer un servlet fonctionnant avec le
protocole HTTP, il suffit de créer une classe étendant
HttpServlet (qui implémente elle-même l'interface
Servlet).
La classe HttpServlet (dérivant de GenericServlet)
permet de fournir une implémentation de l'interface
Servlet spécifique à HTTP.
La classe HttpServlet redéfinit la méthode service en
lisant la méthode HTTP utilisée par le client, puis en
redirigeant la requête vers une méthode appropriée.
Les deux principales méthodes du protocole HTTP
étant GET et POST, il suffit de redéfinir la méthode
adéquate afin de traiter la requête :
24.
Développement d’une 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
)
25.
HttpServletRequest
Méthode Description
String getMethod()
Récupèrela méthode HTTP utilisée par le
client
String getHeader(String Key)
Récupère la valeur de l'attribut Key de l'en-
tête
String getRemoteHost() Récupère le nom de domaine du client
String getRemoteAddr() Récupère l'adresse IP du client
String getParameter(String
Key)
Récupère la valeur du paramètre
Key (clé) d'un formulaire.
Lorsque plusieurs valeurs sont
présentes, la première est
retournée
String[] getParameterValues(String
Key)
Récupère les valeurs correspondant au
paramètre Key (clé) d'un formulaire,
c'est-à-dire dans le cas d'une sélection
multiple (cases à cocher, listes à choix
multiples) les valeurs de toutes les entités
sélectionnées
Enumeration getParameterNames()
Retourne un objet Enumeration contenant la
liste des noms des paramètres passés à la
requête
String getServerName() Récupère le nom du serveur
String getServerPort() Récupère le numéro de port du serveur
26.
HttpServletResponse
Méthode Description
String setStatus(intStatusCode) Définit le code de retour de la réponse
void setHeader(String Nom, String Valeur) Définit une paire clé/valeur dans les en-têtes
void setContentType(String
type)
Définit le type MIME de la réponse
HTTP, c'est-à-dire le type de
données envoyées au navigateur
void setContentLength(int len) Définit la taille de la réponse
PrintWriter getWriter()
Retourne un objet PrintWriter
permettant d'envoyer du texte au
navigateur client. Il se charge de
convertir au format approprié les
caractères Unicode utilisés par Java
ServletOutputStream getOutputStream()
Définit un flot de données à envoyer au client, par
l'intermédiaire d'un objet ServletOutputStream, dérivé de
la classe java.io.OutputStream
27.
Première Servlet
package web;
importjava.io.*;
import javax.servlet.ServletException;
import javax.servlet.http.*;
public class FirstServlet extends HttpServlet {
protected void doGet(HttpServletRequest request,
HttpServletResponse response) throws
ServletException, IOException {
response.setContentType("text/html");
PrintWriter out = response.getWriter();
out.println("<HTML>");
out.println("<HEAD><TITLE> Titre </TITLE></HEAD>");
out.println("<BODY>");
out.println("Ma première servlet");
out.println("</BODY>");
out.println("</HTML>");
out.close();
}
}
28.
Déploiement d’une servlet
Pour que le serveur j2ee reconnaisse une servlet,
celle-ci doit être déclarée dans le fichier web.xml
qui se trouve dans le dossier WEB-INF.
Le fichier web.xml s’appelle le descripteur de
déploiement de Servlet.
Ce descripteur doit déclarer principalement les
éléments suivant :
Le nom attribué à cette servlet
La classe de la servlet
Le nom URL à utiliser pour faire appel à cette servlet
via le protocole HTTP.
Suivi de session
Le protocole HTTP est un protocole sans état
impossibilité alors de garder des informations d’une
requête à l’autre (identifier un client d’un autre)
Obligation d’utiliser différentes solutions pour remédier
au problème d’état
• Cookies persistants
• session
33.
Cookies persistants :Cookie
Un cookie est une information envoyée au navigateur
(client) par un serveur WEB qui peut ensuite être relue
par le client
lorsqu’un client reçoit un cookie, il le sauve et le renvoie
ensuite au serveur chaque fois qu’il accède à une page
sur serveur
La valeur d’un cookie pouvant identifier de façon unique
un client, ils sont souvent utilisés pour le suivi de
session
Les cookies ont été introduits par la première fois dans
Netscape Navigator
34.
L’API Servletfournit la classe javax.servlet.http.Cookie
pour travailler avec les Cookies
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): spécifie l’âge maximum du
cookie
35.
Pour lacréation d’un nouveau cookie, il faut l’ajouter à
la réponse (HttpServletResponse)
addCookie(Cookie mon_cook): ajoute à la réponse un
cookie
La Servlet récupère les cookies du client en exploitant la
réponse (HttpServletRequest)
Cookie[] getCookies(): récupère l’ensemble des
cookies du site
36.
Code pourcréer un cookie et l’ajouter au client
Code pour récupérer les cookies
37.
Exemple : gestionde session (identifier un client
d’un autre)par l’intermédiaire des cookies
persistants
38.
Session : HttpSession
Solution 2: utilisation de l’API de suivi de session
HttpSession
Méthodes de création liées à la requête
(HttpServletRequest)
HttpSession getSession() : retourne la session associée à
l’utilisateur
HttpSession getSession(boolean p) : création selon la valeur
de p
39.
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 napar la
valeur va
removeAttribut(String na): supprime l’attribut associé à
na
Destruction (HttpSession)
invalidate() : expire la session
logout() : termine la session
Collaboration de Servlets
Les Servlets s’exécutant dans le même 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 données
Partage du contrôle: une requête.
Réception d’une requête par une Servlet et laisser l’autre
Servlet une partie ou toute la responsabilité du
traitement
42.
La collaborationest obtenue par l’interface ServletContext
Une Servlet retrouve le ServletContext de son application
web par un appel à getServletContext()
Exemples de méthodes:
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 liés
void removeAttribute(String name) : supprime l’objet lié
sous le nom indiqué
43.
Collaboration de Servlets: partage du
contrôle
Deux types de distribution
Distribuer un renvoi : une Servlet peut
renvoyer une requête entière
Distribuer une inclusion : une Servlet peut
inclure du contenu généré
Les avantages sont
La délégation de compétences
Architecture logicielle MVC (Servlet = contrôle
et JSP = présentation)
44.
Le supportde la délégation de requête est obtenu par
l’interface RequestDispatcher
Une Servlet obtient une instance sur la requête
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 extérieur (utilisation de getContext())
Utiliser la méthode getRequestDispatcher(String path)
45.
Partage du contrôle: distribuer
un renvoi
La méthode forward(...)de l’interface RequestDispatcher
renvoie une requête d’une Servlet à une autre ressource
sur le serveur
void forward(ServletRequest req,
ServletResponse res): redirection de requête
Partage du contrôle: distribuer
une inclusion
La méthode include(…)de l’interface RequestDispatcher inclut
le contenu d’une ressource dans la réponse courante
La différence avec une distribution par renvoi est :
la Servlet appelante garde le contrôle de la réponse
elle peut inclure du contenu avant et après le contenu inclus
Possibilité de transmettre des informations lors de l’inclusion:
en attachant une chaîne d’interrogation (au travers de l’URL)
en utilisant les attributs de requête via la méthode
setAttribute(...)