Java Avancé : J2EE
madani.a@[Link]
Plan du cours
• Introduction / Rappels
• Servlets
• JSP
• Modèle MVC
• FrameWork Hibernate
• Etudes de cas
J2EE
- Introduction-
Introduction
• J2EE (Java Entreprise Edition) est devenu la
plateforme de choix des grandes entreprises
• J2EE est très majoritairement utilisé pour
réaliser des applications web solide robuste
et bien structuré.
Introduction
• J2EE est conçu comme un langage, une
plateforme pour le développement des
applications web.
• On peut le comparer à :
– PHP
– Django de python
– [Link] de Microsoft
– Ruby on Rails
Introduction
• J2EE se fonde sur un modèle en plusieurs
couches (tiers en anglais)
• On parle d'architecture 3 tiers ou multi-tiers
– tier client
– tier serveur J2EE, composé de :
• tier web
• tier métier (business)
– tier EIS (Enterprise Information Systems)
Introduction
J2EE
- Rappels-
Rappel
Pages statiques # pages dynamiques
Lorsque vous visitez une page statique,
[Link] par exemple :
Le client situe le serveur Web spécifié dans la
première partie de l'URL ([Link]
par exemple)
Le serveur Web demande ensuite la page statique
spécifiée dans la deuxième partie de l'URL (/[Link],
par exemple)
Le serveur Web envoie le contenu de ce fichier au
format HTML
Le client reçoit alors le fichier HTML envoyé par le
serveur Web
Le client traduit les balises HTML du fichier et affiche
ensuite le résultat.
abdellah_madani@[Link] 9
Rappel
Pages statiques # pages dynamiques
Lorsque vous visitez une page dynamique,
[Link] par exemple :
Le client situe le serveur Web spécifié dans la
première partie de l'URL ([Link]
par exemple)
Le serveur Web demande ensuite la page dynamique
spécifiée dans la deuxième partie de l'URL (/[Link],
par exemple)
Le serveur lit le fichier et traite le code
Le résultat du traitement est envoyé au client, au
format HTML
Le client reçoit alors le fichier HTML envoyé par le
serveur
Le client traduit les balises du fichier HTML reçu et
l'affiche
abdellah_madani@[Link] 10
Rappel
Pages statiques # pages dynamiques
Page statique (côté client) Page dynamique (côté serveur)
Le navigateur exécute le script Le code du script est exécuté
après avoir chargé par le serveur avant de
complètement la page transmettre au navigateur le
Le code du script fait partie de résultat
la page et peut donc être lu Le code du script n'est pas
par l'utilisateur (Menu transmis au navigateur, il est
affichage code source) donc invisible par l'utilisateur
Le code du script doit être pris Le script est indépendant du
en charge par le navigateur et navigateur, mais impose un
les différences entre équipement adéquat sur le
navigateurs rendent parfois serveur Web
difficile l'écriture des scripts
abdellah_madani@[Link] 11
Rappel
Pages statiques # pages dynamiques
Rappel
Pages statiques # pages dynamiques
Rappel
Pages statiques # pages dynamiques
Rappel
Intérêt du traitement côté serveur
Diminution du trafic réseau
Absence de problèmes de compatibilité des
navigateurs
Accès aux bases de données
Code invisible (confidentialité)
abdellah_madani@[Link] 15
J2EE
- Servlet -
Introduction aux servlets
Navigateur web Serveur web
Requête HTTP
Conteneur de servlet
Method=GET ou POST
HttpRequest
Servlet
COOKIES
Réponse HTTP doGet()
HttpResponse
doPost()
(HTML, javascript, css, XML)
HttpSession
LE PROTOCOLE HTTP
HTTP :HyperText Tranfert Protocol
Protocole qui permet au client de récupérer des documents du serveur
Ces documents peuvent être statiques (contenu qui ne change pas :
HTML, PDF, Image, etc.) ou dynamiques (Contenu généré
dynamiquement au moment de la requête : PHP, JSP, ASP, etc.)
Ce protocole permet également de soumissionner des données
(formulaires, liens hypertexte)
Protocole de rapatriement des documents
Fonctionnement
Connexion
demande (GET, POST) d’un document : Requête HTTP
renvoi du document (status=200) ou d’une erreur (status=404 quand le
document n’existe pas)
déconnexion
Méthodes du protocole HTTP
Récupération d’un document
méthode GET
Soumission d’un formulaire
méthodes GET ou POST
Envoyer un fichier du client au serveur
Méthode PUT
Demander au serveur de supprimer un fichier
Méthode DELETE
Récupérer des informations sur un document (type, taille,
date de dernière modification, …)
Méthode HEAD
Le client envoie la requête : Méthode POST
Entête de la requête
Post /Nom_Script HTTP/1.0 Méthode,chemin,version
REMOTE_ADDR: [Link] Documents acceptés
HTTP_ACCEPT_LANGUAGE : fr
Accept : image/jpeg
Type et version du
User-Agent : Mozilla/4.0 navigateur ayant soumis
*** saut de ligne *** la requête.
Var1=Value1&
Paramètres des différents
Var2=Value2 champs du formulaire.
Var3=Value3
corps de la requête
Le client envoie la requête : Méthode GET
Entête de la requête
GET /Nom_Script?var1=val1&var2=val2&…. HTTP/1.0
REMOTE_ADDR: [Link]
HTTP_ACCEPT_LANGUAGE : fr
Accept : image/jpeg
User-Agent : Mozilla/4.0
corps de la requête est vide
Le Serveur retourne la réponse :
Entête de la réponse
HTTP/1.0 200 OK Ligne de Status
Date : Wed, 05Feb02 [Link] GMT
Server : Apache/1.3.24 Nom du Serveur
Mime-Version 1.0
Dernière modification
Last-Modified : Wed 02Oct01 [Link]GMT
Content-Type : Text/html
Type de contenu
Content-length : 4205 Sa taille
*** saut de ligne ***
<HTML><HEAD> Le fichier que le client va
afficher
….
</BODY></HTML>
corps de la réponse
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 CGI et les langages de script
côté serveur tels que ASP ou bien PHP
Les servlets (PHP) sont au serveur Web ce que les
applets (HTML, JS) sont au navigateur pour le
client.
Les servlets permettent donc de gérer des requêtes
HTTP et de fournir au client une réponse HTTP
dynamique.
Le moteur de servlet (conteneur de servlet) permet
d’établir le lien entre la servlet et le serveur Web
Architecture du package Servlet
[Link]
Toutes les servlets implémentent directement ou GenericSrvlet
indirectement l'interface Servlet, en dérivant une
classe qui l'implémente: c'est-à-dire généralement service()
la classe HttpServlet, elle-même issue de
GenericServlet.
La classe GenericServlet HttpServlet
([Link]) définit une classe doPost()
abstraite (implémentation de base de l'interface
doGet()
Servlet).
NotreServlet
doPost()
doGet()
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, ...)
L'objet HttpServletResponse permettant de renvoyer une
réponse au client (envoyer des informations au navigateur).
protected void service(HttpServletRequest, HttpServletResponse)
throws ServletException, IOException
Développement d’une servlet
Dans la suite nous allons utiliser uniquement les servlets qui
réagissent au protocole HTTP, d’où l’utilisation de la classe
HttpServlet
Afin de développer une 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.
Développement d’une servlet
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 :
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
)
Développement d’une servlet
import [Link].*;
import [Link].*;
Import [Link].*;
public class ServletName extends HttpServlet {
public void doGet(HttpServletRequest req, HttpServletResponse res) throws
ServletException {
// lecture de la requete
// traitements
// envoi de la reponse
}
public void doPost(HttpServletRequest req, HttpServletResponse res) throws
ServletException {
// lecture de la requete
// traitements
// envoi de la reponse
}
}
Première Servlet
import [Link].*;
import [Link].*;
import [Link].*;
public class PremiereServlet extends HttpServlet {
public void doGet(HttpServletRequest request,
HttpServletResponse response) throws
ServletException, IOException {
[Link]("text/html");
PrintWriter out = [Link]();
[Link]("<HTML>");
[Link]("<HEAD><TITLE> Titre </TITLE></HEAD>");
[Link]("<BODY>");
[Link]("Ma première <b>servlet</b>");
[Link]("</BODY>");
[Link]("</HTML>");
[Link]();
}
}
Structure d’un projet J2EE
• Le dossier src contient les
classes java
• Le byte code est placé dans le
dossier build/classes
• Les dossier WebContent
contient les documents Web
comme les pages HTML, JSP,
Images, Java Script, CSS …
• Le dossier WEB-INF contient
les descripteurs de
déploiement comme [Link]
• Le dossier lib permet de
stocker les bibliothèques de
classes java ([Link])
Déploiement d’une Servlet
• Pour que le serveur Tomcat reconnaisse une servlet,
celle-ci doit être déclarée dans le fichier [Link] qui se
trouve dans le dossier WEB-INF.
• Le fichier [Link] 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.
Descripteur de déploiement de la servlet: [Link]
Exemple
• Pour un projet web J2EE, utilisant un module web,
version 3.0, le fichier [Link] n’est pas nécessaire.
• Dans ce cas, le déploiement d’une servlet peut se faire
en utilisant des annotations:
package web;
import [Link].*; import [Link].*;
import [Link].*;
import [Link].*;
@WebServlet(name="cs",urlPatterns={"/fs","*.do"})
public class FirstServlet extends HttpServlet {
}
Charger et invoquer une Servlet
D'une manière générale, une URL du type :
[Link]
Machine ou Liste des
Alias paramètres et
se trouve le Numéro de port Web appli. correspondant à de leurs
serveur de sur lequel il est à <url-pattern> valeurs
servlets l’écoute
Charger et invoquer une Servlet: Exemple
HttpServletRequest
Méthode Description
String getMethod() Récupère la 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
Récupère la valeur du paramètre Key
(clé) d'un formulaire. Lorsque
String getParameter(String Key)
plusieurs valeurs sont présentes, la
première est retournée
Récupère les valeurs correspondant au paramètre
Key (clé) d'un formulaire, c'est-à-dire dans le
String[] getParameterValues(String Key) cas d'une sélection multiple (cases à cocher,
listes à choix multiples) les valeurs de toutes les
entités sélectionnées
Retourne un objet Enumeration contenant la liste
Enumeration getParameterNames()
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
HttpServletResponse
Méthode Description
Définit le type de la réponse HTTP, c'est-à-
void setContentType(String type) dire le type de données envoyées au
navigateur
void setContentLength(int len) Définit la taille de la réponse
Retourne un objet PrintWriter permettant
PrintWriter getWriter()
d'envoyer du texte au navigateur client.
void sendredirect(String Permet de rediriger le client vers l'URL
location) location
HttpServletRequest : Exemple
Page JSP équivalente : Exemple
Forwarding : Exemple
Pour séparer les rôles, une Servlet peut faire un forward
vers une JSP de la manière suivante :
Redirection : Exemple
Une servlet peut rediriger vers une autre ressourse locale ou distante
en utilisant la méthode sendRedirect() de l’objet response.
Effectuer un pull client : Exemple
Cycle de vie d’une Servlet
Cycle de vie d’une Servlet
1) Le serveur crée un pool de threads auxquels il va pouvoir affecter
chaque requête
2) La servlet est chargée au démarrage du serveur ou lors de la première
requête
3) La servlet est instanciée par le serveur
4) La méthode init() est invoquée par le conteneur
5) Lors de la première requête, le conteneur crée les objets Request et
Response spécifiques à la requête.
6) 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
7) Grâce à l'objet request, la méthode service() va pouvoir analyser les
informations en provenance du client
8) Grâce à l'objet response, la méthode service() va fournir une réponse au
client
9) 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 .
Session
L'objet HttpSession permet de mémoriser
les données de l'utilisateur, grâce à une
structure similaire à une table de hachage
Cet Objet permet de relier chaque id de
session à l'ensemble des informations
relatives à l'utilisateur.
L'objet HttpSession s'obtient grâce à la
méthode getSession() de l'objet
HttpServletRequest.
Gérer une session
La gestion des sessions se fait de la manière
suivante :
Obtenir l'ID de session
Vérifier si une session est associé à l'ID
Si la session existe, obtenir les informations
Sinon
Générer un ID de Session
Enregistrer la session avec l'ID nouvellement créé
Obtenir une session
La méthode getSession() de l'objet
HttpServletRequest permet de retourner la
session relative à l'utilisateur
HttpSession getSession(boolean create)
L'argument create permet de créer une
session lorsqu'il prend la valeur true.
Obtenir des informations d’une session
Pour obtenir une valeur précédemment
stockée dans l'objet HttpSession, il suffit
d'utiliser la méthode getAttribute() de l'objet
HttpSession.
Object getAttribute("cle")
La méthode getAttribute() retourne un objet.
Si l'attribut passé en paramètre n'existe pas,
la méthode getAttribute() retourne la valeur
null.
Obtenir des informations d’une session
public void doGet (HttpServletRequest request, HttpServletResponse
response) throws ServletException, IOException {
HttpSession session = [Link](true); // Recupere la session
int Age = (int)[Link]("Age"); // Recupere l'age de l'utilisateur
if (Age != null) {
// ... faire quelque chose
out = [Link](); // Ecrit la reponse
}
else {
Age = new Integer(...);
// ... faire quelque chose d'autre
out = [Link](); // Ecrit la reponse
}
}
Stocker des informations dans une session
Le stockage d'informations dans la session
est similaire à la lecture. Il suffit d'utiliser la
méthode setAttribute() en lui fournissant
comme attributs la clé et la valeur associée.
Object setAttribute("cle","valeur")