Java EE Partie 1
Java EE Partie 1
Java EE Partie 1
Développer un programme qui utilise une interface graphique pour introduire les données à
traiter
2
JAVA COMME LANGAGE DE PROGRAMMATION
3
DÉPLOIEMENT D’UN PROGRAMME CLASSIQUE DE LA COMPILATION
4
DÉPLOIEMENT D’UN PROGRAMME
CHANGEMENT DE LA VISION TRADITIONNELLE DE LA COMPILATION
5
JAVA ET SES VERSIONS
6
II. PREMIÈRE APPLICATION EN
JAVA
COMMENT DÉVELOPPER UNE APPLICATION?
Les textes entre « /** » et « */ » sont utilisés pour créer des commentaires que l’exécutable
JAVADOC pourra traiter afin de produire une documentation
/** Commentaires afin de produire
la documentation */
LES MOTS RÉSERVÉS DE JAVA
Référence: Adresse
TYPES PRIMITIFS ET TYPES DE RÉFÉRENCE
TYPES DE DONNÉES PRIMITIFS (1/4)
P rim itive Da ta T yp es
T e xtu al L o g ical
Explication:
byte : codé sur 8 bits 28 valeurs (–27) to (27–1) = -128 à 127
int : codé sur 32 bits 232 valeurs (–231) to (231–1)
Déclaration et initialisation :
int int x=12;
short short x= 32;
long long x= 200L; // Nombre accolé à un L
byte byte x=12;
double double x=23.2323;
float float x= 23.233F; // Nombre accolé à un F
char char c=‘a’;
boolean boolean b=true;
TYPES PRIMITIFS ET TYPES DE RÉFÉRENCE
TYPES DE DONNÉES PRIMITIFS (3/4)
Exemple:
a=b;
Référence: Adresse
PORTÉE D'UNE VARIABLE
1 () Parenthèse
* Produit
2 / Division
% Modulo
+ Addition ou concaténation
3
- Soustraction
OPÉRATEURS DE COMPARAISON
if, else
for
while
do, while
STRUCTURES DE CONTRÔLE
Structure if
if (expression logique) instruction;
if (expression logique)
{ instruction; instruction;
...
}
Structure if else
if (expression logique) instruction;
else instruction;
if (expression logique)
{ instruction; instruction;
...
}
else
{ instruction; instruction;
...
}
STRUCTURES DE CONTRÔLE
Boucle for
instruction_2;
...
instruction_n;
}
Boucle while
while (expression
booléenne)
{
instruction_1;
instruction_2;
...
instruction_n;
STRUCTURES DE CONTRÔLE
Boucle do while
do
{
instruction_1;
instruction_2;
...
instruction_n;
} while (condition);
switch (variable){
case valeur1 : instructions1 ;
case valeur2 : instructions2 ;
…
default : instructions ;
}
Exemples:
int choix=2;
switch(choix){
case 1: System.out.println("Bonjour");
break;
case 2: System.out.println("Hello");
break;
case 3: System.out.println("Buenos
dias"); break;
default: System.out.println("Choix
incorrect"); break;
}
STRUCTURES DE CONTRÔLE
f
a
l
s
e
;
STRUCTURES DE CONTRÔLE
int somme = 0;
for (int i = 0; i < 100; i++)
{
if (i % 2 == 0) continue;
somme += i;
}
STRUCTURES DE CONTRÔLE
En résumé
•Pour pouvoir récupérer ce que vous allez taper dans la console, vous
devrez initialiser l'objet Scanner avec l'entrée standard, System.in.
Création du tableau
Remplissage du tableau
Lecture du tableau.
JAVA/TABLEAUX
Si [ ] suit le type, toutes les variables déclarées seront des tableaux, alors que si [ ] suit le nom de
la variable, seule celle-ci est un tableau :
L'indexation démarre à partir de 0, ce qui veut dire que, pour un tableau de N éléments, la
numérotation va de 0 à N-1.
Dans l'exemple ci-dessus, la 6ème case contient donc la valeur 23.
int nb;
nb = monTableau[4]; // 11
Ceci est particulièrement utile lorsque nous voulons parcourir les éléments d'un tableau.
for (int i = 0; i < monTableau.length; i++) {
42
DE LA PROGRAMMATION CLASSIQUE VERS LA
PROGRAMMATION ORIENTÉE OBJET
43
DE LA PROGRAMMATION CLASSIQUE VERS LA
PROGRAMMATION ORIENTÉE OBJET
44
DE LA PROGRAMMATION CLASSIQUE VERS LA
PROGRAMMATION ORIENTÉE OBJET
45
CLASSES ET OBJETS
Exemple
46
CLASSES ET OBJETS
Exemple
47
CLASSES ET OBJETS
Classe Instances
-Nom : hariri
-Prenom :nabil
-Age :25
Instanciation
-Nom :ibrahimi
-Prenom :nawal
-Age :22
48
CLASSES ET OBJETS(SYNTAXE DE DÉCLARATION D’UNE
CLASSE)
49
CLASSES ET OBJETS
51
CRÉATION D'UN OBJET : INSTANCIER UNE
CLASSE
En Java, tous les objets sont instanciés par allocation dynamique. Dans
l'exemple, la variable m contient une référence sur l'objet instancié (contient
l'adresse de l'objet qu'elle désigne : attention toutefois, il n'est pas possible de
manipuler ou d'effectuer des opérations directement sur cette adresse comme
en C.
Si m2 désigne un objet de type MaClasse, l'instruction m2 = m ne définit pas un
nouvel objet mais m et m2 désignent tous les deux le même objet.
L'opérateur new est un opérateur de haute priorité qui permet d'instancier des
objets et d'appeler une méthode particulière de cet objet : le constructeur. Il fait
appel à la machine virtuelle pour obtenir l'espace mémoire nécessaire à la
représentation de l'objet puis appelle le constructeur pour initialiser l'objet dans
l'emplacement obtenu. Il renvoie une valeur qui référence l'objet instancié.
Si l'opérateur new n'obtient pas l'allocation mémoire nécessaire, il lève
l'exception OutOfMemoryError.
52
CRÉATION D'UN OBJET : INSTANCIER UNE
CLASSE
Remarque sur les objets de type String : un objet String est automatiquement
créé lors de l'utilisation d'une constante chaîne de caractères sauf si celle-ci
est déjà utilisée dans la classe. Ceci permet une simplification lors de la
compilation de la classe.
53
CRÉATION D'UN OBJET :
INSTANCIER UNE CLASSE
Pour obtenir une seconde instance de la chaine, il faut explicitement demander sa création en
utilisant l'opérateur new.
les tests réalisés dans ces deux exemples sont réalisés sur les références des
instances. Pour tester l'égalité de la valeur des chaînes, il faut utiliser la méthode
equals() de la classe String.
54
DURÉE DE VIE D'UN OBJET
Les objets ne sont pas des éléments statiques et leur durée de vie ne
correspond pas forcément à la durée d'exécution du programme.
La durée de vie d'un objet passe par trois étapes :
La déclaration de l'objet et l'instanciation grâce à l'opérateur new.
L'utilisation de l'objet en appelant ses méthodes
La suppression de l'objet : elle est automatique en Java grâce à la machine
virtuelle. La restitution de la mémoire inutilisée est prise en charge par le
récupérateur de mémoire (garbage collector). Il n'existe pas d'instruction
delete comme en C++.
55
RÉFÉRENCES ET LA COMPARAISON D'OBJETS
Les variables de type objet que l'on déclare ne contiennent pas un objet mais une
référence vers cet objet. Lorsque l'on écrit c1 = c2 (c1 et c2 sont des objets), on copie
la référence de l'objet c2 dans c1.
c1 et c2 font référence au même objet : ils pointent sur le même objet.
L'opérateur == compare ces références.
Deux objets avec des propriétés identiques sont deux objets distincts :
Exemple :
Pour comparer l'égalité des variables de deux instances, il faut munir la classe d'une
méthode à cet effet : la méthode equals() héritée de Object.
Pour s'assurer que deux objets sont de la même classe, il faut utiliser la méthode getClass()
de la classe Object dont toutes les classes héritent:
(obj1.getClass().equals(obj2.getClass())
56
LES VARIABLES DE CLASSES
Elles ne sont définies qu'une seule fois quel que soit le nombre d'objets
instanciés de la classe. Leur déclaration est accompagnée du mot clé static.
Exemple :
public class MaClasse() {
static int compteur = 0;
}
L'appartenance des variables de classe à une classe entière et non à un
objet spécifique permet de remplacer le nom de la variable par le nom de
la classe.
MaClasse m = new MaClasse(); Ce type de variable est utile
int c1 = m.compteur; pour, par exemple, compter
le nombre d'instanciations
int c2 = MaClasse.compteur; de la classe.
// c1 et c2 possèdent la même valeur. 57
LA VARIABLE THIS
Cette variable sert à référencer dans une méthode l'instance de l'objet en
cours d'utilisation. this est un objet qui est égal à l'instance de l'objet dans
lequel il est utilisé.
class MaClasse() {
String chaine = " test " ;
public String getChaine() { return chaine; }
// est équivalent à public String getChaine() { return
this.chaine; }
}
Il est préférable de préfixer la variable d'instance par le mot clé this.
this.nombre = nombre;
Cette référence est habituellement implicite :
private int nombre;
public maclasse(int nombre) {
nombre = nombre;
} 58
OPÉRATEUR INSTANCEOF
L'opérateur instanceof permet de déterminer la classe de l'objet qui lui
est passé en paramètre. La syntaxe est objet instanceof classe
void testClasse(Object o) {
if (o instanceof MaClasse )
System.out.println(" o est une instance de la classe MaClasse ");
else System.out.println(" o n'est pas un objet de la classe MaClasse ");
}
59
OPÉRATEUR INSTANCEOF
même si o est une instance de MaClasse, il n'est pas permis d'appeler une
méthode de MaClasse car o est de type Objet.
void afficheChaine(Object o) {
if (o instanceof MaClasse)
System.out.println(o.getChaine());
// erreur à la compil car la méthode getChaine()
//n'est pas définie dans la classe Object
}
Pour résoudre le problème, il faut utiliser la technique du casting (conversion).
void afficheChaine(Object o) {
if (o instanceof MaClasse) {
MaClasse m = (MaClasse) o;
System.out.println(m.getChaine());
}
} 60
ENCAPSULATION
61
LES MOTS CLÉS QUI GÈRENT LA VISIBILITÉ DES ENTITÉS
Quand vous définissez des membres dans une classe, vous avez le
choix parmi quatre niveaux de visibilité. Trois de ces niveaux (public,
protected et private) sont associés à des mots clés. Le quatrième
niveau s'obtient en ne spécifiant aucune mot clé relatif à la visibilité.
62
LA VISIBILITÉ PUBLIQUE - PUBLIC
63
LA VISIBILITÉ PROTÉGÉE - PROTECTED
Un membre marqué dans une classe comme étant protégé (mot clé
protected) peut être manipulé :
64
LA VISIBILITÉ « PACKAGE PRIVATE »
En l'absence de mot clé pour spécifier la visibilité, un membre sera considéré comme
étant « package private » (on peut simplifier en parlant de visibilité package). C'est
donc le mode de visibilité par défaut (absence de mot clé). Cela veut dire que le
membre sera accessible par tout code Java localisé dans le même package. Voici un
exemple d'utilisation.
package cours.exemple;
public class TestVisibilite {
public int attr1 = 10;
protected int attr2 = 20;
int attr3 = 30; // Visibilité package private !
private int attr4 = 40;
}
66
EXEMPLE CLASSES ET OBJETS (1)
NomDeClasse NomDeVariable ;
Point a ;
La situation peut a 3 x
5
être schématisée y
ainsi :
if(demande == 1){
Objet1 o1 = new Objet1();
o1.initialiser();
}
else{
Objet2 o2 = new Objet2();
o2.initialiser();
}
EXEMPLE CLASSES ET
OBJETS (9)
Réutilisation d'objets
• Il faut éviter la création d'objets à l'intérieur d'une boucle.
– Cette création peut être coû teuse en terme de consommation de
la mémoire.
– Préférer la réutilisation d'objet, qui sera instancié avant la boucle,
et modifié à l'intérieur.
a 3 x
a = new Point(3,5);
5
y
b 2 x
b= new Point(2,0) 0
y
a 3 x
5
b y
2
0 x
y
HÉRITAGE
Caractéristiques de l’héritage
- La classe «Materiel » est la classe mère de «MaterielInfo». - La classe «MaterielInfo» est la classe mère de
«Scanner» et «Imprimante».
- La classe «MaterielInfo» est une sous-classe de «Materiel ».
- «Scanner» et «Imprimante» sont des sous-classes de «MaterielInfo» .
HÉRITAGE
Camion Voiture
chargeMax modele
poidsChargement nbPortes
charger()
decharger()
HÉRITAGE
Classes dérivées: Camion et Voiture
La classe Camion est une classe dérivée de Vehicule. Elle hérite tous ses
méthodes et attributs. Elle étend la classe mère Vehicule en lui ajoutant
deux nouveaux attributs chargeMax et poidsChargement, ainsi que deux
nouvelles méthodes charger() et decharger()).
La classe Voiture est une classe dérivée de Vehicule et hérite tous les
méthodes et les attributs de Vehicule en lui ajoutant deux nouveaux attributs
modele et nbPortes.
On peut utiliser, dans les classes dérivées Camion et Voiture, les attributs et
les méthodes héritées (par exemple couleur ou freiner()) comme si ces
membres ont été déclarés dans chacune des sous-classes (sous réserve,
naturellement, que les droits d'accès le permettent).
HÉRITAGE
Implémentation de la classe Voiture
• La déclaration d'une classe dérivée se fait en utilisant le mot clé
«extends» suivi du nom de la classe de base.
• Lorsque le mot «extends» est omis, alors la classe hérite
automatiquement de la classe « Object ».
une méthode héritée sans changer sa signature.
Exemple 1
{
super. affiche() ;
System.out.println (" et ma couleur est : " + couleur) ;
}
HÉRITAGE
Si une méthode est redéfinie dans une sous-classe, le type de retour doit être identique à
celui de la méthode correspondante de la classe parente.
En redéfinissant une méthode, il est possible d'étendre sa zone de visibilité (private à package
à protected à public), mais non de la restreindre.
Exemple:
public class A {
private void fonction(float v) { ……}
}
public class B extends A {
public void fonction(float v){…}//redéfinition avec extension des droits d’accès.
}
POLYMORPHISME
• Le polymorphisme est la capacité, pour un même message de correspondre à
plusieurs formes de traitements selon l'objet auquel ce message est adressé, en
se basant sur la relation d’héritage.
• La gestion du polymorphisme est assurée par la machine virtuelle
dynamiquement à l'exécution.
Il est possible d’affecter à une référence d'une classe n'importe quel objet d'une de
ses classe dérivées.
POLYMORPHISME
• Le polymorphisme est la capacité, pour un même message de correspondre à
plusieurs formes de traitements selon l'objet auquel ce message est adressé, en
se basant sur la relation d’héritage.
• La gestion du polymorphisme est assurée par la machine virtuelle
dynamiquement à l'exécution.
Il est possible d’affecter à une référence d'une classe n'importe quel objet d'une de
ses classe dérivées.
POLYMORPHISME
Exemple 1 : Graphique
Cercle Rectangle
public class Graphique {
private int x, y;
public class Cercle extends Graphique
public Graphique ( int x, int y) {
{
this.x = x ; this.y = y ;
private double r ;
}
public Cercle ( int x, int y, double r){
public void identifie () {
super(x,y) ; this.r = r ;
System.out.println ("Je suis une
}
forme géométrique ") ;
public void identifie () {
}
System.out.println ("Je suis un
public void affiche () {
cercle ") ;
this.identifie() ;
}
System.out.println ("Le centre de l’objet
public double surface (){
se trouve dans :"+ x + " et "+ y) ;
return (2* 3.14*r) ;}
}
}
public double surface () {return (0) ;}
}
POLYMORPHISME
Exemple 1 (suite):
}} g.identifie() ;}}
public static void main (String [] args) { Je suis une forme géométrique
Graphique [] tab = new Graphique [6]; Le centre de l'objet se trouve dans : 3 et 2
} Je suis un rectangle
Exemple: on peut affecter directement un byte à short, ou un int à float (transtypage implicite). Le
compilateur est chargé de cette conversion.
POLYMORPHISME
Transtypage : conversion de type (cast).
Par contre, si l’on veut convertir une variable ou une expression dans un type qui lui
fait perdre de la précision (domaine plus petit), on doit faire un transtypage explicite.
Exemple: la conversion d’un float en int doit être réalisé par le transtypage explicite.
De même, on doit réaliser un transtypage explicite pour convertir un long en short.
Pour le transtypage explicite : on met entre parenthèses le nom du type dans lequel on veut
convertir, suivi du nom de la variable (ou de l'expression entre parenthèses) à convertir.
Exemple :
float f=10; int i;
i = (int) f; //conversion d'un float en int
POLYMORPHISME
2)Le transtypage de références d'objets
On dit que a est une référence surclassée (elle est du type A et contient l’adresse d’une
instance d’une sous-classe de A).
POLYMORPHISME
Un objet d'une classe peut être convertit en un objet d'une autre
classe si les deux classes ont un lien d'héritage.
La conversion d'un objet dans le sens fille mère est implicite.
Par contre, la conversion dans le sens mère fille doit être explicite
et n'est pas toujours possible.
Transtypage implicite (fille mère)
• Il est toujours possible d'utiliser une référence de la classe mère pour
désigner un objet d'une classe dérivée (fille, petite-fille et aussitoutes
les descendances). En effet, Il y a alors un transtypage implicite de
la classe dérivée vers la classe de base.
Ce cas est logique puisqu’un objet dérivé EST un objet de base.
Exemple 1: un employé EST une personne, donc on peut utiliser une
référence de type personne pour désigner un employé. Alors, il y a
un transtypage implicite d'un employé en personne.
POLYMORPHISME
Downcasting : classe mère → classe fille
On appelle déclassement ou downcasting le fait de convertir une
référence « surclassée » pour « libérer » certaines fonctionnalité s cachées
par le surclassement. En java, cette conversion n’est pas implicite, elle doit
ê tre forcé e par l’opérateur de cast : (<nomClasse>).
public class Personne { . . . }
public class Etudiant extends Personne { . . . }
Personne p = new Etudiant( ) ; // surclassement, upcasting
Etudiant e = (Etudiant) p ; // downcasting
Pour que la conversion fonctionne, il faut qu’à l’exécution le type réel de
la référence à convertir soit Etudiant ou une des sous-classes de
Etudiant.
Attention : le downcasting ne permet pas de convertir une instance
d’une classe de base en une instance d’une sous-classe.
public class Personne { Personne( ) {}}
public class Etudiant extends Personne { Etudiant( ) {}}
Personne p = new Personne ( ) ;
Etudiant e = (Etudiant) p ;// Erreur
POLYMORPHISME
Exemple 2 : Materiel
• Il existe une compatibilité ascendante entre les objets:
– Un ordinateur EST un materiel. Ordinateur
• Les compile time error qui sont simplement des erreurs de syntaxe ou
structure de notre code. Et si nous avons ces types d’erreur dans notre code
alors le programme ne démarre tout simplement pas et on reçoit un message
d’erreur,
• Les run time error qui va donc faire planter notre programme apres qu’il soit
compiler et uniquement quand la cause du bug commence.
LES EXCEPTIONS
Une exception est un objet qui décrit une situation anormal ou
erronée
L’ignorer
S’en occuper là ou elle arrive
S’en occuper dans une autre place dans le programme
LES EXCEPTIONS
Prise en charge d'Exception :La commande «try»
Afin de s’occuper d'une exception quand elle arrive, l'on met la ligne qui lance
l'exception dans un block try
Un block try est suivie de un ou plus de clause catch qui s'occupent de l'exception
Chaque clause catch à un type d’exception associé
Quand une exception prend place, la 1ère clause catch dont le type d'exception
correspond s'en occupe
LES EXCEPTIONS
Les exceptions représentent le mécanisme de gestion des erreurs intégré au langage Java. Il se
compose d'objets représentant les erreurs et d'un ensemble de trois mots clés qui permettent de
détecter et de traiter ces erreurs (try, catch et finally ) mais aussi de les lever ou les propager
(throw et throws)
Lors de la détection d'une erreur, un objet qui hérite de la classe Exception est créé (on dit
qu'une exception est levée) et propagé à travers la pile d'exécution jusqu'à ce qu'il soit traité. Ces
mécanismes permettent de renforcer la sécurité du code Java.
LES EXCEPTIONS
Interceptions de plusieurs exceptions
Dans un gestionnaire try...catch, il est en fait possible d'intercepter plusieurs types d'exceptions
différentes et de les traiter.
Dès qu'une exception intervient dans le < bloc de code à protéger>, la Java machine traite
séquentiellement toutes les clauses catch de la première jusqu'à la nième. Si l'exception actuellement
levée est d'un des types présents dans la liste des clauses le traitement associé est effectué, l’examination
est abandonnée et le programme poursuit son exécution après le gestionnaire.
try {
< bloc de code à protéger>
}
catch ( TypeException1 E ) { <Traitement TypeException1 > }
catch ( TypeException2 E ) { <Traitement TypeException2 > }
.....
catch ( TypeExceptionk E ) { <Traitement TypeExceptionk > }
Où
• TypeException1, TypeException12, ... , TypeExceptionk sont des classes d'exceptions obligatoirement toutes
distinctes.
• Seule une seule clause catch ( TypeException E ) {...} est exécutée (celle qui correspond au bon type de l'objet
d'exception instancié).
LES EXCEPTIONS
Exemple théorique, supposons que la méthode meth() de la classe Action2 puisse lever trois types différents
d'exceptions: ArithmeticException, ArrayStoreException, ClassCastException.
Notre gestionnaire d'exceptions est programmé pour intercepter l'une de ces 3 catégories.
LES EXCEPTIONS
Ordre d'interception d'exceptions hiérarchisées
Dans un gestionnaire try...catch comprenant plusieurs clauses, la recherche de la clause catch contenant le traitement
de la classe d'exception appropriée, s’effectue séquentiellement dans l’ordre d’écriture des lignes de code.
On choisira donc, lorsqu’il y a une hiérarchie entre les exceptions à intercepter, de placer le code de leurs clauses
dans l’ordre inverse de la hiérarchie.
LES EXCEPTIONS
Déclenchement d'une exception : throw
Il est possible de déclencher soi-même des exceptions en utilisant l'instruction throw, voir même de déclencher des
exceptions personnalisées.
La Java machine peut déclencher une exception automatiquement comme dans l'exemple de la levée d'une
ArithmeticException lors de l'exécution de l'instruction "x = 1/0 ;".
La Java machine peut aussi lever (déclencher) une exception à votre demande suite à la rencontre d'une instruction
throw. Le programme qui suit lance une ArithmeticException avec le message "Mauvais calcul !" dans la méthode
meth() et intercepte cette exception dans le bloc englobant main. Le traitement de cette exception consiste à afficher le
contenu du champ message de l'exception grâce à la méthode getMessage() :
LES EXCEPTIONS
Déclenchement d'une exception : throw
LES EXCEPTIONS
Déclenchement manuel d'une exception personnalisée
Pour une exception personnalisée, le mode d'action est strictement identique, il vous faut seulement auparavant
créer une nouvelle classe héritant obligatoirement de la classe Exception ou de n'importe laquelle de ses sous-
classes.
LES EXCEPTIONS
Exception non vérifiée
La majorité des exceptions de Java font partie du package java.lang. Certaines exceptions sont tellement
courantes qu'elles ont été rangées dans une catégorie dénommée la catégorie des exceptions implicites ou non
vérifiées (unchecked), les autres sont dénommées exception explicites ou vérifiées (checked).
Une exception non vérifiée (implicite) est une classe dérivant de l'une des deux classes Error ou
RuntimeException :
java.lang.Object
|
+--java.lang.Throwable
|
+--java.lang.Error
|
+--java.lang.Exception
|
+--java.lang.RuntimeException
LES EXCEPTIONS
Méthode propageant une exception vérifiée : throws
Une méthode dans laquelle est levée une ou plusieurs exceptions vérifiées doit obligatoirement signaler au
compilateur quelles sont les classes d'exceptions qu'elle laisse se propager sans traitement par un gestionnaire
(propagation vers un bloc englobant).
Java dispose d'un spécificateur pour ce signalement : le mot clef throws suivi de la liste des noms des classes
d'exceptions qui sont propagées.
LES EXCEPTIONS
Méthode propageant une exception vérifiée : throws
Une méthode dans laquelle est levée une ou plusieurs exceptions vérifiées doit obligatoirement signaler au
compilateur quelles sont les classes d'exceptions qu'elle laisse se propager sans traitement par un gestionnaire
(propagation vers un bloc englobant).
Java dispose d'un spécificateur pour ce signalement : le mot clef throws suivi de la liste des noms des classes
d'exceptions qui sont propagées.
Résultats de l'exécution :
---- java UseAction4
UseAction4.java:8: unreported exception java.io.IOException;
must be caught or declared to be thrown
throw new IOException("Problème d'E/S !");
^
1 error
LES EXCEPTIONS
Méthode propageant une exception vérifiée : throws
Le compilateur Java attendait de notre part l'une des deux seules attitudes suivantes :
Soit nous interceptons et traitons l'exception IOException à l'intérieur du corps de la méthode où elle a été
lancée avec pour conséquence que le bloc englobant n'aura pas à traiter une telle exception puisque l'objet
d'exception est automatiquement détruit dès qu'il a été traité.
LES EXCEPTIONS
Méthode propageant une exception vérifiée : throws
Soit nous interceptons et traitons l'exception IOException à l'intérieur du bloc englobant la méthode meth()
qui a lancé l'exception, auquel cas il est obligatoire de signaler au compilateur que cette méthode meth()
lance et propage une IOException non traitée. Le code ci-après implante la seconde attitude possible :
LES EXCEPTIONS
Clause finally
Supposons que nous soyons en présence d'un code contenant une éventuelle levée d'exception, mais
supposons que quoiqu'il se passe nous désirions qu'un certain type d'action ait toujours lieu (comme par
exemple fermer un fichier qui a été ouvert auparavant). Il existe en Java une clause spécifique optionnelle
dans la syntaxe des gestionnaires d'exception permettant ce type de réaction du programme, c'est la clause
finally. Voici en pseudo Java une syntaxe de cette clause :
<Ouverture du fichier>
try {
< action sur fichier>
}
finally {
<fermeture du fichier>
}
.... suite
LES CLASSES
Concept des classes abstraites ABSTRAITES
Une classe abstraite est une classe qui ne permet pas l’instanciation des objets de son type. C’est une classe
incomplète puisqu’elle contient certaines méthodes dont leurs corps sont définies dans la classe dérivée.
En effet, elle doit être héritée.
Une classe abstraite comporte une ou plusieurs méthodes abstraites, et elle peut comporter d'autres
méthodes non abstraites.
Une méthode abstraite est une méthode qui ne possède pas d’instructions (corps). Elle comporte seulement
une signature de définition suivie du caractère point-virgule.
Une méthode abstraite doit être précédée par le mot clé abstract. Exemple :
public abstract double f();
LES CLASSES
Syntaxe
ABSTRAITES (2)
abstract class Personne {
public void affiche() {……} // affiche() est définie dans Personne
public abstract void determineAge (int n) ; //determineAge() est
//une méthode abstraite, elle n’est pas définie dans Personne.
}
Utilisation
Une classe qui hérite d'une classe abstraite doit redéfinir les méthodes abstraites, sinon elle est abstraite également.
En C++, les méthodes abstraites sont dites virtuelles pures.
LES CLASSES
Règles des classes abstraites
ABSTRAITES (4)
Une classe est automatiquement abstraite si une de ses méthodes est abstraite.
On doit déclarer également une classe abstraite par le mot clé abstract.
Une méthode abstraite ne peut pas être privée, ce qui est logique puisque son corps sera définit
dans une classe dérivée.
Les noms d’arguments muets doivent figurer dans la définition d’une méthode abstraite.
public abstract void determineAge (int); //Erreur : nom argument
fictif est obligatoire
Une classe dérivée d’une classe abstraite n’est pas obligée de redéfinir toutes les méthodes
abstraites, elle peut ne redéfinir aucune, mais elle reste abstraite tant qu’il y a encore des
méthodes abstraites non implémentées.
Une classe dérivée d’une classe non abstraite peut être déclarée abstraite.
LES CLASSES
ABSTRAITES (5)
Règles des classes abstraites (2)
Une classe abstraite est non instanciable (donc il n’est pas possible d’utiliser les constructeurs de
cette classe et donc on ne peut pas créer des objet de son type.)
Une classe dérivée d'une classe abstraite ne devient concrète que si elle implémente toutes les
méthodes abstraites de sa classe de base.
Une méthode abstraite ne possède pas de corps, mais doit être implémentée dans les classes
dérivées non abstraites : abstract fonction (arguments); ce n'est qu'une signature .
Une classe abstraite peut contenir des méthodes non abstraites et des déclarations de variables
ordinaires.
LES CLASSES
ABSTRAITES (6)
Intérêt des classes abstraites
On peut placer dans une classe abstraite toutes les fonctionnalités dont on souhaite disposer pour
les classes descendantes :
Soit sous la forme d’une implémentation complète de méthodes (non abstraites) et de champs
lorsqu’ils sont communs à tous les descendants,
Soit sous forme d’interface des méthodes abstraites dont on est alors sûr qu’elles existeront dans
toute classe dérivée instanciable.
LES CLASSES
Exemple :
ABSTRAITES (7)
Considérons la hiérarchie des classes suivantes
:
Surface () Graphique
Cercl Rectangle
e
On veut que les classes Cercle et Rectangle disposent de la méthode surface() retournant la
surface de la figure géométrique définie par la classe.
LES CLASSES
ABSTRAITES (8)
public abstract class Graphique
{ private int x, y;
//Une classe abstraite ne peut
pas être instanciée, mais elle
peut avoir un
//constructeur :
public graphique ( int x, int y) {
this.x = x ; this.y = y ;}
Une interface peut renfermer aussi des constantes symboliques qui seront accessibles à toutes
les classes implémentant l’interface :
public interface I{
static final int max = 100 ;
void f (int n);
void g () ;
}
L’interface
S (8)
est totalement indépendante de l’héritage :Une classe dérivée peut
implémenter une ou plusieurs interfaces.
interface I1 {…..}
interface I2 {…..}
(9)
public interface Perimetre { public float
per(); } public interface Surface { public float
sur(); } public interface Resultat { public void
result(); }
public class Rectangle implements Perimetre, Rectangle implémente
Surface{ public float A, B; les interfaces Perimetre
public Rectangle (float a, float b) { A= a; B= b; } et Surface
public float per() { return(2*(A+B)); }
public float sur() { return(A*B); }
}
Square hérite
public class Square extends Rectangle implements
de
Resultat{ public Square (float a) { super(a, a); } Rectangle
public void result() {
System.out.println("Perimetre= "+ per());
System.out.println("Surface = "+ sur()); }
}
public class Test2Interface {
public static void main (String []
args){ Square S= new
Square(5.0f); S.result(); }}
LES
INTERFACES
(10)
Quelques propriétés d’interfaces :
Méthodes principales
URL de connection
Afin de localiser la base de donnée sur le serveur de base de
données, il est indispensable de spécifier une adresse de connexion
sous la forme d'une URL. Ces URL commenceront toutes par
"jdbc:".
Généralement, il faudra se référer à la documentation du fournisseur
du driver afin de connaître le format de l'URL à utiliser.
Pour MySQL, l'URL est la suivante :
jdbc:mysql://host:port/database.
Méthodes principales
Statement createStatement()
Retourne un état permettant de réaliser une instruction simple.
PreparedStatement prepareStatement(String ordre)
Retourne un état permettant de réaliser une instruction paramétrée
et pré-compilée pour un ordre.
Dans l'ordre, les champs libres (au nombre quelconque)
sont précisés par des « ? ».
Ex : ''select nom from clients where ville=?'‘
Lors de l'exécution de l'ordre, on précisera la valeur du champ.
void close(): ferme la connexion avec le SGBD.
INTERFACE: STATEMENT
Méthodes principales
Méthodes principales
ResultSet rs = pstmt.executeQuery( );
INTERFACE: RESULTSET
Contient les résultats d'une requête SELECT.
Plusieurs lignes contenant plusieurs colonnes.
On y accède ligne par ligne, puis valeur par
valeur dans la ligne.
Changements de ligne
boolean next(): se place à la ligne suivante
s'il y en a une et retourne
true si le déplacement a été fait, false s'il n'y
avait pas d'autre ligne.
boolean previous(): se place à la ligne précédente s'il y en a une et
retourne true si le déplacement a été fait, false s'il n'y avait pas de ligne
précédente.
boolean absolute(int index) : se place à la ligne numérotée par index et
retourne true si le déplacement a été fait, false sinon.
Accès aux colonnes/données dans une ligne
[type] get[Type](int col) : retourne le contenu de la colonne col dont
l'élément est de type [type] avec [type] pouvant être String, int, float,
boolean ...
INTERFACE: RESULTSET
Couche WEB
Couche
Client Métier DAO
Couche
• HTML 1 Contrôleur
Servlet 2
• CSS
3
• Java Script
HTTP
4 Modèle DAO
Métier
5 Java Données
6 Beans
Vue
JDBC
JSP
SGBD
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…)
Ce protocole permet également de soumissionner les formulaires
Fonctionnement (HTTP/1.0)
Le client se connecte au serveur (Créer une socket)
Le client demande au serveur un document : Requête HTTP
Le serveur renvoi au client le document (status=200) ou d’une
erreur (status=404 quand le document n’existe pas)
Déconnexion
Méthodes du protocole HTTP
Une requête HTTP peut être envoyée enutilisant
les méthodes suivantes:
GET : Pour récupérer le contenu d’un document
POST : Pour soumissionner des formulaires (Envoyer,
dans la requête, des données saisies par l’utilisateur )
PUT pour envoyer un fichier du client vers le serveur
DELETE permet de demander au serveur de
supprimer un document.
HEAD permet de récupérer les informations sur un
document (Type, Capacité, Date de dernière
modification etc…)
Le client envoie la requête : Méthode POST
Entête de la requête
corps de la requête
Le client envoie la requête : Méthode GET
Entête de la requête
Entête de la réponse
@youssfi.ne
tcorps de la réponse
Introduction aux
servlets
Navigateur web Serveur web
Requête HTTP
Conteneur de servlet
Method=GET ou POST
request
Servlet
Réponse HTTP doGet()
response doPost()
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws
ServletException, IOException {
resp.setContentType("text/html");
PrintWriter pr=resp.getWriter();
pr.println("<html><head><title>Titre de la page</title></head><body>corps de la
page</body></html>");
pr.close();
}} med@youssfi.ne
t
Structure d’un projet Web J2EE
Le dossier src contient les
classes java
Le byte code est placé
dans le dossier
build/classes
Les dossier webapp
contient les documents
Web comme les pages
HTML, JSP, Images, Java
Script, CSS …
Le dossier WEB-INF
contient les descripteurs
de déploiement comme
web.xml
Le dossier lib permet de
stocker les bibliothèques
de classes java
(Fichiers.jar)
Déploiement d’une
servlet
Pour que le serveur Tomcat 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.
web.xml
<?xml version="1.0" encoding="UTF-8"?><web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-
app_3_1.xsd"
version="3.1">
Balise de description de
<display-name>CoursServlet</display- l'application WEB
name>
<servlet> Nom de la Servlet
<servlet-name>MaServlet</servlet-name> "Identification"
Classe de la Servlet
<servlet-class>web.MaServlet</servlet-class>
</servlet>
Définition d'un chemin
<servlet-mapping> virtuel
<servlet-name>MaServlet</servlet-name>
<url-pattern>/est</url-pattern> Nom de la Servlet considér
</servlet-mapping> "Identification"
package web;
import j a v a . i o . * ; import j a v a x . s e r v l e t . * ;
import j a v a x . s e r v l e t . a n n o t a t i o n . * ;
import j a v a x . s e r v l e t . h t t p . * ;
@WebServlet(name="cs",urlPatterns={"/fs","*.do"})
public class F i r s t S e r v l e t extends HttpS erv let {
}
Tester la servlet
Exemples de méthodes
String getMethod() : retourne le type de requête
String getServerName() : retourne le nom du serveur
String getParameter(String name) : retourne la valeur d'un
paramètre
String[] getParameterNames() : retourne le nom des les
paramètres
String getRemoteHost() : retourne l'IP du client
String getServerPort() : retourne le port sur lequel le serveur
écoute
String getQueryString() : retourne la chaîne d’interrogation
… (voir l'API Servlets pour le reste)
HttpServletRequest
Exemple : Quelques méthodes de l’objet request
package web;
import j a v a . i o . * ; import javax.servlet.*;import j a v a x . s e r v l e t . h t t p . * ;
public class FirstServlet extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
} PrintWriter
out=response.getWriter();
response.setContentType("text/html");
out.println("<html><body><ul>");
out.println("<li>Protoc ol: " + request.getProtocol()+"</li>");
out.println("<li>ServerName: " + request.getServerName()+"</li>");
out.println("<li>ServerPort: " + request.getServerPort()+"</li>");
out.println("<li>RemoteAddr: " + request.getRemoteAddr()+"</li>");
out.println("<li>RemoteHost: " + request.getRemoteHost()+"</li>");
out.println("<li>Method: " + request.getMethod()+"</li>");
out.println("<li>Paramètre URL nom: " + request.getParameter("nom")+"</li>");
out.println("</ul></body></html>");
}
Une page JSP Equivalente :
Exemple1.jsp
<%@page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "
http://www.w3.org/TR/html4/loose.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html;
charset=ISO-8859-1">
< t i t l e > I n s e r t t i t l e h e re </ ti tle >
</head>
<body>
<ul >
<li
>P
rot
oc
ol:
<%
ou
t .p
ri n
t ln
( r
eq
ue med@youssfi.ne
st. t
ge
tPr
Forwarding
Pour séparer les rôles une servlet peut faire
un forward vers une JSP de la manière
suivante :
package web;
import j a v a . i o . * ; import javax.servlet.*;import j a v a x . s e r v l e t . h t t p . * ;
public class FirstServle t extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
request.getRequestDispatcher("Exemple1.jsp").forward(reque
st, response);
}
}
Tomcat
Requête
HTTP FW
Client
Contrôleur Vue
Servlet
HTTP Réponse JSP
HTTP
Première comparaison entre Servlet et
JSP
Une servlet est une classe java dans laquelle on peut générer du code
HTML alors qu’une JSP est une sorte de page HTML,à l’intérieur de
laquelle, o peut écrire du code Java.
Les pages JSP sont très pratique quand on veut afficher les vues
de l’applications alors que les servlets sont pratique pour effectuer
les traitement nécessaires au fonctionnement d’une application.
Si une servlet nécessite d’être déployée (web.xml), une JSP est
déployée automatiquement par Tomcat.
Pendant le premier appel d’une JSP, Tomcat convertit la JSP en servlet
et la déploie automatiquement.
Quand un client HTTP demande une page JSP, c’est la servlet
correspondante à cette JSP, qui est générée par Tomcat qui est
excécutée.
Tout ce qu’on peut faire avec une servlet, peut être fait par une JSP.
(Unse JSP est une servlet)
La technologie de base des applications web J2EE c’est les
servlets.
Dans une application web J2EE qui respecte le pattern MVC,
Les servlets sont utilisées pour jouer le rôle du contrôleur
Les JSP sont utilisées pour jouer le rôle des vues
HttpServletResponse
HttpServletResponse hérite de ServletResponse
Cet objet est utilisé pour construire un message de
réponse HTTP renvoyé au client,
il contient les méthodes nécessaires pour définir le type
de contenu, en-tête et code de retour
un flot de sortie pour envoyer des données
(par exemple HTML) au client
Exemples de méthodes :
void setStatus(int) : définit le code de retour de la
réponse
void setContentType(String) : définit le type de
contenu MIME
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() : flot pour envoyer des
données binaires au client
void sendRedirect(String) : redirige le navigateur vers l'URL
HttpServletResponse :
Redirection
Une servlet peut rediriger vers une autre ressourse locale ou distante
en utilisant la méthode sendRedirect() de l’objet response.
package web;
import j a v a . i o . * ; import javax.servlet.*;import j a v a x . s e r v l e t . h t t p . * ;
public class FirstServle t extends HttpServlet {
@Override
protected void doGet(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
response.sendRedirect("Vue.jsp"); }
}
Requête
HTTP
Tomcat
med@youssfi.ne
t
Lire les paramètre dans une
servlet
La méthode init() d’une servlet est l’endroit
ServletException, IOException {
response.setContentType("text/html");
PrintWriter out=response.getWriter();
out.print(message);
}
}
Application Mapping Objet Relationnel
orientée objet public List<User> getAllUsers() throws ClassNotFoundException,
Users:Collection SQLException{
List<User> users=new ArrayList<User>();
:User Class.forName("com.mysql.jdbc.Driver");
idUser=2
Connection conn=DriverManager.getConnection
("jdbc:mysql://localhost:3306/test","root","");
login=user1 PreparedStatement ps=conn.prepareStatement ("select *
password=123456 from users");
email=…..
ResultSet rs=ps.executeQuery();
while(rs.next()){
ville=…… User u=new User();
u.setIdUser(rs.getInt("id"));
:User
u.setLogin(rs.getString("login"));
idUser=3 u.setPassword(rs.getString("password"));
login=user3 u.setEmail(rs.getString("email"));
u.setVille(rs.getString("ville"));
password=testpass
users.add(u);
email=….. }return(users);}
ville=……
Table users
:User
……
……
…..
Application
Le travail à faire consiste à afficher les clients en
saisissant un mot clé qui représente la ville de
l’utilisateur
La vue qu’on souhaite réaliser est la suivante :
Serveur TOMCAT : 8089
Architectur CoursJee : Web App
e Couche Web Couche Métier
ControleurServlet User
4
2
doPost(req,resp)3 5
1
UserModele UserImpl
ville: String
HTTP users:List<user>
getClientsParV(v):List
8 6 7
SingletonConnection
usersView.jsp
} catch (Exception e) {
e.printStackTrace();
}
}
public static Connection getConnection() {
return connection;
}
}
La classe UserImpl.java
package metier;
import java.sql.*;
import java.util.*;
public class UserImpl {
public List<User> getClientsParV(String v){
List<User> allusers=new ArrayList<User>();
Connection conn=SingletonConnection.getConnection();
try {
PreparedStatement ps=conn.prepareStatement ("select * from users where ville
like ?");
ps.setString(1, "%"+v+"%");
ResultSet rs=ps.executeQuery();
while(rs.next()){
User u=new User();
u.setId(rs.getInt("id"));
u.setLogin(rs.getString("login"));
u.setEmail(rs.getString("EMAIL"));
u.setVille(rs.getString("VILLE"));
allusers.add(u);
}
} catch (SQLException e) { e.printStackTrace();
}
return allusers;
}}
Classe Test
package metier;
import java.util.List;
public class Test {
public static void main(String[] args) {
UserImpl users=new UserImpl();
List<User> liste_users=users.getClientsParV(« fkih");
for(User u:liste_users)
System.out.println(u.getLogin());
}
}
Le modèle : UserModele.java
package web;
import java.util.*;
import metier.User;
public class UserModele {
private String ville;
private List<User> users=new ArrayList<User>();
// Geters et Setters
}
Le contrôleur :
package web;
ControleurServlet
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import metier.*;
public class ControleurServlet extends HttpServlet {
private UserImpl users;
@Override
public void init() throws ServletException {
users=new UserImpl();
}
@Override
protected void doPost(HttpServletRequest request, HttpServletResponse
response)
throws ServletException, IOException {
UserModele moduser=new UserModele();
moduser.setVille(request.getParameter("ville"));
List<User> liste_users=users.getClientsParV(moduser.getVille());
moduser.setUsers(liste_users);
request.setAttribute("modele", moduser);
request.getRequestDispatcher("usersView.jsp").forward(request,
response);
}
@Override
protected void doGet(HttpServletRequest req, HttpServletResponse resp)
throws ServletException, IOException {
doPost(req, resp);
}}
Descripteur de déploiement de servlets :
web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee
http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
version="3.1">
<servlet>
<servlet-name>fbs</servlet-name>
<servlet-class>web.ControleurServlet</servlet-class>
</servlet>
<servlet-mapping>
<servlet-name>fbs</servlet-name>
<url-pattern>/users</url-pattern>
</servlet-mapping>
</web-app>
La vue : usersView.jsp
<%@page import="metier.User"%><%@page import="java.util.List"%>
<%@page import="web.UserModele"%>
<%
UserModele mod;
if(request.getAttribute("modele")!=null){
mod=(UserModele)request.getAttribute("modele");
}
else{ mod=new UserModele(); }
%>
<html>
<body>
<form action="users" method="post">
Ville:<input type="text" name="ville" value="<%=mod.getVille() %>">
<input type="submit" value="Chercher">
</form>
<table border="1" width="80%">
<tr>
<th>ID</th><th>LOGIN</th><th>EMAIL</th><th>VILLE</th>
</tr>
<%
List<User> users=mod.getUsers();
for(User u:users){%>
<tr>
<td><%=u.getId() %></td> <td><%=u.getLogin() %></td>
<td><%=u.getEmail() %></td> <td><%=u.getVille() %></td>
</tr>
<% } %>
</table></body></html>