Vous êtes sur la page 1sur 36

Plan

 Introduction

 Architecture Java EE

 Le conteneur web

 Accès à la base de données


Java EE
Java Enterprise Edition  Le conteneur EJB
Ghada Feki
2 LTIC IoT
 La persistance des données en Java (JPA)

2 Ghada Feki

Web Dynamique
Confiance

Echange entre
applications
Introduction
Java Enterprise Edition Etat /
Architecture logicielle Banque /
Ghada Feki MVC Entreprise

4 Ghada Feki
Applications
Desktop

Concurrents

Applications
Bibliothèques Web

5 Ghada Feki 6 Ghada Feki

JEE n’impose pas un


style de rangement !

Eviter les problèmes

Ref : openclassrooms.com
Architecture interne MVC
7 Ghada Feki 8 Ghada Feki
MVC
Modèle
Vue
Contrôleur
HTML + Java
Ref : openclassrooms.com
Code

9 Ghada Feki 10 Ghada Feki

Framework Java EE
Architecture Java EE
Java EE
Ghada Feki

11 Ghada Feki
Plan Architecture des applications (3-tiers)

 Architecture des applications (3-tiers)


Présentation Services Métiers Persistance

 Java EE : Architecture 4-tiers (Client léger web)


Machine Client Serveur d’applications Serveur de données

 Plateforme Java EE  Présentation : Interface utilisateur pour interagir avec


l’application.
 Java EE : Technologies intégrées / Objectifs  Applicatif / Services métiers : Intègre la logique
métier / services offerts aux utilisateurs.
 Persistance : Enregistrement sur un support physique
des données de l’application.
13 Ghada Feki 14 Ghada Feki

Java EE / Architecture 4-tiers (Client léger :


navigateur web)
 Présentation
 Interaction avec la partie applicative sur le serveur Conteneur Web
• Via JSP/Servlet (s’occupe de la logique présentation)
Navigateur Web Logique de présentation
Servlet/JSP
 Logique applicative
• Réalisée par composants EJB
• Communication via Hibernate ou JDBC pour
Composants
interroger BD distante Logique métier
EJB
 Persistance
Conteneur EJB SGBD

Serveur Java EE Serveur données

15 Ghada Feki 16 Ghada Feki


Plateforme Java EE
 JavaEE comprend notamment :
 Plateforme : base générique fournissant un ensemble de
fonctionnalités utiles pour une majorité d’applications. • Les spécifications du serveur d'application

 Plateforme Java EE est un ensemble constitué de services • Des services, au travers d'API (Application
(API) offerts et de l'infrastructure d'exécution. Programming Interface : Interface de programmation
d’applications , contenant un ensemble de fonctions
courantes de « bas niveau » permettant des
applications de « haut niveau »)

17 Ghada Feki 18 Ghada Feki

Les Services d'infrastructure

Les outils de la plateforme Java EE


 JDBC (Java DataBase Connectivity) est une API
d'accès aux bases de données relationnelles
• Les composants
o Les composants web : JSP (Java Server Pages) et  JNDI (Java Naming and Directory Interface) est
Servlets une API d'accès aux services de nommage, aux annuaires
o Les composants métier : EJB (Enterprise Java Beans)
d'entreprises et aux serveur de noms des références sur
des objets distants.
• Les services  JTA/JTS (Java Transaction API/Java Transaction
o Les Services d'infrastructure Services) est un API définissant des interfaces standard
o Les services de communication
avec un gestionnaire de transactions.

19 Ghada Feki 20 Ghada Feki


Les services de communication

 JCA (JavaEE Connector Architecture) est une API  JAAS (Java Authentication and Authorization
de connexion au système d'information de l'entreprise, Service) est une API de gestion de l'authentification et
tels que les ERP des droits d'accès.

 JMX (Java Management Extension) fournit des  JavaMail est une API permettant l'envoi de courrier
extensions permettant de développer des applications électronique.
web de supervision d'applications

21 Ghada Feki 22 Ghada Feki

Java EE / Technologies intégrées


 Composants logiciels: EJB
 Applications orientées Web : JSP, servlet
 JMS (Java Message Service) fournit des fonctionnalités
de communication asynchrone (appelées MOM pour  Communication à distance : Java RMI, IIOP, JMS
Middleware Object Message) entre applications.  Gestion données distantes : JDBC, JPA
 Gestion d’annuaires (type LDAP) : JNDI
 RMI (Remote Method Invocation) est une API
 Transactions : JTA
permettant la communication entre objets distants.

23 Ghada Feki 24 Ghada Feki


Java EE / Objectifs
 Faciliter le développement de nouvelles applications à
base de composants Conteneur Web JDBC
 Intégration avec les systèmes d’information existants HTTP
Navigateur Web JMS
 Support pour les applications « critiques » de l’entreprise Servlet/JSP
JTA
 Disponibilité, tolérance aux pannes, montée en charge,
RMI JAAS
securité ...
Composants JNDI
EJB
RMI
Application Java Conteneur EJB SGBD
Services / API

Serveur Java EE Serveur données

25 Ghada Feki 26 Ghada Feki

Plan

 Les Servlet

 Les pages JSP

Conteneur Web  Les JavaBeans


Java EE
 Les Expressions Language EL et la librairie JSTL
Ghada Feki

28 Ghada Feki
Les Servlets Création d'une Servlet
 Une servlet est un programme qui s’exécute coté serveur  Les servlets sont des classes java qui jouent le rôle
en tant qu’extension du serveur. d'aiguilleurs dans une application (Contrôleur).
 Une servlet est un composant qui étend les  une servlet HTTP doit hériter de la classe
fonctionnalités d'un serveur web de manière portable et abstraite HttpServlet ;
efficace. Un serveur web héberge des classes Java servlets
qui sont exécutées à l'intérieur du container web. Le  une servlet doit implémenter au moins une des
serveur web associe une ou plusieurs URLs à chaque méthodes doXXX(), afin d'être capable de traiter une
servlet. La servlet est invoquée lorsque des requêtes requête entrante.
HTTP utilisateur sont soumises au serveur.
 Une servlet est une classe Java qui permet de créer
dynamiquement des données au sein d'un serveur HTTP.
Ces données sont présentées au format JSP.

29 Ghada Feki 30 Ghada Feki

Récupérer une
ressource web du
GET serveur via une URL doGet() HttpServletRequest contient la requête HTTP, et donne accès à
toutes ses informations, telles que les en-
têtes (headers) et le corps de la requête.
Soumettre au
serveur des données
POST de tailles variables
doPost() HttpServletResponse initialise la réponse HTTP qui sera
(volumineuses)
renvoyée au client, et permet de la
personnaliser, en initialisant par exemple
Identique à la
méthode GET mais
HEAD elle renvoie doHead() les en-têtes et le corps.
seulement les en-
têtes HTTP

31 Ghada Feki 32 Ghada Feki


Déclaration de Sevlet dans web.xml Mapping de Servlet dans web.xml
 La déclaration de Sevlet dans le fichier web.xml (WEB-  L'étape suivante est de faire correspondre la servlet
INF) est cruciale (définir l'identité). déclarée à une URL, afin qu'elle soit joignable par les
clients.
 Le rôle primordial du fichier web.xml est de configurer
<servlet-name> permet de donner un nom à une l'application en associant une Servlet à une URL. Ainsi
servlet. C'est ensuite via ce nom qu'on lorsque le client la saisira, la requête HTTP sera
fera référence à la servlet en question. automatiquement aiguillée par le conteneur de servlets
<servlet-class> sert à préciser le chemin de la classe
vers la bonne servlet (celle qui est en charge de répondre
à cette requête).
de la servlet dans votre application.

33 Ghada Feki 34 Ghada Feki

Les Pages JSP


 En Java EE, la technologie utilisée pour réaliser une vue
est JSP (Java Server Pages). En fait, c'est du HTML
amélioré (HTML+java).
<servlet-name> permet de préciser le nom de la servlet à  Il faut placer les JSP dans /WEB-INF. En fait, /WEB-INF
laquelle faire référence. Cette information cache automatiquement les ressources qu'il contient. Une
doit correspondre avec le nom défini dans
page présente sous ce répertoire n'est plus accessible
directement par une URL côté client.
la précédente déclaration de la servlet.
 Les inclusions de JSP
<url-pattern> permet de préciser la ou les URL
Dans le but d'éviter la redondance du code, on utilise les
relatives au travers desquelles la servlet inclusions de JSP comme dans le cas d'ajouter un menu.
sera accessible. Exemple :
<%@ include file="menu.jsp" %>

35 Ghada Feki 36 Ghada Feki


Stratégie de conception:
Limiter le code Java dans les JSP Versions JSP
 Deux options  Extensions de fichiers
• Ecrire 25 lignes de code directement dans une JSP
•*.jsp, page JSP standard
• Ecrire ces 25 lignes dans une classe Java à part et 1 ligne
•*.jspf, fragment de page JSP
dans une JSP pour l’invoquer
 Pourquoi la deuxième option est vraiment meilleure? •*.jspx, page JSP compatible XML
• Développement. Ecriture de la Classe dans un  Deux syntaxes
environnement Java et pas HTML •Standard (JSP 1.2)
• Debogage. S’il y a des erreurs, elles sont visible à la
compilation •XML (JSP 2.0)

• Test. L’accès à la classe Java facilite le test (ex: boucle de  Depuis la 2.0 : Extensible à travers des librairies de tag
test de100000itérations sur un serveur…) (fichier .tld) importés ou personnels.
• Réutilisation. Utilisation de la même classe dans
différentes pages JSP
37 Ghada Feki 38 Ghada Feki

Variables prédéfinies Tags / JSP


Les Tags permettent de différencier les fragments JSP du code HTML :
 Request – Instance de HttpServletRequest (1argument de
 Tag de directive : <%@ une_directive %>
service/doGet) Sert à contrôler comment le serveur Web génère la Servlet.
 Response – Instance de HttpServletResponse (2  Tag de commentaire: <%--un_commentaire --%>

argument de service/doGet) Le commentaire JSP n’est pas envoyéau client ni compilé dans la Servlet.
 Tag de déclaration:<%! une_déclaration %>
 Out – Instance de JspWriter (une version bufferisée de Sert à insérer du code Java.
Writer) utilisée pour envoyer des donnés sur la sortie  Tag de scriplet :<% un_scriptlet %>

vers leclient Un scriplet est un bloc de code Java.


 Tag d’expression:<%= une_expression %>
 Session –Instance de HttpSession associée la requête Sert à évaluer une expression et à renvoyer sa valeur.
 Application – Instance de Servlet Context (pour partager Les bibliothèques de tags («tag libraries») : collections de tags (au format xml)
utilisables dans les pages JSP.
des données) telle que obtenue via getServletContext() Exemple JSTL/Core <c:out value="EL" />

39 Ghada Feki 40 Ghada Feki


JavaBeans Comment utiliser des beans ?
 Les JavaBeans forment la partie modèle.  Une fois la classe créée, les beans sont des objets Java sur
 But: Gérer les structures de données. lesquels on peut faire ces actions :
 Recommandations pour un objet java (JavaBean): • instanciation d'un nouveau bean
• être une classe publique;
• récupération de la valeur d'une propriété du bean
• avoir au moins un constructeur par défaut, public et sans
paramètres; • affectation/modification de la valeur d'une propriété
• ne doit pas avoir de champs publics ; du bean
• peut définir des propriétés (des champs non publics), qui  Pour faire cela dans une Servlet, le bean est traité comme
doivent être accessibles via des méthodes publiques getter un objet Java standard.
et setter, suivant des règles de nommage.
 Ces objets java peuvent implémenter l'interface Serializable, ils
deviennent ainsi persistants et leurs états peuvent être
sauvegardés;
41 Ghada Feki 42 Ghada Feki

Implémentation du MVC
 Cependant, dans une JSP, l'utilisation des balise de 1. Définir les beans pour représenter les données
scriptlets n'est pas très « propre », on utilisera plutôt 2. Utiliser une servlet pour gérer les requêtes : La servlet lit
l'une des manière suivantes : les paramètres de requêtes, vérifie les données
• balises JSP (JSP 1.2) : <jsp:useBean>,
manquantes ou malformées, appelle le code métier, etc.
<jsp:getProperty>, <jsp:setProperty> 3. Créer les beans : La servlet invoque le code métier
(spécifique à l’application) ou accède à une base de
• utilisation des EL (JSP 2.0) : ${...} données pour obtenir les résultats. Les résultats sont
dans les beans définis à l’étape 1
4. Placer le bean dans le bon scope : La servlet appelle
setAttribute sur la requête, la session, ou la servlet
context pour garder une référence sur les beans qui
représentent le résultat de la requête

43 Ghada Feki 44 Ghada Feki


Implémentation du MVC avec
RequestDispatcher
5. Transmettre la requête à la JSP (forward) : La servlet
détermine quelle JSP est appropriée à la situation et getServletContext() retourne un objet ServletContext, qui fait référence
utilise la méthode forward du RequestDispatcher pour au contexte commun à toute l'application : celui-ci
transférer le contrôle à la JSP contient un ensemble de méthodes qui permettent à

Exemple : une servlet de communiquer avec le conteneur de


servlet ;
this.getServletContext().getRequestDispatcher( "/WEB- getRequestDispatcher() Permet de manipuler une ressource. Elle retourne
INF/accueil.jsp" ).forward( request, response ); un objet RequestDispatcher, qui agit comme une
enveloppe autour de la page JSP. Il est impératif d'y
préciser le chemin complet vers la JSP.
forward() réexpédier la paire requête/réponse HTTP vers la
page JSP.

45 Ghada Feki 46 Ghada Feki

6. Extraire les données des beans L'EL permet de récupérer l'information sur un bean (s'il a
• JSP 1.2 : la JSP accède aux beans avec jsp:useBean et un été mis préalablement dans un scope par une servlet avec
scope correspondant au choix de l’étape 4. La JSP utilise un setAttribute):
ensuite jsp:getProperty pour afficher les propriétés des ${nomBean.property}
beans - nomBean est celui défini lors du setAttribute fait par la servlet
• JSP 2.0: la JSP utilise ${nameFromServlet.property} pour - property est le nom de la propriété que l'on veut accéder
afficher les propriétés des beans

47 Ghada Feki 48 Ghada Feki


Un Scope
Un scope peut être vu comme un conteneur de beans stocké du  Application : ce scope est créé automatiquement au
côté du serveur (le client ne peut avoir aucune connaissance sur lancement du projet JEE sur le serveur. Les beans qu'il
ces beans).
contient sont partagés par tous les clients et ne sont
Il existe 4 types de Scopes, que l'on distingue par la durée de vie
des beans qui y sont stockés : détruit que lors de l'arrêt/rechargement du projet JEE sur
 Requête : ce scope est créé à chaque requête du client, les
le serveur.
beans qu'il contient sont détruit lorsque le serveur a envoyé la  Page : ce scope restreint la durée de vie des beans aux
réponse au client requêtes POST effectuées sur une page donnée, dès
 Session : ce scope est créé automatiquement par le qu'on en sort, les beans sont détruit.(Ce scope n'est
conteneur JEE pour chaque client qui se connecte au serveur. quasiment pas utilisé)
Les beans qu'il contient ne sont visibles que par le client
détenant la session, et sont détruit lorsque la session du client
se termine (géré par un timeout du côté du serveur)

49 Ghada Feki 50 Ghada Feki

Partage de données sur requête:


Partage de données sur requête exemple simple

51 Ghada Feki 52 Ghada Feki


Partage de données sur session Expression Language (EL)
 Syntaxe

 Limiter la présence du langage Java (non spécialiste)


 Meilleure lisibilité, le code se limite au nom des beans et de ses propriétés
 Les Expressions Languages (EL) permettent de manipuler les données d’une page
JSP (essentiellement les Beans)
 Une EL permet d’accéder simplement aux beans des différents scopes de
l’application (page, request , session et application)
 Utilisation optimale des JSP (facile, court, simple et concis).
 Forme : ${ expression }
 Opérateurs :
 Arithmétiques, applicables à des nombres : +, -, *, /, % ;
 Logiques, applicables à des booléens : &&, ||, ! ;
 Relationnels, basés sur l'utilisation des méthodes equals() et compareTo() des objets
comparés : == ou eq, != ou ne, < ou lt, > ou gt, <= ou le, >= ou ge.
 Condition: test ? si oui : sinon ;
 Vérification si vide (null) : opérateur empty.

53 Ghada Feki 54 Ghada Feki

Java Standard Tag Library (JSTL)


 La JSTL est une bibliothèque, une collection regroupant  La JSTL permet de développer des pages JSP en utilisant
des balises implémentant des fonctionnalités à des fins des balises XML sans connaissances du langage Java.
générales, communes aux applications web. Citons par  Sun a proposé une spécification pour la Java Standard Tag
exemple la mise en place de boucles, de tests Library voir adresse java.sun.com/ jsp/ jstl.
conditionnels, le formatage des données ou encore la  L’implémentation proposée vient du projet Jakarta JSTL
manipulation de données XML. Son objectif est de 1.1 disponible à l’adresse jakarta.apache.org/ taglibs.
permettre au développeur d'éviter l'utilisation de code  Avantage: Rend le code plus facile à lire, à réutiliser et à
Java dans les pages JSP, et ainsi de respecter au mieux le maintenir.
découpage en couches recommandé par le modèle MVC.  La dernière version est JSTL 1.2.
 Le but de la JSTL est de simplifier le travail des auteurs  C’est un ensemble de balises personnalisées qui propose
de JSP, c’est-à-dire les acteurs responsables de la couche des fonctionnalités souvent rencontrées dans les page JSP.
présentation.  Utilisation conjointe avec les Expressions Languages (EL).
55 Ghada Feki 56 Ghada Feki
La librairie Core
 Cette bibliothèque « core » comporte les actions de base  Elle propose les tags suivants répartis dans trois
pour la gestion des variables de scope d’une application catégories :
web : Catégorie Tag
 Affichage de variable, création, modification et set
suppression de variables de scope et de gestion des Utilisation de EL
out
remove
exceptions; catch
 Actions conditionnelles et boucles; if
 Manipulation d’URL et redirection. choose
Gestion du flux (condition et itération)
forEach
forTokens
import
Gestion des URL url
redirect
57 Ghada Feki 58 Ghada Feki

Syntaxe Core - Tag out


 Mise en place  Le tag out permet d'envoyer dans le flux de sortie de la
JSP le résultat de l'évaluation de l'expression fournie dans
 Configurer Tomcat : mettre JSTL 1.2 (fichier jar dans lib le paramètre " value ".
de WEB-INF)
 Configurer Eclipse pour qu'il connaisse les balises JSTL : Attribut Rôle
ajouter la directive taglib à la JSP. value valeur à afficher (obligatoire)

<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" default définir une valeur par défaut si la valeur est null
%> escape booléen qui précise si les caractères particuliers (< > & ...)
Xml doivent être convertis en leurs équivalents HTML (&lt; &gt;
&amp ; ...)

59 Ghada Feki 60 Ghada Feki


Syntaxe Core - Tag if
 L'attribut default permet de définir une valeur par défaut  Ce tag permet d'évaluer le contenu de son corps si la
si le résultat de l'évaluation de la valeur est null. Si la condition qui lui est fournie est vraie. Il possède plusieurs
valeur est null et que l'attribut default n'est pas utilisé
attributs :
alors c'est une chaîne vide qui est envoyée dans le flux de
sortie.
<c:out value="${personne.nom}" default="Inconnu" /> Attribut Rôle
test condition à évaluer

 Le tag out est particulièrement utile pour générer le code var nom de la variable qui contiendra le résultat de
dans un formulaire en remplaçant avantageusement les l'évaluation
scope portée de la variable qui contiendra le résultat
scriplets.
<input type="text" name="nom" value="<c:out
value="${param.nom}"/>" />

61 Ghada Feki 62 Ghada Feki

Syntaxe Core - Tag choose


<c:if test="${empty personne.nom}" >Inconnu</c:if>  Ce tag permet de traiter différents cas mutuellement
 Le tag peut ne pas avoir de corps s'il est simplement exclusifs dans un même tag. Le tag choose ne possède pas
utilisé pour stocker le résultat de l'évaluation de la d'attribut. Il doit cependant posséder un ou plusieurs tags
condition dans une variable. fils « when ».
<c:if test="${empty personne.nom}" var="resultat" />  Le tag when possède l'attribut test qui permet de
 Le tag if est particulièrement utile pour générer le code
préciser la condition à évaluer. Si la condition est vraie
dans un formulaire en remplaçant avantageusement les alors le corps du tag when est évalué et le résultat est
scriplets. envoyé dans le flux de sortie de la JSP
 Le tag otherwise permet de définir un cas qui ne
correspond à aucun des autres cas inclus dans le tag. Ce
tag ne possède aucun attribut.

63 Ghada Feki 64 Ghada Feki


Syntaxe Core - Tag forEach
<c:choose>  Ce tag permet de parcourir les différents éléments d'une
<c:when test="${personne.civilite == 'Mr'}">
collection et ainsi d'exécuter de façon répétitive le
Bonjour Monsieur
</c:when> contenu de son corps. Il possède plusieurs attributs :
<c:when test="${personne. civilite == 'Mme'}"> Attribut Rôle
Bonjour Madame var nom de la variable qui contient l'élément en cours de
</c:when> traitement
<c:when test="${personne. civilite == 'Mlle'}"> items collection à traiter
Bonjour Mademoiselle varStatus nom d'une variable qui va contenir des informations sur
</c:when> l'itération en cours de traitement
begin numéro du premier élément à traiter (le premier possède
<c:otherwise>
le numéro 0)
Bonjour end numéro du dernier élément à traiter
</c:otherwise> step pas des éléments à traiter (par défaut 1)
</c:choose>

65 Ghada Feki 66 Ghada Feki

 A chaque itération, la valeur de la variable dont le nom <c:forEach begin="1" end="4" var="i">
est précisé par la propriété var change pour contenir <c:out value="${i}"/><br>
l'élément de la collection en cours de traitement. </c:forEach>
 Pour les attributs, la seule obligation est d'avoir défini soit
l'attribut items, soit les attributs begin et end.
 L'attribut step permet de préciser le pas de l'itération.
 Le tag forEach peut aussi réaliser des itérations sur les
nombres et non sur des éléments d'une collection. Dans
ce cas, il ne faut pas utiliser l'attribut items mais <c:forEach begin="1" end="12" var="i" step="3">
uniquement utiliser les attributs begin et end pour fournir <c:out value="${i}"/><br>
les bornes inférieures et supérieures de l'itération. </c:forEach>

67 Ghada Feki 68 Ghada Feki


Syntaxe Core - Tag forTokens
 L'attribut delims peut avoir comme valeur une chaîne de caractères ne
 Ce tag permet de découper une chaîne selon un ou contenant qu'un seul caractère (délimiteur unique) ou un ensemble de
plusieurs séparateurs donnés et ainsi d'exécuter de façon caractères (délimiteurs multiples).
répétitive le contenu de son corps autant de fois qu'il y a
<c:forTokens var="token" items="chaine 1;chaine 2;chaine 3" delims=";">
d'occurrences trouvées. <c:out value="${token}" /><br>
 Il possède plusieurs attributs : </c:forTokens>
Attribut Rôle
var variable qui contient l'occurrence en cours de traitement  Dans le cas où il y a plusieurs délimiteurs, chacun peut servir de séparateur.
(obligatoire)
items la chaîne de caractères à traiter (obligatoire) <c:forTokens var="token" items="chaine 1;chaine 2,chaine 3" delims=";,">
delims précise le ou les séparateurs <c:out value="${token}" /><br>
varStatus nom d'une variable qui va contenir des informations sur l'itération </c:forTokens>
en cours de traitement
begin numéro du premier élément à traiter (le premier possède le
numéro 0)
end numéro du dernier élément à traiter
69 Ghada Feki 70 Ghada Feki
step pas des éléments à traiter (par défaut 1)

 Il n'y a pas d'occurrence vide. Dans le cas où deux séparateurs sont <c:forTokens var="token" items="chaine 1;chaine 2;chaine 3"
juxtaposés dans la chaîne à traiter, ceux-ci sont considérés comme delims=";" begin="1" end="1" >
un seul séparateur. Si la chaîne commence ou se termine par un
séparateur, ceux-ci sont ignorés. <c:out value="${token}" /><br>
<c:forTokens var="token" items="chaine 1;;chaine 2;;;chaine 3" </c:forTokens>
delims=";">
<c:out value="${token}" /><br>
</c:forTokens>  Résultat: chaine 2

 Il est possible de ne traiter qu'un sous-ensemble des occurrences de  Il est possible de n'utiliser que l'attribut begin ou l'attribut end.
la collection. JSTL attribut à chaque occurrence un numéro Si seul l'attribut begin est précisé alors les dernières
incrémenté à partir de 0.
occurrences seront traitées. Si seul l'attribut end est précisé
 Les attributs begin et end permettent de préciser une plage alors seules les premières occurrences seront traitées.
d'occurrences à traiter.
  Les attributs varStatus et step ont le même rôle que ceux du
tag forEach.
71 Ghada Feki 72 Ghada Feki
Contrôle d'un formulaire par une Servlet
 La balise form annonce le début d'un formulaire. Le contrôle un formulaire par une sevlet se fait
 Attribut method de la balise form peut avoir ces deux principalement en deux phases :
valeurs :  Au niveau de la servlet :
 GET: correspond à l'appel d'une page par le navigateur Liaison Sevlet-JSPformulaireInit par doGet.
(barre d'adresse ou lien) Liaison Sevlet-JSPformulaireResultat par doPost.
 Transmet les paramètres dans l'URL :  Au niveau de la JSP formulaireInit :
 http://localhost:8080/servlet/test?param=value Mentionner la servlet comme action dans le formulaire avec
 POST: plus adapté au transfert de données depuis un method=post.
formulaire

73 Ghada Feki 74 Ghada Feki

Accès à la base de données

Se connecter à une
base de données et
effectuer
des manipulations sur
cette base.
Accès à la base de données
Java EE API
JDBC
Ghada Feki
Java Database Connectivity

76
Accès à la base de données Accès à la base de données
 JDBC est l'acronyme de « Java DataBase  Pour manipuler une base de données, il faut importer des
Connectivity » et désigne une API (en français interface classes du package java.sql.
de programmation, en anglais Application Programming  Les principales classes de ce package sont :
Interface) créée par Sun (achetée depuis par Oracle) qui • DriverManager
permet d’exécuter des instructions SQL afin de
• Connection
permettre un accès aux bases de données avec Java. L’api
JDBC est disponible dans le package java.sql qui est • Statement
nativement présent au sein de l’api JAVA. • PreparedStatement
• ResultSet
 Ces classes seront utilisées pour accéder à une base de
données depuis un programme java.

77 78

Accès à la base de données Accès à la base de données


 La classe DriverManager charge et configure le driver  Concrètement, pour manipuler une base de données, il
de la base de données. faut suivre les étapes suivantes :
 La classe Connection réalise la connexion et 1) Chargement du pilote
l’authentification à la base de données. 2) Connexion à la base de données
 La classe Statement (et PreparedStatement) 3) Exécution de la requête
contient la requête SQL et la transmet à la base de 4) Exploitation des résultats de la requête s'il s'agit
données. d'une requête de sélection
 La classe ResultSet permet de parcourir les 5) Fermeture de la connexion
informations retournées par la base de données dans le
cas d’une sélection de données. Il contient les données de
la ligne courante et un pointeur sur la ligne suivante.

79 80
Accès à la base de données : Chargement du Accès à la base de données : Chargement du
pilote pilote
 Cette étape consiste à choisir le pilote (driver) du  Exemple 1
SGBD à utiliser ultérieurement pour la connexion et le Class.forName( "sun.jdbc.odbc.JdbcOdbcDriver " ) ;
charger. permet de se connecter à toute base de données via
ODBC (Open Database Connectivity) à travers
 Pilote: contient toutes les classes nécessaires pour une source de données ODBC.
communiquer avec une base de données.
 très utilisée avec base de données sous windows
 Syntaxe :  ne nécessite pas un téléchargement de pilote mais une
Class.forName("<nom du pilote>") création d'une source de données ODBC.

81 82

Accès à la base de données : Chargement du Accès à la base de données : Chargement du


pilote pilote
 Exemple 2
 Class.forName("oracle.jdbc.driver.OracleDriver"); permet
de se connecter à une base de données créée sous
Oracle. Il faut avant tout télécharger le pilote (un fichier
.jar).
 Remarque : l’utilisation de la méthode Class.forName()
peut lever une exception de type
java.lang.ClassNotFoundException (exception
explicite) si le pilote recherché n'a pas pu être trouvé.
Donc cette exception doit être traitée.

83 84
Accès à la base de données : Accès à la base de données :
Chargement du pilote Connexion à la base
 Pour établir une connexion, on utilisera la méthode
statique getConnection de la classe DriverManager
qui retourne un objet de type Connection

 Syntaxe :
Connection
connection=DriverManager.getConnection("<url de la
base de données>",[nomUtilisateur],[motDePasse]);

85 86

Accès à la base de données : Accès à la base de données :


Connexion à la base Connexion à la base
Afin de localiser la base de données, il est indispensable de
spécifier une adresse sous forme d’URL qui est dérivée des
url d'internet dont le schéma général est :
String url = "jdbc:<subprotocol>:<subname>";
 <jdbc>: Le protocole dans une URL JDBC est toujours
jdbc
 <subprotocol> Cela correspond au nom du driver ou au
mécanisme de connexion à la base de données.
 <subname> Une manière d'identifier la source de
données. Ce dernier élément dépend complètement du
sous-protocole et du driver.

87 88
Accès à la base de données : Accès à la base de données :
Connexion à la base Connexion à la base
Exemple :  1er exemple d'une connexion avec un pilote
 jdbc:odbc:maBase;CacheSize=30; sun.jdbc.odbc.JdbcOdbcDriver (en supposant que «
 jdbc:mysql://localhost/maBase
E_INFO_04 » est le nom d'une source de données
ODBC).
 jdbc:oracle:oci8@:maBase
 jdbc:oracle:thin@://localhost:8000:maBase
 Remarque : l’utilisation de la méthode getConnection
 jdbc:sybase:Tds:localhost:5020/maBase
peut lever une exception de type
java.sql.SQLException (exception explicite) si la
Le nom de la base de données doit être celui saisi dans le connexion échoue. Donc cette exception doit être
nom de la source de données sous ODBC. traitée.

89 90

Accès à la base de données : Accès à la base de données :


Connexion à la base Connexion à la base
 2éme exemple d'une connexion avec un pilote
sun.jdbc.odbc.JdbcOdbcDriver (sans créer une source de
données)

91 92
Accès à la base de données : Accès à la base de données :
Connexion à la base Connexion à la base
 3éme exemple d'une connexion avec un pilote
sun.jdbc.odbc.JdbcOdbcDriver (sans créer une source de
données) et un objet instance de la classe
java.util.Properties

93 94

Accès à la base de données : Accès à la base de données


Connexion à la base Application

//méthode pour la connection


public static Connection connecterDB(){
try{
Class.forName("com.mysql.jdbc.Driver");
System.out.println("Driver ok");
String url="jdbc:mysql://localhost/tp4";
String user="root";
String password="";
Connection cnx=DriverManager.getConnection(url,user,password);
System.out.println("Connexion bien établie");
return cnx;
}catch(Exception e){
e.printStackTrace();
return null;
}
95 96 }
Accès à la base de données : Accès à la base de données :
Exécution de la requête Exécution de la requête
 Une fois la connexion établie, il est possible d'exécuter des  Pour une requête de type interrogation (SELECT), la
requêtes SQL. méthode à utiliser de la classe Statement est
 A partir de la connexion, créer un « statement » (état) executeQuery().
correspondant à une requête particulière.
 Les requêtes SQL sont exécutées avec les méthodes d'un  Pour des traitements de mise à jour, il faut utiliser la
objet Statement (état) que l'on obtient à partir d'un objet méthode executeUpdate().
Connection  Lors de l'appel à la méthode d'exécution, il est nécessaire
try { de lui fournir en paramètre la requête SQL sous forme de
Statement statement=connection.createStatement(); chaine.
} catch (SQLException e) {
e.printStackTrace();
}

97 98

Accès à la base de données :


Exécution de la requête
 Le résultat d'une requête d'interrogation est renvoyé  La méthode executeQuery() retourne un objet
dans un objet de la classe ResultSet par la méthode instance de la classe ResultSet qui contient des
executeQuery(). méthodes permettant de parcourir tous les
try { enregistrements sélectionnés.
ResultSet resultSet =
statement.executeQuery("SELECT * FROM etudiant");  Pour utiliser executeQuery, il faut traiter l'exception
} catch (SQLException e) { java.sql.SQLException qui est lancée au cas où il y a
e.printStackTrace(); une erreur dans la requête.
}
 Si on utilise executeQuery() pour exécuter une requête
SQL ne contenant pas d'ordre SELECT, alors une
exception de type SQLException est levée.

99 100
Accès à la base de données : Accès à la base de données :
Exécution de la requête Exécution de la requête
 Lorsque la méthode executeUpdate() est utilisée pour
 La méthode executeUpdate() permet d’exécuter une requête de exécuter un traitement de type DDL (Data Definition
mise à jours et retourne le nombre d'enregistrements qui ont été
mis à jour. Langage : définition de données) comme la création d'un
table, elle retourne 0.
try {  Si la méthode retourne 0, cela peut signifier deux choses :
String requete = " insert into etudiant values('Med',20)"; le traitement de mise à jour n'a affecté aucun
Statement statement=connection.createStatement(); enregistrement ou le traitement concernait un traitement
int nbUpdate = statement.executeUpdate(requete); de type DDL.
System.out.println("Le nombre de ligne mis à jours :
"+nbUpdate);
} catch (SQLException e) {
e.printStackTrace();
}
101 102

Accès à la base de données :


Exécution de la requête Accès à la base de données : ResultSet
 Les objets qui peuvent être utilisés pour obtenir des  La classe ResultSet contient des méthodes qui
informations sur la base de données sont : permettent de parcourir tous les enregistrements
sélectionnés. Notons, qu'au contraire de la plupart des
structures de données en java (tableaux, vector, List, etc.)
Classe Rôle les index des lignes représentant les colonnes
ResultSet Résultat d'une requête et information sur une commencent à 1.
table. L'accès se fait enregistrement par  C'est une classe qui représente une abstraction d'une
enregistrement. table qui se compose de plusieurs enregistrements
DatabaseMetaD Informations à propos de la base de données : constitués de colonnes qui contiennent les données. Les
ata nom des tables, index, version … principales méthodes pour obtenir des données sont :

ResultSetMetaD Informations sur les colonnes (nom et type)


ata d'un ResultSet
103 104
Accès à la base de données : ResultSet Accès à la base de données : ResultSet

Méthode Rôle try {


getInt(int) retourne sous forme d'entier le contenu de la colonne dont le String requete = "select nom,age from etudiant";
numéro est passé en paramètre.
ResultSet resultSet = statement.executeQuery(requete);
getInt(String retourne sous forme d'entier le contenu de la colonne dont le
) nom est passé en paramètre. while(resultSet.next())
getDate(int) retourne sous forme de date le contenu de la colonne dont le {
numéro est passé en paramètre. System.out.println(resultSet.getString("nom"));
getDate(Stri retourne sous forme de date le contenu de la colonne dont le
ng) nom est passé en paramètre.
System.out.println(resultSet.getInt("age"));
next() se déplace sur le prochain enregistrement : retourne false si la fin }
est atteinte. } catch (SQLException e) {
close() ferme le ResultSet e.printStackTrace();
getMetaData retourne un objet de type ResultSetMetaData associé au
}
() 105 ResultSet. 106

Accès à la base de données : ResultSet Accès à la base de données : Déconnexion


 Remarque 1 : la méthode next() fait avancer le curseur
d'un enregistrement à un autre. Quand il n'y plus aucun
enregistrement, la méthode retourne la valeur false. Fermeture de la connexion
 Remarque 2 : juste après l'exécution de executeQuery,
le curseur est placé juste avant le premier enregistrement.  Un objet de type Connection est automatiquement
Il faut donc exécuter la méthode next pour que le détruit par le ramasse-miettes dès qu'il ne sera plus
curseur soit sur le premier enregistrement. utilisé. Cependant, dans certaines applications (cas où
 Remarque 3 : à part getString et getInt, il existe d'autres plusieurs utilisateurs veulent accéder à la base de
méthodes de type getXxx telles que getFloat getDouble, données), il est préférable de détruire cet objet dès
getDate, getBoolean. Ces méthodes permettent de qu'on a terminé de travailler avec.
récupérer (convertir) le champ SQL dans le type Xxx.

107 108
Accès à la base de données : Déconnexion Accès à la base de données : Déconnexion

 Tout comme pour une Connection, même si le Garbage


Collector, libérera les ressources allouées au Statement, il est
conseillé de le fermer explicitement.

109 110

Accès à la base de données : Exemple Accès à la base de données : Exemple


 Créer la classe « TestConnexionMySQL » permettant :
Création de la table Personne
Insertion de trois personnes
Affichage de la personne de clef primaire = 1
Mohamed Ben Foulen (36 ans)
Affichage de toutes les personnes
1 : Mohamed Ben Foulen (36 ans)
2 : Isam Ben Foulen (40 ans)
3 : Imen Ben Foulen (48 ans)
Suppression de Mohamed et affichage de toutes les personnes
2 : Isam Ben Foulen (40 ans)
3 : Imen Ben Foulen (48 ans)
111 112
Accès à la base de données : Exemple Accès à la base de données : Exemple

113 114

Accès à la base de données : Exemple Accès à la base de données : Exemple

115 116
Accès à la base de données :
Accès à la base de données : Exemple PreparedStatement
 Ce type de requête est particulièrement adapté pour une
exécution répétée d'une même requête avec des
paramètres différents.
 L'interface PreparedStatement hérite de Statement.

117 118

Accès à la base de données :


PreparedStatement Accès à la base de données : Parcours
La version JDBC 2 prévoit :
 D’autres méthodes de déplacement du cusreur (autre
que next) : avant, arrière, saut.
 Des méthodes de modification du résultat
 Exploitation d’une nouvelle interface : RowSet

Statement createStatement(int resultSetType, int


resultSetConcurrency, int resultSetHoldability)

119 120
Accès à la base de données : Parcours Accès à la base de données : Parcours
Pour les possibilités de déplacement (int resultSetType) :  Pour les possibilités d’actualisation (int
 ResultSet.TYPE_FORWARD_ONLY : valeur par défaut. resultSetConcurrency) :
Elle indique que les déplacements du curseur ne peuvent se  ResultSet.CONCUR_READ_ONLY : c'est la valeur
faire « qu'en avant ». par défaut. Elle indique que les données contenues dans le
 ResultSet.TYPE_SCROLL_INSENSITIVE : le curseur ResultSet ne peuvent qu'être lues.
peut être déplacé dans les deux sens. Le terme insensitive
 ResultSet.CONCUR_UPDATABLE : cette valeur
indique que le ResultSet est insensible aux modifications des
valeurs dans la base de données. => vue statique des données
indique qu'on peut modifier les données de la base via le
ResultSet.
 ResultSet.TYPE_SCROLL_SENSITIVE : le curseur peut
être déplacé dans les deux sens. Le terme sensitive indique que
le ResultSet est sensible aux modifications des valeurs dans la
base de données. => vue dynamique des données

121 122

Accès à la base de données : Parcours Accès à la base de données : Parcours


 Pour le maintien des curseurs (int
resultSetHoldability) :  next() : déplace le curseur sur la ligne suivante. Elle retourne
 ResultSet.HOLD_CURSORS_OVER_COMMIT : les true si le curseur est positionné sur une ligne, false si le
curseur a dépassé la fin du tableau.
objets ResultSet ne sont pas fermés. Ils restent ouverts
 Si notre ResultSet est de type FORWARD_ONLY, alors la
lorsqu'une validation est effectuée implicitement ou
seule méthode possible est next().
explicitement ;
 previous() : déplace le curseur sur la ligne précédente.
 ResultSet.CLOSE_CURSORS_AT_COMMIT : les
 first(), last() : positionne le curseur sur la première ligne ou
objets ResultSet sont fermés lorsqu'une validation est
la dernière ligne du tableau. Retourne true ou false suivant
effectuée implicitement ou explicitement.
que cette ligne existe ou pas.
 beforeFirst(), afterLast() : positionne le curseur sur l'une
des lignes virtuelles se trouvant avant la première ligne, ou
après la dernière. Ce mouvement est toujours possible, même
123 124sur un tableau vide.
Accès à la base de données : Parcours
Accès à la base de données : Parcours Exemple 1

 relative(int rows) : déplace le curseur du nombre de lignes indiqué. Le


déplacement a lieu vers le bas du tableau si ce nombre est positif, vers le
haut s'il est négatif. Si rows vaut 0, alors le curseur ne bouge pas. Si le
tableau ne comporte pas assez de ligne, vers le haut ou vers le bas, alors
le curseur se positionne sur l'une des ligne virtuelle avant la première
ligne, ou après la dernière. Cette méthode retourne true si le curseur a
été positionné sur une ligne, false dans le cas contraire.
 absolute(int rows) : positionne le curseur en absolu dans le tableau. La
première ligne du tableau est numérotée 1, donc absolute(1) positionne
le curseur sur cette première ligne. On peut passer un paramètre négatif
à cette méthode. Dans ce cas, les lignes sont numérotées à partir de la
dernière, et en commençant par -1. Ainsi absolute(-1) positionne le
curseur sur la denière ligne du tableau, absolute(-2) sur l'avant-dernière.
L'appel à absolute(0) positionne le curseur avant la première ligne du
tableau.
125 126

Accès à la base de données : Parcours


Exemple 2 Accès à la base de données : RowSet
 L'interface RowSet est une extension de ResultSet.
Comme sa super interface, RowSet représente
un ensemble de données tabulaires. Le but de cette
interface est d'ajouter aux ResultSet : facilité d'utilisation,
flexibilité et indépendance.

127 128
Accès à la base de données : RowSet Accès à la base de données : RowSet
Facilité d'utilisation et flexibilité Indépendance
Le principal avantage des RowSet est le fait qu'ils ajoutent à L'indépendance se fait sur deux points :
l'API JDBC toute la puissance des JavaBeans. Ce qui signifie
des facilités pour :  par rapport à l'API : tous les types de RowSet sont
capables de se connecter et de lancer une instruction
SQL. Il n'est plus nécessaire de passer explicitement par
 la gestion des propriétés : on peut facilement configurer un
RowSet grâce à un ensemble de méthodes setXXX. Ces une Connection ou un Statement ;
méthodes permettent, par exemple, de spécifier le nom de  par rapport au matériel utilisé : tous les types de
l'utilisateur, l'URL de connexion ou encore une commande RowSet peuvent être mis à jour et permettent n'importe
(instruction) SQL ; quel mouvement du curseur. Donc, vous pourrez utiliser
 la gestion des événements : les RowSetListener peuvent se ces fonctionnalités même si la base de données ou le
mettre à l'écoute des événements relatifs aux RowSet. driver ne les fournissent pas directement.

129 130

Accès à la base de données : RowSet


Accès à la base de données : RowSet Exemple
On peut séparer les différents RowSet en deux
catégories principales : les connectés et les déconnectés.

 connectés : en dehors des propriétés générales des


RowSet, leur fonctionnement est identique à celui d'un
ResultSet. C'est-à-dire que ceux-ci gardent une connexion
ouverte vers le SGBD durant tout leur cycle de vie ;
 déconnectés : les RowSet de cette catégorie sont
capables de rompre la connexion à la source, faire des
modifications sur les données, puis de se reconnecter afin
de transmettre les modifications, tout en gérant un
éventuel conflit.

131 132
Accès à la base de données : RowSet
Exemple Accès à la base de données : Métadonnées
Les métadonnées sont des connaissances qu'on peut avoir
sur la structure de tables (noms des champs et leurs types,
…) mais aussi des informations sur le SGBD lui-même.
Ainsi deux types de métadonnées peuvent être utilisés :
 Des métadonnées associés à l'objet ResultSet qui
permettent d'avoir des informations sur la structure des
tables (nom des tables, noms des champs et leurs types,
etc.)
 Des métadonnées associées à une base et qui permettent
d'avoir des informations relatives au SGBD et au pilote,
etc.

133 134

Accès à la base de données : Métadonnées Accès à la base de données : Métadonnées


Métadonnées associées au ResultSet
 La méthode getMetaData() de ResultSet retourne un
objet de type ResultSetMetaData qui contient les
méthodes permettant d'accéder aux métadonnées :

135 136
Accès à la base de données : Métadonnées Accès à la base de données : batch
Métadonnées associées à la base  Le traitement utilisant Batch regroupe plusieurs requêtes
 On commence par récupérer un objet de type dans une unité et les transmet en une seule fois à une
DatabaseMetadata à partir de la méthode base de données.
getMetaData() de la classe Connection

137 138

Accès à la base de données : batch Accès à la base de données : batch

139 140
Accès aux bases de données JDBC - Modèle
DAO
Le principe du pattern DAO est de séparer la couche
 Pour éviter de mélanger le code responsable des
modèle d'une application en deux sous couches distinctes :
traitements métier et le code responsable du stockage
 une couche gérant les traitements métier appliqués aux
des données dans les projets, la couche intermédiaire
DAO est ajoutée. données, souvent nommée couche service ou métier.
 une couche gérant le stockage des données, logiquement
 Le pattern DAO permet de faire la distinction entre les
données auxquelles on souhaite accéder, et la manière nommée couche de données. Il s'agit là des opérations
dont elles sont stockées. classiques de stockage : la création, la lecture, la
modification et la suppression. Ces quatre tâches basiques
sont souvent raccourcies à l'anglaise en CRUD.
Objet Système de
DAO
métier stockage

141 Ghada Feki 142 Ghada Feki

Vous aimerez peut-être aussi