Académique Documents
Professionnel Documents
Culture Documents
Introduction
Architecture Java EE
Le conteneur web
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
Ref : openclassrooms.com
Architecture interne MVC
7 Ghada Feki 8 Ghada Feki
MVC
Modèle
Vue
Contrôleur
HTML + Java
Ref : openclassrooms.com
Code
Framework Java EE
Architecture Java EE
Java EE
Ghada Feki
11 Ghada Feki
Plan Architecture des applications (3-tiers)
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 »)
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
Plan
Les Servlet
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.
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
• 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
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 %>
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
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
<%@ 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 (< >
& ; ...)
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}"/>" />
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>
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
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
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
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
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
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
97 98
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
107 108
Accès à la base de données : Déconnexion Accès à la base de données : Déconnexion
109 110
113 114
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
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
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
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
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
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