See discussions, stats, and author profiles for this publication at: [Link]
net/publication/371226170
Cours de programmation client/serveur Cours dispense par: Ir
KALEMA JOSUE
Book · June 2023
CITATIONS READS
0 538
1 author:
Kalema Josue
Univeriste Advenstiste de Goma
3 PUBLICATIONS 1 CITATION
SEE PROFILE
All content following this page was uploaded by Kalema Josue on 02 June 2023.
The user has requested enhancement of the downloaded file.
Cours de programmation
client/serveur
INSTITUT SUPERIEUR DE
COMMERCE/ GOMA
Module adapté aux étudiants de Deuxième Année de Licence en Science et
technologie ( Mention:Informatique de Gestion)
Cours dispense par: Ir KALEMA JOSUE
+243992565394,josuekalema@[Link]
June 2, 2023 @joska,chef de travaux 1
OBJECTIF
L’objectif de ce document est de synthétiser les
points essentiels à connaître et à comprendre
pour pouvoir faire la programmation client-serveur
aux différentes couches du modèle OSI : UDP,
TCP/IP, présentation,.. L'objectif est de bien
comprendre ce que l'on peut faire et comment on
peut le faire au fur et à mesure qu’on evoluera dans
ce module.
June 2, 2023 @joska,chef de travaux 2
OBJECTIFS
L’étudiant sera capable, à la fin de ce cours, de:
Comprendre l’architecture client/serveur;
Comprendre les mécanismes réseau
Coder une application reseau utilisant les Sockets
Faire le CRUD(Create,Read,Update,Delete) dans une application
client/seveur(2tiers) utilisant une base de données partagée
De faire un pas sur la programmation client/serveur(3 tiers) utilisant le
framework Web JSP(java server page)
June 2, 2023 @joska,chef de travaux 3
PLAN DU COURS
GENERALITE SUR L’ARCHITECTURE
CLIENT/SERVEUR
LES SOCKETS
CLIENT/SERVEUR 2TIERS
CLIENT/SERVEUR 3TIERS
June 2, 2023 @joska,chef de travaux 4
COTATION ET PROGRAMME
15% PRESENCE
45% TP
40% EXAMEN PRATIQUE
60H(20h theorique , 20h TD,20 TP)
retro-projecteur, google class room
June 2, 2023 @joska,chef de travaux 5
PREREQUIS
Programmation orientée objet en
Java(classe,object,encapsulation,heritage,
polymorphisme,surcharge)
SQL
HTML,CSS
Adressage IP v4
June 2, 2023 @joska,chef de travaux 6
CHAP 1:Généralités
Utilisation du modèle CLIENT/SERVEUR
S’étend de plus en plus vers tous les domaines d’activités :
World Wide Web (web)
Gestion de bases de données (programmation procédural)
Systèmes transactionnels(transaction )
Systèmes de messagerie
Systèmes de partage de données (système distribue ,repartie ,partagé,
federé)
etc.
June 2, 2023 @joska,chef de travaux 7
CHAP 1:Généralités
En programmation client-serveur, on a généralement à écrire deux
programmes : un programme appelé serveur et un programme appelé client.
Ces deux programmes sont amenés à établir un dialogue à travers une
connexion réseau. Cela signifie que les deux programmes peuvent être
exécutés sur des systèmes (machines) différents, et que le réseau va être
utilisépour communiquer.
Dans le cadre des TPs de réseau, les communications se feront normalement
en utilisant le protocole TCP/IP qui est un protocole connecté et fiable. Ce
protocole est dit fiable car les données envoyées sont reçues dans l’ordre,
sans perte, ni duplication. C’est seulement pour le dernier TP que le protocole
non connecté UDP sera abordé.
June 2, 2023 @joska,chef de travaux 8
CHAP 1:Généralités
Pour pourvoir communiquer en TCP, il faut commencer par établir une connexion.
Pour cela, le programme qui a le rôle de serveur se met état d’attendre une
demande de connexion.
Le programme client va alors demander à se connecter au serveur. Lorsque ce
dernier accepte la demande de connexion, la connexion est établie et le dialogue
peut commencer.
Le client et le serveur dialoguent ensuite suivant un protocole qui définit la nature et
l’ordre des messages échangés. Le protocole dépend du problème à résoudre, et est
à définir avant d’écrire les programmes. Bien souvent les protocoles simples auront
la forme suivante :
1. la connexion est établie ;
2. le client envoie une requête (il pose une question), et attend le réponse du serveur ;
3. le serveur reçoit la requête du client, construit sa réponse et envoie la réponse au
client ;
4. le client reçoit la réponse du serveur ;
5. la connexion est fermée (terminée).
June 2, 2023 @joska,chef de travaux 9
CHAP 1:Généralités
Les principales caractéristiques des programmes client et serveur sont ainsi :
serveur : le programme serveur est celui qui attend les demandes de connexion.
Normalement, il n’y a qu’un seul processus serveur qui est exécuté. Le serveur est
généralement écrit pour pouvoir répondre à un nombre infini de clients. On peut
distinguer les serveurs itératifs qui répondent aux clients les uns après les autres, et les
serveurs parallèles, plus évolués, qui sont capables de répondre à plusieurs clients en
même temps.
client : le programme client est celui qui fait la demande de connexion au serveur. On
peut exécuter plusieurs processus clients pour un seul serveur.
On peut remarquer que ce fonctionnement est analogue à une conversation téléphonique. Avant de pouvoir
dialoguer, il faut établir une connexion où l’un des interlocuteurs (le client) appelle l’autre (le serveur). Lorsque le
serveur répond, la connexion est établie et elle reste active jusqu’à ce qu’un des interlocuteurs raccroche
June 2, 2023 @joska,chef de travaux 10
CHAP 1:Généralités
Numéro de port. Les connexions TCP se font entre les systèmes en utilisant les
adresses IP et des numéros de port. Un numéro de port est un nombre entier sur 16
bits (1–65535) Une connexion TCP est alors identifiée de manière unique par un
quadruplet (adresse source, port source, adresse destination, port destination).
June 2, 2023 @joska,chef de travaux 11
CHAP 1:Généralités
Présentation de l'architecture d'un système client/serveur
De nombreuses applications fonctionnent selon un environnement client/serveur, cela
signifie que des machines clientes (des machines faisant partie du réseau) contactent
un serveur, une machine généralement très puissante en terme de capacités d'entrée-
sortie, qui leur fournit des services. Ces services sont des programmes fournissant des
données telles que l'heure, des fichiers, une connexion, etc
Les services sont exploités par des programmes, appelés programmes clients,
s'exécutant sur les machines clientes. On parle ainsi de client (client FTP, client de
messagerie, etc.) lorsque l'on désigne un programme tournant sur une machine cliente,
capable de traiter des informations qu'il récupère auprès d'un serveur (dans le cas du
client FTP il s'agit de fichiers, tandis que pour le client de messagerie il s'agit de courrier
électronique).
June 2, 2023 @joska,chef de travaux 12
CHAP 1:Généralités
Avantages de l'architecture client/serveur
Le modèle client/serveur est particulièrement recommandé pour des réseaux nécessitant un grand
niveau de fiabilité, ses principaux atouts sont :
des ressources centralisées : étant donné que le serveur est au centre du réseau, il peut gérer
des ressources communes à tous les utilisateurs, comme par exemple une base de données
centralisée, afin d'éviter les problèmes de redondance et de contradiction
une meilleure sécurité : car le nombre de points d'entrée permettant l'accès aux données est
moins important
une administration au niveau serveur : les clients ayant peu d'importance dans ce modèle, ils
ont moins besoin d'être administrés
un réseau évolutif : grâce à cette architecture il est possible de supprimer ou rajouter des clients
sans perturber le fonctionnement du réseau et sans modification majeure
Inconvénients du modèle client/serveur
L'architecture client/serveur a tout de même quelques lacunes parmi lesquelles :
un coût élevé dû à la technicité du serveur
un maillon faible : le serveur est le seul maillon faible du réseau client/serveur, étant donné que
tout le réseau est architecturé autour de lui ! Heureusement, le serveur a une grande tolérance aux
pannes (notamment grâce au système RAID)
June 2, 2023 @joska,chef de travaux 13
CHAP 1:Généralités
Architecture du Peer to Peer
Dans une architecture de réseau peer-to-peer, chaque ordinateur a les mêmes
responsabilités et les mêmes capacités. Comme il n'y a pas de serveur, les ordinateurs se
connectent entre eux dans un groupe de travail pour partager des fichiers, des imprimantes et
l'accès à Internet.
June 2, 2023 @joska,chef de travaux 14
CHAP 1:Généralités
Table de comparaison(client serveur vs peer To peer)
June 2, 2023 @joska,chef de travaux 15
CHAP 1:Généralités
LES DIFFÉRENTES ARCHITECTURES CLIENT/SERVEUR
L'ARCHITECTURE 2 TIERS
Dans une architecture deux tiers, encore appelée client-serveur de première génération ou client-
serveur de données, le poste client se contente de déléguer la gestion des données à un service
spécialisé. Le cas typique de cette architecture est une application de gestion fonctionnant sous
Windows ou Linux et exploitant un SGBD centralisé.
Ce type d'application permet de tirer partie de la puissance des ordinateurs déployés en réseau
pour fournir à l'utilisateur une interface riche, tout en garantissant la cohérence des données, qui
restent gérées de façon centralisée.
La gestion des données est prise en charge par un SGBD centralisé, s'exécutant le plus souvent sur
un serveur dédié. Ce dernier est interrogé en utilisant un langage de requête qui, le plus souvent,
est SQL. Le dialogue entre client et serveur se résume donc à l'envoi de requêtes et au retour des
données correspondant aux requêtes.
June 2, 2023 @joska,chef de travaux 16
CHAP 1:Généralités
LES DIFFÉRENTES ARCHITECTURES CLIENT/SERVEUR
L'ARCHITECTURE 2 TIERS
June 2, 2023 @joska,chef de travaux 17
CHAP 1:Généralités
LES DIFFÉRENTES ARCHITECTURES CLIENT/SERVEUR
L'ARCHITECTURE 3 TIERS
Les limites de l'architecture deux tiers proviennent en grande partie de la nature du client utilisé :
le frontal est complexe et non standard (même s'il s'agit presque toujours d'un PC sous
Windows),
le middleware entre client et serveur n'est pas standard (dépend de la plate-forme, du SGBD
...).
La solution résiderait donc dans l'utilisation d'un poste client simple communicant avec le serveur
par le biais d'un protocole standard.
Dans ce but, l'architecture trois tiers applique les principes suivants :
les données sont toujours gérées de façon centralisée,
la présentation est toujours prise en charge par le poste client,
la logique applicative est prise en charge par un serveur intermédiaire.
Cette architecture trois tiers, également appelée client-serveur de deuxième génération ou client-
serveur distribué sépare l'application en 3 niveaux de services distincts, conformes au principe
précédent :
premier niveau : l'affichage et les traitements locaux (contrôles de saisie, mise en forme de
données...) sont pris en charge par le poste client,
deuxième niveau : les traitements applicatifs globaux sont pris en charge par le service
applicatif,
troisième niveau : les services de base @joska,chef
June 2, 2023
de données sont pris en charge par un SGBD.
de travaux 18
CHAP 1:Généralités
LES DIFFÉRENTES ARCHITECTURES CLIENT/SERVEUR
L'ARCHITECTURE 3 TIERS
June 2, 2023 @joska,chef de travaux 19
CHAP 1:Généralités
LES DIFFÉRENTES ARCHITECTURES CLIENT/SERVEUR
L'ARCHITECTURE 3 TIERS
June 2, 2023 @joska,chef de travaux 20
CHAP 1:Généralités
LES DIFFÉRENTES ARCHITECTURES CLIENT/SERVEUR
L'ARCHITECTURE N TIERS
L'architecture n-tiers a été pensée pour pallier aux limites des architectures trois tiers et concevoir
des applications puissantes et simples à maintenir. Ce type d'architecture permet de distribuer plus
librement la logique applicative, ce qui facilite la répartition de la charge entre tous les niveaux.
Cette évolution des architectures trois tiers met en oeuvre une approche objet pour offrir une plus
grande souplesse d'implémentation et faciliter la réutilisation des développements.
Cette architecture est basée sur l'utilisation de composants "métier'', spécialisés et indépendants,
introduits par les concepts orientés objets (langages de programmation et middleware). Elle
permet de tirer pleinement partie de la notion de composants métiers réutilisables.
Ces composants rendent un service si possible générique et clairement identifié. Ils sont capables
de communiquer entre eux et peuvent donc coopérer en étant implantés sur des machines
distinctes.
June 2, 2023 @joska,chef de travaux 21
CHAP 1:Généralités
Un RESEAUX INFORMATQUE
Reseau informatique (en anglais : data communication network ou DCN) est un ensemble
d'équipements reliés entre eux pour échanger des informations. Par analogie avec un filet (un
réseau est un « petit rets », c'est-à-dire un petit filet1), on appelle nœud l'extrémité d'une
connexion, qui peut être une intersection de plusieurs connexions ou équipements (un ordinateur,
un routeur, un concentrateur, un commutateur).
June 2, 2023 @joska,chef de travaux 22
CHAP 1:Généralités
L'introduction aux concepts liés au réseau
Depuis son origine, Java fournit plusieurs classes et interfaces destinées à faciliter l'utilisation du
réseau par programmation.
Le modèle OSI (Open System Interconnection) propose un découpage en sept couches des
différents composants qui permettent la communication sur un réseau.
June 2, 2023 @joska,chef de travaux 23
CHAP 1:Généralités
June 2, 2023 @joska,chef de travaux 24
CHAP 1:Généralités
L'introduction aux concepts liés au réseau
Le protocole IP est un protocole de niveau réseau qui permet d'échanger des paquets d'octets
appelés datagrammes. Ce protocole ne garantit pas l'arrivée à bon port des messages. Cette
fonctionnalité peut être implémentée par la couche supérieure, comme par exemple avec TCP. Un
datagramme IP est l'unité de transfert à ce niveau. Cette série d'octets contient les informations du
message, un en tête (adresse source de destination, ...) mais aussi des informations de contrôle.
Ces informations permettent aux routeurs de faire transiter les paquets sur l'internet.
La couche de transport est implémentée dans les protocoles UDP ou TCP. Ils permettent la
communication entre des applications sur des machines distantes.
La notion de service permet à une même machine d'assurer plusieurs communications
simultanément.
Le système des sockets est le moyen de communication interprocessus développé pour l'Unix
Berkeley (BSD). Il est actuellement implémenté sur tous les systèmes d'exploitation utilisant
TCP/IP. Une socket est le point de communication
June 2, 2023 @joska,chef de travaux 25
CHAP 1:Généralités
par lequel un thread peut émettre ou recevoir des informations et ainsi elle permet la
communication entre deux applications à travers le réseau.
La communication se fait sur un port particulier de la machine. Le port est une entité logique
qui permet d'associer un service particulier à une connexion. Un port est identifié par un entier
de 1 à 65535. Par convention les 1024 premiers sont réservés pour des services standard (80 :
HTTP, 21 : FTP, 25: SMTP, ...)
Java prend en charge deux protocoles : TCP et UDP.
Les classes et interfaces utiles au développement réseau sont regroupés dans le package [Link].
June 2, 2023 @joska,chef de travaux 26
CHAP 1:Généralités
Les adresses internet
Une adresse internet permet d'identifier de façon unique une machine sur un réseau. Cette adresse pour le
protocole I.P. est sous la forme de quatre octets séparés chacun par un point. Chacun de ces octets
appartient à une classe selon l'étendue du réseau.
Pour faciliter la compréhension humaine, un serveur particulier appelé DNS (Domaine Name Service) est capable
d'associer un nom à une adresse I.P.
La classe InetAddress
Une adresse internet est composée de quatre octets séparés chacun par un point.
Un objet de la classe InetAddress représente une adresse Internet. Elle contient des méthodes pour lire une
adresse, la comparer avec une autre ou la convertir en chaîne de caractères. Elle ne possède pas de constructeur
: il faut utiliser certaines méthodes statiques de la classe pour obtenir une instance de cette classe.
La classe InetAdress encapsule des fonctionnalités pour utiliser les adresses internet. Elle ne possède pas de
constructeur mais propose trois méthodes statiques :
June 2, 2023 @joska,chef de travaux 27
CHAP 1:Généralités
La classe InetAddress
June 2, 2023 @joska,chef de travaux 28
CHAP 1:Généralités
La classe InetAddress
import [Link].*;
public class TestNet1 {
public static void main(String[] args) {
try {
InetAddress adrLocale = [Link]();
[Link]("Adresse locale = "+[Link]());
InetAddress adrServeur = [Link]("[Link]");
[Link]("Adresse Sun = "+[Link]());
InetAddress[] adrServeurs = [Link]("[Link]");
[Link]("Adresses Microsoft : ");
for (int i = 0; i > [Link]; i++) {
[Link](" "+adrServeurs[i].getHostAddress());
}
} catch (Exception e) {
[Link]();
}
}
}
June 2, 2023 @joska,chef de travaux 29
CHAP 1:Généralités
La classe InetAddress
resultat
June 2, 2023 @joska,chef de travaux 30
CHAP 1:Généralités
La classe URLConnection
Cette classe abstraite encapsule une connexion vers une ressource désignée par une URL pour
obtenir un flux de données ou des informations sur la ressource.
import [Link].*;
import [Link].*;
public class TestURLConnection {
public static void main(String[] args) {
String donnees;
try {
URL monURL = new URL("[Link]
URLConnection connexion = [Link]();
InputStream flux = [Link]();
int donneesALire = [Link]();
for(;donneesALire != 0; donneesALire--)
[Link]((char)[Link]());
// Fermeture de la connexion
[Link]();
} catch (Exception e) {
[Link]();
}}}2, 2023
June @joska,chef de travaux 31
Activite
INSTALLATION DE NETBEANS
June 2, 2023 @joska,chef de travaux 32
CHAP 2:les Sockets
Definition
Les sockets sont une interface de programmation de bas niveau pour la communication
réseau. Une Socket est une liaison point à point entre un serveur et un client (le code des
programmes est légèrement différent). La communication est full-duplex (en fait, les
communications sont probablement bufférisées avant d'être envoyées, doù l'apparence du
full-duplex là où TCP/IP ne sait faire que du half-duplex), le protocole d'échange
d'informations est laissé à la charge du programmeur.
June 2, 2023 @joska,chef de travaux 33
CHAP 2:les Sockets
Le client
Le client est un logiciel installé sur l'ordinateur local qui permet d'une part une utilisation
optimisée des ressources locales (souris, écran, etc), et d'autre part une communication
avec un serveur du réseau. C'est lui qui fait le premier pas lors d'une connexion avec un
serveur en établissant une Socket. Pour créer une socket dans un programme Java, le
programmeur doit spécifier le nom de machine où se trouve le serveur et le port où l'ondoit se
connecter.
ma-socket = new Socket ("[Link]", 1999);
June 2, 2023 @joska,chef de travaux 34
CHAP 2:les Sockets
Le Serveur
Un serveur est un logiciel exécuté sur un certain ordinateur du réseau, 24 heures sur 24.
Il accepte commandes, questions, demandes et envoie une réponse automatiquement. 11
attend la connexion d'un client sur un port de l'ordinateur sur lequel il est installé et
renvoie des données demandées. Dans un programme Java, le serveur doit créer une
ServerSocket en indiquant son numéro de port puis attendre qu'un client demande une
connexion qui peut alors être acceptée. Des flux d'entrées sont ensuite définis et les
échanges peuvent commencer selon le protocole choisi. En fin de programme, toutes les
sockets doivent être libérées.
June 2, 2023 @joska,chef de travaux 35
CHAP 2:les Sockets
Le Serveur
June 2, 2023 @joska,chef de travaux 36
CHAP 2:les Sockets
June 2, 2023 @joska,chef de travaux 37
CHAP 2:les Sockets
June 2, 2023 @joska,chef de travaux 38
CHAP 2:les Sockets
La classe SocketServer
La classe ServerSocket est utilisée côté serveur : elle attend simplement les appels du ou des
clients. C'est un objet du type Socket qui prend en charge la transmission des données.
Cette classe représente la partie serveur du socket. Un objet de cette classe est associé à un port
sur lequel il va attendre les connexions d'un client. Généralement, à l'arrivée d'une demande de
connexion, un thread est lancé pour assurer le dialogue avec le client sans bloquer les connexions
des autres clients.
La classe SocketServer possède plusieurs constructeurs dont les principaux sont :
June 2, 2023 @joska,chef de travaux 39
CHAP 2:les Sockets
La classe SocketServer
Tous ces constructeurs peuvent lever une exception de type IOException.
La classe SocketServer possède plusieurs méthodes :
Si un client tente de communiquer avec le serveur, la méthode accept() renvoie une socket qui
encapsule la
communication avec ce client.
Le mise en oeuvre de la classe SocketServer suit toujours la même logique :
· créer une instance de la classe SocketServer en précisant le port en paramètre
· définir une boucle sans fin contenant les actions ci dessous
· appelle de la méthode accept() qui renvoie une socket lors d'une nouvelle connexion
· obtenir un flux en entrée et en sortie à partir de la socket
· écrire les traitements à réaliser
June 2, 2023 @joska,chef de travaux 40
CHAP 2:les Sockets
La classe Socket
Les sockets implémentent le protocole TCP (Transmission Control Protocol). La classe contient les
méthodes de création des flux d'entrée et de sortie correspondants. Les sockets constituent la base
des communications par le réseau.
Comme les flux Java sont transformés en format TCP/IP, il est possible de communiquer avec
l'ensemble des ordinateurs qui utilisent ce même protocole. La seule chose importante au niveau
du système d'exploitation est qu'il soit capable de gérer ce protocole.
Cette classe encapsule la connexion à une machine distante via le réseau. Cette classe gère la
connexion, l'envoi de données, la réception de données et la déconnexion.
La classe Socket possède plusieurs constructeurs dont les principaux sont :
June 2, 2023 @joska,chef de travaux 41
CHAP 2:les Sockets
La classe Socket possède de nombreuses méthodes :
Le mise en œuvre de la classe Socket suit toujours la même logique :
· créer une instance de la classe Socket en précisant la machine et le port en paramètre
· obtenir un flux en entrée et en sortie
· écrire les traitements à réaliser
June 2, 2023 @joska,chef de travaux 42
CHAP 2:les Sockets
Serveur
package isc;
import [Link].* r;
import [Link].*;
public static void main(String[] args) {
try {
ServerSocket ss=new ServerSocket(1234);
[Link]("j'attends la connection");
Socket s=[Link]();
InputStream is=[Link]();
OutputStream os=[Link]();
[Link]("j'attends que le client envoie un octet");
//ce que le client envoie
int nb=[Link]();
[Link]("j'ai recu un nombre"+nb);
int rs=nb *5;
[Link]("j'envoie la reponse"+rs);
[Link](rs);
[Link]();
}
catch(Exception e){
[Link]();
}
}
}
June 2, 2023 @joska,chef de travaux 43
CHAP 2:les Sockets
Client
import [Link].*;
import [Link];
import [Link];
public class ClientISC {
public static void main(String[] args) {
try {
[Link]("je me connecte au serveur");
Socket socket=new Socket("localhost",1234);
InputStream is=[Link]();
OutputStream os=[Link]();
Scanner scanner=new Scanner([Link]);
[Link]("Donner un nombre:");
int nb=[Link]();
[Link]("jenvoie le nomre "+nb+"au serveur");
[Link](nb);
//reponse
[Link]("j attends reponse du serveur");
int rep= [Link]();
[Link]("la reponse du serveur"+rep);
} catch (Exception ex) {
//[Link]();
}}}
June 2, 2023 @joska,chef de travaux 44
CHAP 2:les Sockets
Client
import [Link].*;
import [Link];
import [Link];
public class ClientISC {
public static void main(String[] args) {
try {
[Link]("je me connecte au serveur");
Socket socket=new Socket("localhost",1234);
InputStream is=[Link]();
OutputStream os=[Link]();
Scanner scanner=new Scanner([Link]);
[Link]("Donner un nombre:");
int nb=[Link]();
[Link]("jenvoie le nomre "+nb+"au serveur");
[Link](nb);
//reponse
[Link]("j attends reponse du serveur");
int rep= [Link]();
[Link]("la reponse du serveur"+rep);
} catch (Exception ex) {
//[Link]();
}}}
June 2, 2023 @joska,chef de travaux 45
CHAP 2:les Sockets
ACTIVITE
Creer une application de chat sur un reseau(envoie et reception des messages)
June 2, 2023 @joska,chef de travaux 46
CHAP 2:les Sockets
PARTIE SERVEUR:
package serveurchat;
import [Link].*;
import [Link].*;
public class chat_Serveur extends [Link] {
static ServerSocket ss;
static Socket s;
static DataInputStream din;
static DataOutput dout;
///BUTON ENVOYER////
try{ String msgou="";
msgou=msg_text.getText().trim();
[Link](msgou);
}
catch(Exception e){
}
///////////DANS LE CONTRUCTEUR ////////////////////////
String msgin="";
try {
ss=new ServerSocket(1200);
s=[Link]();
din=new DataInputStream([Link]());
dout=new DataOutputStream([Link]());
while(){
msgin=[Link]();
msg_area.setText(msg_area.getText().trim()+"\n"+msgin); }
} catch (Exception e) { }
June 2, 2023 @joska,chef de travaux 47
CHAP 2:les Sockets
PARTIE CLIENT:
package serveurchat;
import [Link].*;
import [Link].*;
public class Client_chat extends [Link] {
static Socket s;
static DataInputStream din;
static DataOutput dout;
///BUTON ENVOYER////
try{
String msgout="";
msgout=[Link]().trim();
[Link](msgout);}
catch(Exception e){}
///////////DANS LE CONTRUCTEUR ////////////////////////
try{
s=new Socket("[Link]", 1200);
din=new DataInputStream([Link]());
dout=new DataOutputStream([Link]());
String msgin="";
while(){
msgin=[Link]();
[Link]([Link]().trim()+"\n Serveur:\t"+msgin );
}}
catch(Exception e){
}
June 2, 2023 @joska,chef de travaux 48
CHAP 2:les Sockets
Exercice: Créer une application client/serveur dans laquelle le client fourni 2
nombres entrer au clavier par l’utilisateur puis le serveur additionne ces 2 nombres
puis envoie la réponse au client
June 2, 2023 @joska,chef de travaux 49
CHAP 3:Programmation
client/serveur: 2tiers
L'architecture à deux niveaux (aussi appelée architecture 2-tier, tier signifiant rangée en anglais)
caractérise les systèmes clients/serveurs pour lesquels le client demande une ressource et le
serveur la lui fournit directement, en utilisant ses propres ressources. Cela signifie que le serveur
ne fait pas appel à une autre application afin de fournir une partie du service.
June 2, 2023 @joska,chef de travaux 50
CHAP 3:Programmation
client/serveur: 2tiers
Interactions avec les bases de données
JDBC : la porte d'accès aux bases de données
Dans ce chapitre, nous ferons nos premiers pas avec Java DataBase Connectivity, communément appelé JDBC. Il s'agit en fait
de classes Java permettant de se connecter et d'interagir avec des bases de données. Mais avant toute chose, il nous faut une
base de données ! Nous allons donc nous pencher sur l'utilité d'une base de données et verrons comment en installer une que
nous utiliserons afin d'illustrer la suite de cette partie.
Pour commencer, je pense qu'un petit rappel sur le fonctionnement des bases de données s'impose.
Rappels sur les bases de données
Lorsque vous réalisez un logiciel, un site web ou quelque chose d'autre, vous êtes confrontés tôt ou tard à cette question : «
Comment vais-je procéder pour sauvegarder mes données ? Pourquoi ne pas tout stocker dans des fichiers ? »
Les bases de données (BDD) permettent de stocker des données. Mais concrètement, comment cela fonctionne-t-il ? En
quelques mots, il s'agit d'un système de fichiers contenant les données de votre application. Cependant, ces fichiers sont
totalement transparents pour l'utilisateur d'une base de données, donc totalement transparents pour vous ! La différence avec
les fichiers classiques se trouve dans le fait que ce n'est pas vous qui les gérez : c'est votre BDD qui les organise, les range et, le
cas échéant, vous retourne les informations qui y sont stockées. De plus, plusieurs utilisateurs peuvent accéder simultanément
aux données dont ils ont besoin, sans compter que de nos jours, les applications sont amenées à traiter une grande quantité de
données, le tout en réseau. Imaginez-vous gérer tout cela manuellement alors que les BDD le font automatiquement…
June 2, 2023 @joska,chef de travaux 51
CHAP 3:Programmation
client/serveur: 2tiers
Quelle base de données utiliser
Il existe plusieurs bases de données et toutes sont utilisées par beaucoup de développeurs. Voici une liste non exhaustive
recensant les principales bases :
PostgreSQL ;
MySQL ;
SQL Server ;
Oracle ;
Access.
Toutes ces bases de données permettent d'effectuer les actions que je vous ai expliquées plus haut. Chacune possède des
spécificités : certaines sont payantes (Oracle), d'autres sont plutôt permissives avec les données qu'elles contiennent (MySQL),
d'autres encore sont dotées d'un système de gestion très simple à utiliser (MySQL), etc. C'est à vous de faire votre choix en
regardant par exemple sur Internet ce qu'en disent les utilisateurs. Pour cette partie traitant des bases de données, mon choix
s'est porté sur PostgreSQL qui est gratuit et complet.
June 2, 2023 @joska,chef de travaux 52
CHAP 3:Programmation
client/serveur: 2tiers
Recherche des pilotes JDBC pour votre base de donnees
Ceux d'entre vous qui ont déjà installé une imprimante savent que leur machine a besoin d'un driver (appelé aussi pilote, c'est
une sorte de mode d'emploi utilisé par l'ordinateur) pour que la communication puisse s'effectuer entre les deux acteurs. Ici, c'est
la même chose : pgAdmin utilise un driver pour se connecter à la base de données. Étant donné que les personnes qui ont
développé les deux logiciels travaillent main dans la main, il n'y aura pas de problème de communication ; mais qu'en sera-t-il
pour Java ?
En fait, avec Java, vous aurez besoin de drivers, mais pas sous n'importe quelle forme : pour vous connecter à une base de
données, il vous faut un fichier .jar qui correspond au fameux pilote et qui contient tout ce dont vous aurez besoin pour vous
connecter à une base PostgreSQL.
Cela signifie-t-il qu'il existe un fichier .jar par SGBD ?
Tout à fait, il existe un fichier .jar pour se connecter à :
MySQL ;
SQL Server ;
Oracle ;
d'autres bases.
June 2, 2023 @joska,chef de travaux 53
CHAP 3:Programmation
client/serveur: 2tiers
Connexion
La base de données est prête, les tables sont créées, remplies et nous possédons le driver
nécessaire ! Il ne nous reste plus qu'à nous connecter. Créons un nouveau projet dans Eclipse avec
une classe contenant une méthode public static void main(String[] args). Voici le code source
permettant la connexion :
public class Connect {
public static void main(String[] args) {
try {
[Link]("[Link]");
[Link]("Driver O.K.");
String url = "jdbc:postgresql://localhost:5432/Ecole";
String user = "postgres";
String passwd = "postgres";
Connection conn = [Link](url, user,passwd);
[Link]("Connexion effective !");
} catch (Exception e) {
[Link](); }}}
June 2, 2023 @joska,chef de travaux 54
CHAP 3:Programmation
client/serveur: 2tiers
Connexion
À ce stade, il existe comme un pont entre votre programme Java et votre BDD, mais le trafic
routier n'y est pas encore autorisé : il faut qu'une connexion soit effective afin que le programme
et la base de données puissent communiquer. Cela se réalise grâce à cette ligne de code :
Code : Java
Connection conn = [Link](url, user, passwd);
Nous avons défini au préalable trois String contenant respectivement :
l'URL de connexion ;
le nom de l'utilisateur ;
le mot de passe utilisateur.
June 2, 2023 @joska,chef de travaux 55
CHAP 3:Programmation
client/serveur: 2tiers
Connexion: Configuration du serveur de base de données
Dans le cas de partage de la base de données, il faut modifier l’adresse IP au niveau de l’URL de
connexion et ajouter les règles au niveau de Pare-feu en autorisant le Port d’entre et de sortie .
String url = "jdbc:[Link]://localhost:5432/Ecole";
June 2, 2023 @joska,chef de travaux 56
CHAP 3:Programmation
client/serveur: 2tiers
Connexion: Configuration du serveur de base de données
June 2, 2023 @joska,chef de travaux 57
CHAP 3:Programmation
client/serveur: 2tiers
Connexion: Configuration du serveur de base de données
June 2, 2023 @joska,chef de travaux 58
CHAP 3:Programmation
client/serveur: 2tiers
Connexion: Configuration du serveur de base de données
June 2, 2023 @joska,chef de travaux 59
CHAP 3:Programmation
client/serveur: 2tiers
Fouiller dans sa base de données
Nous continuons notre voyage initiatique au pays de JDBC en abordant la manière d'interroger notre BDD. Eh oui, une base de
données n'est utile que si nous pouvons consulter, ajouter, modifier et supprimer les données qu'elle contient. Pour y parvenir, il
était impératif de se connecter au préalable. Maintenant que c'est chose faite, nous allons voir comment fouiner dans notre BDD.
Le couple Statement - ResultSet
Voici deux objets que vous utiliserez sûrement beaucoup ! En fait, ce sont ces deux objets qui permettent de récupérer des
données de la BDD et de travailler avec celles-ci. Afin de vous faire comprendre tout cela de façon simple, voici un exemple assez
complet (mais tout de même pas exhaustif) affichant le contenu de la table classe :
June 2, 2023 @joska,chef de travaux 60
CHAP 3:Programmation
client/serveur: 2tiers
Fouiller dans sa base de données
public class Connect {
public static void main(String[] args) {
try {
[Link]("[Link]");
String url = "jdbc:postgresql://localhost:5432/Ecole";
String user = "postgres";
String passwd = "postgres";
Connection conn = [Link](url, user,
passwd);
//Création d'un objet Statement
Statement state = [Link]();
//L'objet ResultSet contient le résultat de la requête SQL
ResultSet result = [Link]("SELECT * FROM classe");
//On récupère les MetaData
ResultSetMetaData resultMeta = [Link]();
[Link]("\n**********************************");
June 2, 2023 @joska,chef de travaux 61
CHAP 3:Programmation
client/serveur: 2tiers
Fouiller dans sa base de données
//On affiche le nom des colonnes
for(int i = 1; i <= [Link](); i++)
[Link]("\t" +
[Link](i).toUpperCase() + "\t *");
[Link]("\n**********************************");
while([Link]()){
for(int i = 1; i <= [Link](); i++)
[Link]("\t" + [Link](i).toString() +
"\t |");
[Link]("\n---------------------------------");
[Link]();
[Link](); } catch (Exception e) {
[Link](); }}}
June 2, 2023 @joska,chef de travaux 62
CHAP 3:Programmation
client/serveur: 2tiers
Fouiller dans sa base de données
J'ai simplement exécuté une requête SQL et récupéré les lignes retournées. Mais détaillons un peu plus ce qu'il s'est passé. Déjà,
vous avez pu remarquer que j'ai spécifié l'URL complète pour la connexion : sinon, comment savoir à quelle BDD se connecter ?
Ce dernier point mis à part, les choses se sont déroulées en quatre étapes distinctes :
création de l'objet Statement ; exécution de la requête SQL ; récupération et affichage des données via l'objet ResultSet ;
fermeture des objets utilisés (bien que non obligatoire, c'est recommandé).
L'objet Statement permet d'exécuter des instructions SQL, il interroge la base de données et retourne les résultats. Ensuite,
ces résultats sont stockés dans l'objet ResultSet, grâce auquel on peut parcourir les lignes de résultats et les afficher.
Comme je vous l'ai mentionné, l'objet Statement permet d'exécuter des requêtes SQL. Ces dernières peuvent être de différents
types :
CREATE ;
INSERT ;
UPDATE ;
SELECT ;
DELETE.
June 2, 2023 @joska,chef de travaux 63
CHAP 3:Programmation
client/serveur: 2tiers
Fouiller dans sa base de données
L'objet Statement est fourni par l'objet Connection grâce à l'instruction [Link](). Ce que j'ai fait,
ensuite, c'est demander à mon objet Statement d'exécuter une requête SQL de type SELECT : SELECT * FROM classe.
Elle demande à la BDD de nous envoyer toutes les classes.
Puisque cette requête retourne un résultat contenant beaucoup de lignes, contenant elles-mêmes plusieurs colonnes, j'ai stocké
ce résultat dans un objet ResultSet, qui permet d'effectuer diverses actions sur des résultats de requêtes SQL.
Ici, j'ai utilisé un objet de type ResultSetMetaData afin de récupérer les métadonnées de ma requête, c'est-à-dire ses
informations globales. J'ai ensuite utilisé cet objet afin de récupérer le nombre de colonnes renvoyé par la requête SQL ainsi que
leur nom. Cet objet de métadonnées permet de récupérer des informations très utiles, comme :
le nombre de colonnes d'un résultat ;
le nom des colonnes d'un résultat ;
le type de données stocké dans chaque colonne ;
le nom de la table à laquelle appartient la colonne (dans le cas d'une jointure de tables) ;
etc.
June 2, 2023 @joska,chef de travaux 64
CHAP 3:Programmation
client/serveur: 2tiers
Statement
Vous avez vu comment obtenir un objet Statement. Mais je ne vous ai pas tout dit… Vous savez déjà que pour récupérer un objet
Statement, vous devez le demander gentiment à un objet Connection en invoquant la méthode
createStatement(). Ce que vous ne savez pas, c'est que vous pouvez spécifier des paramètres pour la création de l'objet Statement.
Ces paramètres permettent différentes actions lors du parcours des résultats via l'objet ResultSet.
Le premier paramètre est utile pour la lecture du jeu d'enregistrements :
TYPE_FORWARD_ONLY : le résultat n'est consultable qu'en avançant dans les données renvoyées, il est donc impossible de
revenir en arrière lors de la lecture ;
TYPE_SCROLL_SENSITIVE : le parcours peut se faire vers l'avant ou vers l'arrière et le curseur peut se positionner n'importe
où, mais si des changements surviennent dans la base pendant la lecture, il ne seront pas visibles ;
TYPE_SCROLL_INSENSITIVE : à la différence du précédent, les changements sont directement visibles lors du parcours des
résultats.
Le second concerne la possibilité de mise à jour du jeu d'enregistrements :
CONCUR_READONLY : les données sont consultables en lecture seule, c'est-à-dire que l'on ne peut modifier des valeurs
pour mettre la base à jour ;
CONCUR_UPDATABLE : les données sont modifiables ; lors d'une modification, la base est mise à jour.
June 2, 2023 @joska,chef de travaux 65
CHAP 3:Programmation
client/serveur: 2tiers
Les requêtes préparées
Il va falloir vous accrocher un tout petit peu… De tels objets sont créés exactement de la même façon que des Statement
classiques, sauf qu'au lieu de cette instruction :
Code : Java
Statement stm = [Link]();
… nous devons écrire ceci :
Code : Java
PreparedStatement stm = [Link]("SELECT * FROM classe");
Jusqu'ici, rien de spécial. Cependant, une différence est déjà effective à ce stade : la requête SQL est
précompilée ! Cela a pour effet de réduire le temps d'exécution dans le moteur SQL de la BDD. C'est normal,
étant donné qu'il n'aura pas à compiler la requête. En règle générale, on utilise ce genre d'objet pour des
requêtes contenant beaucoup de paramètres ou pouvant être exécutées plusieurs fois. Il existe une autre
différence de taille entre les objets PreparedStatement et Statement : dans le premier, on peut utiliser des
paramètres à trous !
June 2, 2023 @joska,chef de travaux 66
CHAP 3:Programmation
client/serveur: 2tiers
PATRON D’ACHITECTURE: MVC
June 2, 2023 @joska,chef de travaux 67
CHAP 2:Programmation
client/serveur: 2tiers
Le modèle de programmation MVC.
MVC est une architecture permettant de créer des applications à l'aide d'une
conception MVC (Model View Controller):
Le modèle représente le cœur de l'application (par exemple une liste
d'enregistrements de base de données).
La vue affiche les données (les enregistrements de la base de données).
Le contrôleur gère l'entrée (dans les enregistrements de la base de données).
Le modèle MVC définit
les applications avec 3 couches logiques
:
La couche métier (logique du modèle)
La couche d'affichage (logique de vue)
Le contrôle d'entrée (logique du
contrôleur)
June 2, 2023 @joska,chef de travaux 68
CHAP 2:Programmation
client/serveur: 2tiers
Le modèle est la partie de l'application qui gère la logique des données
d'application.
Souvent, les objets de modèle récupèrent des données (et stockent des
données) à partir d'une base de données.
La vue est la partie de l'application qui gère l'affichage des données.
Le plus souvent, les vues sont créées à partir des données du modèle.
Le contrôleur est la partie de l'application qui gère l'interaction de
l'utilisateur.
En règle générale, les contrôleurs lisent les données d'une vue, contrôlent
l'entrée de l'utilisateur et envoient les données d'entrée au modèle.
La séparation MVC vous aide à gérer des applications complexes, car vous
pouvez vous concentrer sur un aspect à la fois. Par exemple, vous pouvez vous
concentrer sur la vue sans dépendre de la logique métier. Cela facilite également
le test d'une application.
La séparation MVC simplifie également le développement de groupe. Différents
développeurs peuvent travailler sur la vue, la logique du contrôleur et la logique
métier en parallèle.
June 2, 2023 @joska,chef de travaux 69
CHAP 2:Programmation
client/serveur: 2tiers
Le paradigm Procedural(code behind) vs MVC
Le modèle de programmation MVC est une alternative plus légère au traditionnel
(code behind). Il s'agit d'une architecture léger et hautement testable
CODE BEHIND
June 2, 2023 @joska,chef de travaux 70
CHAP 2:Programmation
client/serveur: 2tiers
ACTIVITE
Créons une application client/serveur de gestion des utilisateurs base sur L’
ARCHITECURE MVC
June 2, 2023 @joska,chef de travaux 71
CHAP 2:Programmation
client/serveur: 2tiers
ACTIVITE:modele
import [Link];
public class Utilisateur {
private int id;
private String nom;
private String postnom;
private String password;
private String sexe;
public TableModel getModel() {
return model;
}
public void setModel(TableModel model) {
[Link] = model;
}
private TableModel model;
public Utilisateur() {}
public Utilisateur(int id, String nom, String postnom, String password, String sexe) {
[Link] = id;
[Link] = nom;
[Link] = postnom;
[Link] = password;
[Link] = sexe;}
June 2, 2023 @joska,chef de travaux 72
CHAP 2:Programmation
client/serveur: 2tiers
ACTIVITE:modele
public int getId() {
return id;
}
public String getNom() {
return nom;
}
public String getPostnom() {
return postnom;
}
public String getPassword() {
return password;
}
public String getSexe() {
return sexe;
}
public void setId(int id) {
[Link] = id;
}
public void setNom(String nom) {
[Link] = nom; }
public void setPostnom(String postnom) {
[Link] = postnom;}
public void setPassword(String password) {
[Link] = password;}
public void setSexe(String sexe) {
[Link] = sexe;}
}
June 2, 2023 @joska,chef de travaux 73
CHAP 2:Programmation
client/serveur: 2tiers
ACTIVITE:modele
public int getId() {
return id;
}
public String getNom() {
return nom;
}
public String getPostnom() {
return postnom;
}
public String getPassword() {
return password;
}
public String getSexe() {
return sexe;
}
public void setId(int id) {
[Link] = id;
}
public void setNom(String nom) {
[Link] = nom; }
public void setPostnom(String postnom) {
[Link] = postnom;}
public void setPassword(String password) {
[Link] = password;}
public void setSexe(String sexe) {
[Link] = sexe;}
}
June 2, 2023 @joska,chef de travaux 74
CHAP 2:Programmation
client/serveur: 2tiers
ACTIVITE:ControlleurUtilisateur
package Controlleur;
import [Link];
import [Link];
import [Link].*;
import [Link];
public class ControlleurUtilisateur {
DefaultTableModel model;
//fonction de connexion
public static Connection getConnection(){
Connection con=null;
try {
[Link]("[Link]");
con=[Link]("jdbc:mysql://[Link]:3306/gestion_userisc","root","");
} catch (Exception e) {
[Link]();
}
return con;
June 2, 2023 @joska,chef de travaux 75
CHAP 2:Programmation
client/serveur: 2tiers
ACTIVITE:ControlleurUtilisateur
//FONCTION D INSERTION DES UTILISATEUR
public static int saveUtilisateur(Utilisateur user){
int status=0;
try {
Connection con=getConnection();
PreparedStatement ps=[Link]("INSERT INTO UTILISATEUR
(ID,NOM,POSTNOM,PASSWORDD,SEXE) VALUES(?,?,?,?,?)");
[Link](1,[Link]());
[Link](2,[Link]());
[Link](3,[Link]());
[Link](4,[Link]());
[Link](5,[Link]());
status= [Link]();
} catch (Exception e) {
}
return status;
}
June 2, 2023 @joska,chef de travaux 76
CHAP 2:Programmation
client/serveur: 2tiers
ACTIVITE:ControlleurUtilisateur
//FONCTION D modifier DES UTILISATEUR
public static int updateUtilisateur(Utilisateur user){
int status=0;
try {
Connection con=getConnection();
PreparedStatement ps=[Link]("UPDATE UTILISATEUR SET
NOM=?,POSTNOM=?,PASSWORDD=?,SEXE=? WHERE ID=?");
[Link](1,[Link]());
[Link](2,[Link]());
[Link](3,[Link]());
[Link](4,[Link]());
[Link](5,[Link]());
status= [Link]();
} catch (Exception e) {
}
return status;
}
June 2, 2023 @joska,chef de travaux 77
CHAP 2:Programmation
client/serveur: 2tiers
ACTIVITE:ControlleurUtilisateur
//FONCTION DE SUPPRIMER DES UTILISATEUR
public static int deleteUtilisateur(int id){
int status=0;
try {
Connection con=getConnection();
PreparedStatement ps=[Link]("DELETE FROM UTILISATEUR WHERE ID=?");
[Link](1,id);
status= [Link]();
} catch (Exception e) {
}
return status;
}
June 2, 2023 @joska,chef de travaux 78
CHAP 2:Programmation
client/serveur: 2tiers
ACTIVITE:ControlleurUtilisateur
public void chagertable(Utilisateur user) {
//pour le paremetre de seuil de commande
model=new DefaultTableModel();
ResultSetMetaData resultData;
ResultSet rs;
try {
Connection con=getConnection();
PreparedStatement ps=[Link]("select * from utilisateur");
rs=[Link]();
resultData=[Link]();
int j=0;
do
{
[Link]([Link](j+1).toUpperCase());
j+=1;
}
while(j<[Link]());
while([Link]())
{
[Link](new
Object[]{[Link](1),[Link](2),[Link](3),[Link](4),[Link](5)});
}
[Link](model);
} catch (SQLException e) {
[Link]();
}
June 2, 2023 @joska,chef de travaux 79
CHAP 2:Programmation
client/serveur: 2tiers
ACTIVITE:ControlleurUtilisateur
//faire la recherche dans la base de donnees
public void recherchertable(Utilisateur user,JTextField one) {
model=new DefaultTableModel();
ResultSetMetaData resultData;
ResultSet rs;
try {
Connection con=getConnection();
PreparedStatement ps=[Link]("select * from utilisateur where nom or postnom like
?");
[Link](1,[Link]());
rs=[Link]();
resultData=[Link]();
int j=0;
do
{
[Link]([Link](j+1).toUpperCase());
j+=1;
}
while(j<[Link]());
while([Link]())
{
[Link](new
Object[]{[Link](1),[Link](2),[Link](3),[Link](4),[Link](5)});
}
[Link](model);
} catch (SQLException e) {
[Link]();
}}
June 2, 2023 @joska,chef de travaux 80
CHAP 2:Programmation
client/serveur: 2tiers
ACTIVITE:Vue
June 2, 2023 @joska,chef de travaux 81
CHAP 2:Programmation
client/serveur: 2tiers
ACTIVITE:Vue
//la function qui chagera le “Jtable”
Utilisateur user=new Utilisateur();
ControlleurUtilisateur joska=new ControlleurUtilisateur();
void charger(){
[Link](user);
[Link]([Link]());
}
June 2, 2023 @joska,chef de travaux 82
CHAP 2:Programmation
client/serveur: 2tiers
ACTIVITE:Vue (button Enregistrer)
try {
if(![Link]().equals("") && ![Link]().equals("") &&
![Link]().equals("")
&& ![Link]().toString().equals("")){
[Link]([Link]([Link]()));
[Link]([Link]());
[Link]([Link]());
[Link]([Link]().toString());
[Link]([Link]().toString());
if([Link](user) > 0){
[Link](null,"insertion reussi");
charger();
[Link]("");
[Link]("");
[Link]("");
} }
else{
[Link](null,"veillez completer tous les champs");
}
} catch (Exception e) {
}
June 2, 2023 @joska,chef de travaux 83
CHAP 2:Programmation
client/serveur: 2tiers
ACTIVITE:Vue (button Modifier)
try {
if(![Link]().equals("") && ![Link]().equals("") &&
![Link]().equals("")
&& ![Link]().toString().equals("")){
[Link]([Link]([Link]()));
[Link]([Link]());
[Link]([Link]());
[Link]([Link]().toString());
[Link]([Link]().toString());
if([Link](user) > 0){
[Link](null,"modification reussi");
charger();
[Link]("");
[Link]("");
[Link]("");
}
}
else{
[Link](null,"veillez completer tous les champs");
}
} catch (Exception e) {
}
June 2, 2023 @joska,chef de travaux 84
CHAP 2:Programmation
client/serveur: 2tiers
ACTIVITE:Vue (button Supprmer)
if(![Link]().equals("")){
if([Link]([Link]([Link]()))>0)
{
[Link](null,"suppression reussi");
charger();
}}else{
[Link](null,"Veuillez completer le champ !");
}
June 2, 2023 @joska,chef de travaux 85
CHAP 2:Programmation
client/serveur: 2tiers
ACTIVITE:Vue (avant de modifier ,en cliquant dans le Jtable,les
donnees doivent s’afficher dans les differents champs,avec
l’evenement “MouseClicked”)
private void jTable1MouseClicked([Link] evt) {
try {
[Link]([Link]([Link](),0).toString());
[Link]([Link]([Link](),1).toString());
[Link]([Link]([Link](),2).toString());
[Link]([Link]([Link](),3).toStri
ng());
[Link]([Link]([Link](),4).t
oString());
} catch (Exception e) {
}
June 2, 2023 @joska,chef de travaux 86
CHAP 2:Programmation
client/serveur: 2tiers
ACTIVITE:Vue (Pour rechecher ,nous allons creer un evenement avec
le JTextFiel “ CaretUpdat”)
private void jTextField3CaretUpdate([Link] evt)
{
[Link](user, [Link]());
[Link]([Link]());
June 2, 2023 @joska,chef de travaux 87
CHAP 2:Programmation
client/serveur: 2tiers
ACTIVITE:
June 2, 2023 @joska,chef de travaux 88
CHAP 3:Client/serveur:
3tiers(JSP)
Rappel Sur architecture 3Tiers
June 2, 2023 @joska,chef de travaux 89
CHAP 3:Client/serveur:
3tiers (JSP)
Dans ce cours,nous allons Utiliser le Framework JSP de Java EE
June 2, 2023 @joska,chef de travaux 90
CHAP 3:Client/serveur:
3tiers (JSP)
Java Server Pages (JSP) est une technologie qui permet aux développeurs de créer des
pages Web dynamiques en utilisant une combinaison de code HTML, XML et Java. Les
pages JSP sont exécutées sur un serveur Web et la sortie résultante est envoyée au
navigateur Web du client. JSP permet d'accéder facilement au code et aux objets Java à
partir d'une page Web, ce qui simplifie la création de pages Web dynamiques. Les pages
JSP sont généralement utilisées conjointement avec des servlets Java, qui gèrent le
traitement des données et les demandes des clients. JSP fait partie de la plate-forme
Java EE et est pris en charge par la plupart des serveurs Web et des conteneurs de
servlets.
June 2, 2023 @joska,chef de travaux 91
CHAP 3:Client/serveur:
3tiers (JSP)
Voici quelques faits sur JSP (JavaServer Pages):
•JSP signifie Java Server Pages.
•JSP est une technologie permettant de créer des applications Web dynamiques.
•JSP fait partie de Java Enterprise Edition (Java EE).
•JSP est similaire aux pages HTML, mais elles contiennent également du code
Java exécuté côté serveur.
•Les scripts côté serveur signifient que le code JSP est traité sur le serveur Web
plutôt que sur la machine cliente.
•Une page JSP est un fichier avec une extension « .jsp » qui peut contenir
une combinaison de balises HTML et de codes JSP.
•Pour créer une page Web, JSP utilise une combinaison de balisage HTML ou XML,
•de balises JSP, d'expressions et de code Java.
•Les balises JSP commencent <%et se terminent par %>.
•Les expressions JSP sont utilisées pour insérer du contenu dynamique
dans la page et commencent par <%=et se terminent par %>.
•JSP peut utiliser JavaBeans pour stocker et récupérer des données.
•JSP nécessite un environnement de développement Java et un conteneur
de servlet Java tel qu'Apache Tomcat ou Jetty.
•JSP est largement utilisé dans l'industrie pour créer des applications Web d'entreprise.
•JSP est une version étendue améliorée de la technologie Servlet.
June 2, 2023 @joska,chef de travaux 92
CHAP 3:Client/serveur:
3tiers (JSP)
AVANTAGE DE JSP:
Certains avantages de JSP (JavaServer Pages) incluent les éléments suivants :
JSP offre une approche efficace et plus simple pour coder des pages Web
dynamiques.
JSP fournit une grande variété de balises prédéfinies et de balises personnalisées, qui
peuvent être utilisées pour ajouter des fonctionnalités aux pages Web
JSP permet aux développeurs de séparer la présentation de la page Web de la
logique et du traitement, ce qui facilite la maintenance de l'application Web.
Le conteneur Web (ou le serveur d'applications comme Tomcat) gère les
modifications lorsque des modifications sont apportées au code JSP et ne nécessite
pas de recompilation.
JSP permet aux développeurs de suivre le modèle de conception Modèle-Vue-
Contrôleur (MVC), qui sépare la présentation, la logique et les données d'une
application Web. Cela facilite la création d'applications Web évolutives et
maintenables.
JSP est couramment utilisé avec d'autres technologies Java, telles que JavaServer
Faces (JSF), qui fournit un cadre pour la création d'applications Web, ce qui simplifie
le processus de développement.
Fournit de bonnes fonctionnalités de sécurité telles que le suivi de session,
l'authentification des utilisateurs et la restriction d'accès.
JSP peut utiliser du code et des bibliothèques Java standard, ce qui augmente le
potentiel de réutilisation du code.
June 2, 2023 @joska,chef de travaux 93
CHAP 3:Client/serveur:
3tiers (JSP)
AVANTAGE DE JSP PAR RAPPORT AUX SERVLETS:
JSP est considéré comme meilleur que servlet ; JSP est plus avantageux que servlet
pour de nombreuses raisons :
Les pages JSP permettent aux concepteurs Web de travailler avec le balisage HTML
ou XML, tandis que les servlets nécessitent une compréhension plus approfondie de
Java.
JSP n'a pas besoin de fichiers supplémentaires tels que des fichiers de classe Java,
[Link], etc.
Les JSP sont compilées en servlets par le moteur JSP, ce qui améliore les
performances par rapport à l'interprétation des servlets lors de l'exécution.
De nombreux IDE et outils sont disponibles pour développer des JSP, ce qui peut
rendre le développement plus rapide et plus facile par rapport aux servlets.
Les JSP sont plus accessibles pour le débogage et le dépannage que les servlets car
ils disposent de meilleures fonctions de rapport d'erreurs et de débogage.
JSP est considéré comme plus facile à apprendre que servlet.
June 2, 2023 @joska,chef de travaux 94
CHAP 3:Client/serveur:
3tiers (JSP)
JSP ,ENVIRONNMENT:
L'environnement JSP est un ensemble d'outils et de technologies utilisés pour créer des
pages Web dynamiques à l'aide de la technologie JavaServer Pages (JSP). Il comprend
les composants suivants :
Moteur JSP : Un composant logiciel qui lit et exécute les fichiers JSP. Il convertit le
code JSP en servlets, qui sont ensuite exécutés sur le serveur et génèrent le HTML
final.
Serveur Web : Un logiciel qui reçoit les requêtes des clients et envoie les réponses.
Il est responsable du traitement des requêtes et des réponses HTTP.
Java Runtime Environment (JRE) : Ce logiciel fournit l'environnement nécessaire
à l'exécution des applications Java, y compris les pages JSP.
Bibliothèques et frameworks supplémentaires : des outils et bibliothèques
supplémentaires, tels que JavaBeans, JavaServer Faces et le framework Spring,
peuvent être utilisés pour développer des applications JSP.
Outils de développement : Les environnements de développement intégrés (IDE),
tels qu'Eclipse, IntelliJ IDEA et NetBeans, sont utilisés pour écrire, tester et déboguer
le code JSP.
June 2, 2023 @joska,chef de travaux 95
CHAP 3:Client/serveur:
3tiers (JSP)
SERVEUR APACHE TOMCAT:
Apache Tomcat, également connu simplement sous le nom de Tomcat, est un
serveur Web open source et un logiciel de conteneur de servlet développé par
Apache Software Foundation. Il est utilisé pour exécuter des servlets Java et des
pages JavaServer (JSP) pour servir du contenu Web dynamique. Tomcat est un
composant de la plate-forme Java, Enterprise Edition (Java EE) et est utilisé pour
déployer et exécuter des applications Web Java. Il fournit un environnement de
serveur Web HTTP "pur Java" dans lequel le code Java peut s'exécuter, ainsi que
plusieurs fonctionnalités supplémentaires telles que la prise en charge de plusieurs
protocoles (y compris HTTP, AJP et JMX), des outils de sécurité et de gestion.
Tomcat est largement utilisé dans les environnements de production car il est léger,
facile à configurer et hautement personnalisable.
June 2, 2023 @joska,chef de travaux 96
CHAP 3:Client/serveur:
3tiers (JSP)
INSTALLATION APACHE TOMCAT:
Accédez au site Web d'Apache Tomcat ( [Link] ) et accédez à la
page "Télécharger".
Dans la section "Core", recherchez la dernière version du programme d'installation de
Tomcat pour Windows et cliquez sur le lien pour la télécharger.
Une fois le téléchargement terminé, ouvrez le fichier d'installation et suivez les
instructions pour installer Tomcat sur votre ordinateur.
Au cours du processus d'installation, vous serez invité à sélectionner un emplacement
pour l'installation de Tomcat. Choisissez un emplacement sur votre disque dur et
cliquez sur "Suivant".
Le programme d'installation vous demandera alors de choisir les composants que
vous souhaitez installer. Il est recommandé d'installer le "Serveur Web Tomcat" et la
"Documentation Tomcat" pour une installation de base.
Une fois l'installation terminée, cliquez sur "Terminer".
Vérifiez que l'installation a réussi en démarrant le serveur Tomcat. Vous pouvez le
faire en accédant au dossier bin de Tomcat et en exécutant le fichier [Link] .
Une fois le serveur démarré, ouvrez un navigateur Web et entrez l'URL
"[Link] pour accéder à la page d'accueil de Tomcat, qui confirme que
le serveur Tomcat fonctionne correctement.
June 2, 2023 @joska,chef de travaux 97
CHAP 3:Client/serveur:
3tiers (JSP)
INSTALLATION APACHE TOMCAT:
En conclusion, la configuration d'un environnement JSP peut sembler intimidante au
départ, mais en installans Netbeans,vous demarez automatiquement le serveur web et
cela rend le processus beaucoup plus simple. Avoir une configuration appropriée est
crucial pour développer et exécuter des applications JSP. Il est essentiel de s'assurer que
tous les logiciels et configurations nécessaires sont en place avant de commencer tout
développement. La création de pages Web dynamiques avec JSP peut être une
expérience agréable avec les bons outils et les bonnes connaissances
June 2, 2023 @joska,chef de travaux 98
CHAP 3:Client/serveur:
3tiers (JSP)
Overview:
Une compréhension claire du moteur JSP et de son architecture est essentielle pour
comprendre le fonctionnement interne des pages JSP. Ce didacticiel explore la
structure de JSP et explique comment les serveurs Web gèrent les pages JSP.
June 2, 2023 @joska,chef de travaux 99
CHAP 3:Client/serveur:
3tiers (JSP)
Architecture:
L'architecture JSP est une architecture à 3 niveaux qui sépare les couches de
présentation , de logique et de données d'une application Web . La couche de
présentation, ou côté client, est chargée d'afficher l'interface utilisateur et de gérer
l'interaction de l'utilisateur. La couche logique, ou côté serveur, est responsable du
traitement des demandes des utilisateurs et de la gestion de la logique métier. La
couche de données est responsable du stockage et de la récupération des données
d'une base de données ou d'un autre système de stockage. Cette séparation des
préoccupations permet une meilleure maintenabilité et évolutivité de l'application.
June 2, 2023 @joska,chef de travaux 100
CHAP 3:Client/serveur:
3tiers (JSP)
Conteneur web?
Une application Web basée sur JSP nécessite un moteur JSP, également appelé
conteneur Web , pour traiter et exécuter les pages JSP. Le conteneur Web est un
composant de serveur Web qui gère l'exécution de programmes Web tels que les
servlets, les JSP et les ASP.
Lorsqu'un client envoie une requête pour une page JSP, le conteneur Web l'intercepte
et la dirige vers le moteur JSP. Le moteur JSP convertit ensuite la page JSP en une
classe de servlet, la compile et crée une instance de la classe. La méthode de service
de la classe servlet est alors appelée, ce qui génère le contenu dynamique de la page
JSP.
Le conteneur Web gère également le cycle de vie des pages JSP et des servlets, en
gérant des tâches telles que leur instanciation, leur initialisation et leur destruction.
En outre, il fournit des services de sécurité, de regroupement de connexions et de
gestion de session à l'application Web basée sur JSP
June 2,. 2023 @joska,chef de travaux 101
CHAP 3:Client/serveur:
3tiers (JSP)
FLUX d’architecture JSP?
Le flux d'architecture JSP fait référence à la séquence d'étapes suivies par une application
Web basée sur JSP pour traiter et exécuter des pages JSP. Le flux général d'une
architecture JSP peut être décrit comme suit :
Un client (tel qu'un navigateur Web) envoie une demande de page JSP à un serveur Web.
Le serveur Web transmet la demande au moteur JSP responsable du traitement des pages
JSP.
Le moteur JSP vérifie si la page JSP demandée a été compilée dans un servlet. Sinon, il
compile la page JSP dans une classe servlet. Cela se fait en analysant la page JSP et en
convertissant ses éléments (tels que les scriptlets, les expressions et les directives) en code
Java.
Le moteur JSP compile ensuite la classe servlet, qui crée un fichier de classe Java pouvant
être exécuté par la machine virtuelle Java (JVM).
Le moteur JSP crée ensuite une instance de la classe servlet et appelle la méthode
service(), qui génère le contenu dynamique de la page JSP. Dans la méthode service(), le
moteur JSP génère le code HTML de la réponse en combinant le modèle statique de la
page JSP avec le contenu dynamique généré par le code Java.
Le moteur JSP renvoie le code HTML généré au serveur Web, qui le renvoie ensuite au
client en réponse.
Le moteur JSP maintient également un cache des classes de servlet compilées afin que les
demandes ultérieures.
June 2, 2023 @joska,chef de travaux 102
CHAP 3:Client/serveur:
3tiers (JSP)
Cycle de vie JSP?
Un cycle de vie d'une page JSP est défini comme un processus allant de sa phase de
traduction à la phase de destruction. Cette leçon décrit les différentes étapes du cycle
de vie d'une page JSP.
Le cycle de vie d'une page JSP peut être divisé en la phase suivante :
Phase de traduction
Compilation
Phase d'initialisation
Phase d'exécution
Phase de destruction (nettoyage)
June 2, 2023 @joska,chef de travaux 103
CHAP 3:Client/serveur:
3tiers (JSP)
Base JSP
Java fournit divers éléments de script qui vous permettent d'insérer du code Java à
partir de votre code JSP dans le servlet. Les éléments de script ont différents
composants autorisés par JSP. Comprendre chacun de ces composants est essentiel
pour écrire du code dans JSP. Discutons en détail de chacun des composants
June 2, 2023 @joska,chef de travaux 104
CHAP 3:Client/serveur:
3tiers (JSP)
Base JSP
Les éléments de script dans JSP doivent être écrits dans les balises <% %> . Le
moteur JSP traitera tout code que vous écrivez dans la paire de balises <% et %> ,
et tout autre texte de la page JSP sera traité comme du code HTML ou du texte brut
lors de la traduction de la page JSP
<%@ page import="[Link]"%>
<!DOCTYPE html>
<html> <head> <title>Comments in JSP Page</title> </head>
<body> <%-- A JSP comment --%>
<!-- An HTML comment -->
<!—The current date is <%= new Date() %> -->
</body>
</html>
June 2, 2023 @joska,chef de travaux 105
CHAP 3:Client/serveur:
3tiers (JSP)
Directive JSP
Ces balises sont utilisées pour fournir des instructions spécifiques au conteneur Web
lorsque la page est traduite. Il comporte trois sous-catégories :
Page : <%@page... %>
Inclure : <%@ inclure ... %>
Taglib : <%@ taglib ... %>
Nous les détaillerons dans le prochain chapitre.
June 2, 2023 @joska,chef de travaux 106
CHAP 3:Client/serveur:
3tiers (JSP)
Declaration JSP
Comme son nom l'indique, il est utilisé pour déclarer des méthodes et des variables que
vous utiliserez dans votre code Java au sein d'un fichier JSP. Selon les règles de JSP,
toute variable doit être déclarée avant de pouvoir être utilisée
<!DOCTYPE html>
<html>
<body>
<%! int variable_value=62; %>
<%= " Your integer data is :"+ variable_value %>
</body>
</html>
June 2, 2023 @joska,chef de travaux 107
CHAP 3:Client/serveur:
3tiers (JSP)
Balise script JSP
Comme son nom l'indique, il est utilisé pour déclarer des méthodes et des variables que
vous utiliserez dans votre code Java au sein d'un fichier JSP. Selon les règles de JSP,
toute variable doit être déclarée avant de pouvoir être utilisée
<% JAVA CODE %>
Synthaxe:
<!DOCTYPE html>
<html>
<head> <title>Scriptlet Tag</title> </head>
<% int count = 2; %>
<body>
Calculated page count <% [Link](cnt); %>
</body>
</html>
June 2, 2023 @joska,chef de travaux 108
CHAP 3:Client/serveur:
3tiers (JSP)
Balise script JSP
Un autre extrait de code qui montre comment écrire et mélanger des balises de scriptlet
avec du HTML
Synthaxe:
<table border="1">
<% for ( int g = 1; g <= cnt; g++ ) { %>
<tr>
<td>Number</td>
<td><% = g+1 %></td>
</tr> <% } %>
</table>
June 2, 2023 @joska,chef de travaux 109
CHAP 3:Client/serveur:
3tiers (JSP)
Expression JSP
Les éléments d'expressions sont chargés de contenir l'expression de langage de script,
qui est évaluée et convertie en chaînes par le moteur JSP et est destinée au flux de sortie
de la réponse. Par conséquent, vous n'êtes pas obligé d'écrire [Link]() pour écrire
vos données. Ceci est principalement utilisé pour imprimer les valeurs des variables ou
des méthodes sous forme de sortieSynthaxe:
<!DOCTYPE html>
<html>
<body> <%= "A JSP based string" %>
</body>
</html>
June 2, 2023 @joska,chef de travaux 110
CHAP 3:Client/serveur:
3tiers (JSP)
Expression JSP
Les éléments d'expressions sont chargés de contenir l'expression de langage de script,
qui est évaluée et convertie en chaînes par le moteur JSP et est destinée au flux de sortie
de la réponse. Par conséquent, vous n'êtes pas obligé d'écrire [Link]() pour écrire
vos données. Ceci est principalement utilisé pour imprimer les valeurs des variables ou
des méthodes sous forme de sortieSynthaxe:
<!DOCTYPE html>
<html>
<body> <%= "A JSP based string" %>
</body>
</html>
June 2, 2023 @joska,chef de travaux 111
CHAP 3:Client/serveur:
3tiers (JSP)
Directive JSP
June 2, 2023 @joska,chef de travaux 112
CHAP 3:Client/serveur:
3tiers (JSP)
Directive JSP
Les directives fournissent des instructions et des messages à un conteneur JSP. Les
directives fournissent des informations globales sur la page entière de JSP. Par
conséquent, ils constituent une partie essentielle du code JSP. Ces instructions
spéciales sont utilisées pour traduire JSP en code de servlet. Dans ce chapitre, vous
découvrirez en détail les différents composants des directives.
Dans la phase du cycle de vie des JSP, le code doit être converti en un servlet qui
s'occupe de la phase de traduction. Ils fournissent des commandes ou des
instructions au conteneur sur la façon de traiter et de gérer certaines parties de
traitement JSP. Les directives peuvent contenir plusieurs attributs séparés par une
virgule et agir comme des paires clé-valeur. Dans JSP, les directives sont décrites
avec une paire de balises <%@ .... %>.
La syntaxe des directives ressemble à : <%@ directive attribute="" %>
Il existe 3 types de directives :
Directive de page
Inclure la directive
Directive Taglib
June 2, 2023 @joska,chef de travaux 113
CHAP 3:Client/serveur:
3tiers (JSP)
Directive JSP
La directive de page est utilisée pour définir des attributs qui peuvent être appliqués
à une page JSP complète. Vous pouvez placer votre code pour les directives de page
n'importe où dans votre page JSP. Cependant, en général, les directives de page sont
implicites en haut de votre page JSP.
La syntaxe de base de la directive page est : <%@ page attribute = "attribute_value" %>
Les attributs utilisés par les directives Page sont :
•buffer : l'attribut Buffer définit la taille du tampon en Ko pour contrôler la sortie de
la page JSP.
•contentType : L'attribut ContentType définit le MIME (Multipurpose Internet Mail Extension)
du document dans l'en-tête de réponse HTTP.
•autoFlush : L'attribut autofill contrôle le comportement du tampon de sortie du servlet.
Il surveille la sortie du tampon et spécifie si la sortie du tampon rempli doit être vidée
automatiquement ou si une exception doit être déclenchée pour indiquer un débordement
de tampon.
•errorPage : La définition de l'attribut "ErrorPage" est la bonne façon de gérer les erreurs
JSP.
June Si une
2, 2023 exception se produit sur la page en cours,
@joska,chef elle sera redirigée vers la page d'erreur. 114
de travaux
CHAP 3:Client/serveur:
3tiers (JSP)
Directive JSP
extend : attribut d'extension utilisé pour spécifier une superclasse qui indique si la
servlet générée doit s'étendre ou non.
import : L'attribut import est utilisé pour spécifier une liste de packages ou de
classes utilisés dans le code JSP, tout comme l'instruction import de Java le fait dans
un code Java.
isErrorPage : Cet attribut "isErrorPage" de la directive Page est utilisé pour
spécifier que la page courante peut être affichée comme une page d'erreur.
info : cet attribut "info" définit les informations de la page JSP, qui sont ensuite
obtenues à l'aide de la méthode getServletInfo() de l'interface servlet.
isThreadSafe : la servlet et la JSP sont multithread. Si vous souhaitez contrôler le
comportement de la page JSP et définir le modèle de threading, vous pouvez utiliser
l'attribut "isThreadSafe" de la directive page.
June 2, 2023 @joska,chef de travaux 115
CHAP 3:Client/serveur:
3tiers (JSP)
Directive JSP
Language : L'attribut language spécifie le langage de programmation utilisé dans la page
JSP. La valeur par défaut de l'attribut de langue est "Java".
Session : dans JSP, l'attribut de session de la directive de page spécifie si la page JSP actuelle
participe à la session HTTP actuelle.
isELIgnored : Cet attribut isELIgnored est utilisé pour spécifier si le langage d'expression
(EL) impliqué par la page JSP sera ignoré.
isScriptingEnabled : cet attribut "isScriptingEnabled" détermine si les éléments de script
sont autorisés ou non à être utilisés
June 2, 2023 @joska,chef de travaux 116
CHAP 3:Client/serveur:
3tiers (JSP)
Directive JSP
JSP extends:Pour heritage d’une classe fille de la classe mere
<%@ page language = “java” contentType = “text/html” pageEncoding = “ISO-8859-1” %>
<%@ extends = “[Link]”%>
June 2, 2023 @joska,chef de travaux 117
CHAP 3:Client/serveur:
3tiers (JSP)
Directive JSP
JSP import:Pour l’ importation d’une bibliotheque ou d’un package ou d’une classe
<%@ page import="[Link].*" %>
<%@ page import="[Link].*" %>
<%@ page import="[Link].*" %>
<%@ page import=“value” %>
<%@ page import="[Link].*,[Link].*,[Link].*" %>
June 2, 2023 @joska,chef de travaux 118
CHAP 3:Client/serveur:
3tiers (JSP)
Directive JSP
JSP session:Pourla gestion des sessions utilisateurs(true,false)
<%@ page session= “true/false” %>
<%@ page language=“java” contentType = “text/html;
charset=ISO-8859-1” pageEncoding = “ISO-8859-1” session=
“false”%>
June 2, 2023 @joska,chef de travaux 119
CHAP 3:Client/serveur:
3tiers (JSP)
Inclure la directive
La "directive include" JSP est utilisée pour inclure un fichier dans un autre fichier JSP.
Cela inclut les fichiers HTML, JSP, texte et autres. Cette directive est également
utilisée pour créer des modèles selon les exigences du développeur et sépare les
pages dans l'en-tête, le pied de page et la barre latérale.
Pour utiliser cette directive Include, vous devez l'écrire comme suit : <%@ include file = "relative url" >
<%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding =
"ISO-8859-1"%>
<%@ include file="directive_header_code.jsp" %>
<!DOCTYPE html>
<html>
<head> <meta http-equiv="Content-Type" content="text/html; charset=ISO-8859-1" />
<title>Include Directive Example</title> </head>
<body>
<p>This file includes a header file named directive_header_code.jsp</p>
</body>
</html>
June 2, 2023 @joska,chef de travaux 120
CHAP 3:Client/serveur:
3tiers (JSP)
TagLib
La directive JSP taglib est implémentée pour définir une bibliothèque de balises avec
"taglib" comme préfixe. Les sections de balises personnalisées de JSP utilisent taglib.
La directive taglib de JSP est utilisée comme bibliothèque de balises standard.
Pour implémenter taglib, vous devez l'écrire comme ceci :
<%@ taglib uri="uri" prefix="value"%>
June 2, 2023 @joska,chef de travaux 121
CHAP 3:Client/serveur:
3tiers (JSP)
LES ACTIONS EN JSP
Il est nécessaire de contrôler le comportement du moteur de servlet, qui peut être
contrôlé dynamiquement en insérant le fichier en réutilisant les composants
JavaBeans ou en redirigeant ou renvoyant l'utilisateur vers une autre page, c'est-à-
dire en renvoyant la requête vers une autre ressource, qui sera éventuellement un
JSP, HTML ou autres ressources. Dans ce chapitre, vous découvrirez le concept
d'action et les balises d'action qui permettent cette transmission pour le
traitement.
June 2, 2023 @joska,chef de travaux 122
CHAP 3:Client/serveur:
3tiers (JSP)
BALISE D’ACTION
La spécification JSP fournit une balise standard appelée balise d'action utilisée dans le
code JSP et est utilisée pour supprimer ou éliminer le code Scriptlet de votre code
JSP car les Scriptlets JSP sont obsolètes et ne sont pas pris en compte de nos jours.
Il existe de nombreuses balises ou éléments d'action JSP, et chacun d'eux a ses
propres utilisations et caractéristiques. Chaque balise d'action JSP est implémentée
pour effectuer des tâches précises. La balise d'action est également implémentée
pour rationaliser le flux entre les pages et pour utiliser un bean Java. Comme il
coïncide avec le standard XML, la syntaxe de l'élément action est :
June 2, 2023 @joska,chef de travaux 123
CHAP 3:Client/serveur:
3tiers (JSP)
BALISE D’ACTION
jsp:forward : est utilisé pour transmettre la requête et la réponse à d'autres ressources.
jsp:include : est utilisé pour inclure une autre ressource.
jsp:body : est utilisé pour définir le corps de l'élément XML défini dynamiquement.
jsp:useBean : est utilisé pour créer ou localiser des objets bean.
jsp:setProperty : est utilisé pour définir la valeur de la propriété dans l'objet bean.
jsp:getProperty : est utilisé pour afficher la valeur de la propriété du bean.
jsp:element : est utilisé pour définir dynamiquement des éléments XML.
jsp:plugin : est utilisé pour intégrer d'autres composants (applets).
jsp:param : est utilisé pour définir le paramètre pour la valeur (forward ou include).
jsp:text : est utilisé pour écrire du texte de modèle dans les pages et les documents JSP.
jsp:fallback : est utilisé pour afficher le message si les plugins fonctionnent.
jsp:attribute : est utilisé pour définir les attributs d'un élément XML défini dynamiquement.
June 2, 2023 @joska,chef de travaux 124
CHAP 3:Client/serveur:
3tiers (JSP)
LES ATTRIBUTS DE BASE DE BALISE D’ACTION
Deux attributs de base sont couramment utilisés pour toutes les balises d'action. Ceux-ci sont:
id : l'attribut id définit des éléments d'action uniques et permet de référencer des actions dans
la page JSP. Lorsque l'action crée l'instance d'un objet, l'attribut id est utilisé pour s'y référer.
Scope : L'attribut scope est utilisé pour identifier le cycle de vie d'une action. Il est en
corrélation avec l'attribut id car l'attribut scope est utilisé pour établir la durée de vie de cet
objet particulier associé à l'ID.
Ici, la syntaxe et la mise en œuvre de certaines actions sont décrites ci-dessous :
June 2, 2023 @joska,chef de travaux 125
CHAP 3:Client/serveur:
3tiers (JSP)
LES ATTRIBUTS DE BASE DE BALISE D’ACTION
Deux attributs de base sont couramment utilisés pour toutes les balises d'action. Ceux-ci sont:
id : l'attribut id définit des éléments d'action uniques et permet de référencer des actions dans
la page JSP. Lorsque l'action crée l'instance d'un objet, l'attribut id est utilisé pour s'y référer.
Scope : L'attribut scope est utilisé pour identifier le cycle de vie d'une action. Il est en
corrélation avec l'attribut id car l'attribut scope est utilisé pour établir la durée de vie de cet
objet particulier associé à l'ID.
Ici, la syntaxe et la mise en œuvre de certaines actions sont décrites ci-dessous :
June 2, 2023 @joska,chef de travaux 126
CHAP 3:Client/serveur:
3tiers (JSP)
JSP:inclure l’action
Cette "action d'inclusion" vous permet d'inclure une autre ressource dans la page en cours de
génération
Synthaxe: <jsp:include page="page URL" flush="true/false">
Example:
[Link]
<html>
<head> <title>JSP Actions</title> </head>
<body>
<h3>--DataFlair--</h3>
<jsp:include page="[Link]" flush="true" />
</body> </html>
[Link]
<html>
<head> <title>JSP Actions</title> </head>
<body> <p> Today's date: <%= (new [Link]()).toLocaleString()%>
</p> </body>
</html>
June 2, 2023 @joska,chef de travaux 127
CHAP 3:Client/serveur:
3tiers (JSP)
JSP:inclure de transfert
Cette "action de transfert" termine la page en cours et vous permet de transférer la demande à
d'autres ressources.
Synthaxe: <jsp:forward page = "URL of another static, JSP, OR Servlet page" />
[Link]
<html>
<head> <title>JSP Forward</title> </head>
<body> <a>I was the requested page but forwarded the request to other</a>
<jsp:forward page="[Link]" />
</body>
</html>
[Link]
<html>
<title>JSP Forward 2</title>
<h3>DataFlair</h3> </head>
<body> <a>I am the other page where request is forwarded
.</a> </body>
</html>
Il est à noter que ce fichier JSP et le fichier forward_eg.jsp
doivent résider dans le même répertoire pour
June 2, 2023
le faire fonctionner.
@joska,chef de travaux 128
CHAP 3:Client/serveur:
3tiers (JSP)
JSP:param Action
Cette "action param" est utilisée pour définir le paramètre pour la valeur (forward ou include).
Synthaxe: <jsp: param name = "param_name" value = "value_of_parameter" />
<!DOCTYPE html>
<html>
<head> <title>Example of param Action</title> </head>
<body>
<h2>JSP page: Param with forward</h2>
<jsp:forward page="forward_eg.jsp">
<jsp:param name="date" value="06-09-2019" />
<jsp:param name="time" value="10:30PM" />
<jsp:param name="data" value="GKR" />
</jsp:forward> </body>
</html>
June 2, 2023 @joska,chef de travaux 129
CHAP 3:Client/serveur:
3tiers (JSP)
JSP: Action UseBean
Cette "action useBean": est utilisée pour créer ou localiser des objets beanSynthaxe:
<jsp: useBean id="unique_name_to_identify_bean" class="package_name.class_name" />
package samplePackageName; <!DOCTYPE html>
public class Teacher <html>
{ <head> <title>JSP Page for showing use of useBean
public Teacher() {} action</title> </head>
private String t_name; private int deptno; <body>
public void setName(String t_name) <h2>UseBean Action</h2>
{ this.t_name = t_name; } <jsp:useBean id="teacher"
public String getName() class="[Link]" />
{ return t_name; } <jsp:setProperty name="teacher" property="*" />
public void setDept(int deptno) <h2> name:<jsp:getProperty name="teacher"
{ [Link] = deptno; } property="t_name" />
public int getDept() <br /> empno:<jsp:getProperty name="teacher"
{ return deptno; } property="dept" />
} <br /> </h2>
</body> </html>
June 2, 2023 @joska,chef de travaux 130
CHAP 3:Client/serveur:
3tiers (JSP)
ACTIVITE: Créons une application avec JSP
permettant d’enregistrer des informations dans
la base de données Mysql utilisant
l’architecture mvc
June 2, 2023 @joska,chef de travaux 131
CHAP 3:Client/serveur:
3tiers (JSP)
ACTIVITE: bd
CREATE TABLE utilisateur (
id int(11) NOT NULL,
nom` varchar(20) NOT NULL,
passwor varchar(20) NOT NULL,
genre varchar(20) NOT NULL,
pays varchar(20) NOT NULL)
June 2, 2023 @joska,chef de travaux 132
CHAP 3:Client/serveur:
3tiers (JSP)
ACTIVITE: creation projet dans Netbeans
June 2, 2023 @joska,chef de travaux 133
CHAP 3:Client/serveur:
3tiers (JSP)
ACTIVITE: architecture projet
June 2, 2023 @joska,chef de travaux 134
CHAP 3:Client/serveur:
3tiers (JSP)
ACTIVITE: modele Utilisateur
public class Utilisateur {
private int id;
private String nom,passwor,genre,pays;
public Utilisateur() {
}
public Utilisateur(int id, String nom, String passwor, String genre, String pays) {
[Link] = id;
[Link] = nom;
[Link] = passwor;
[Link] = genre;
[Link] = pays;
}
public int getId() {
return id;
}
public String getNom() {
return nom;
}
public String getPasswor() {
return passwor;
}
June 2, 2023 @joska,chef de travaux 135
CHAP 3:Client/serveur:
3tiers (JSP)
ACTIVITE: modele Utilisateur(suite)
public String getGenre() {
return genre;
}
public String getPays() {
return pays;
}
public void setId(int id) {
[Link] = id;
}
public void setNom(String nom) {
[Link] = nom;
}
public void setPasswor(String passwor) {
[Link] = passwor;
}
public void setGenre(String genre) {
[Link] = genre;
}
public void setPays(String pays) {
[Link] = pays; }
}
June 2, 2023 @joska,chef de travaux 136
CHAP 3:Client/serveur:
3tiers (JSP)
ACTIVITE: Controlleur Utilisateur(connexion)
import [Link].*;
import [Link];
import static [Link];
import [Link];
import [Link];
public class Controlleur_utilisateur {
// la fonction de connectyion a la base de donnee
public static Connection getConnection(){
Connection con=null;
try {
[Link]("[Link]");
con=[Link]("jdbc:mysql://localhost:3306/gestion_user","root","");
} catch (Exception e) {
[Link](e);
}
return con;
}
June 2, 2023 @joska,chef de travaux 137
CHAP 3:Client/serveur:
3tiers (JSP)
ACTIVITE: Controlleur Utilisateur(fonction d’insertion)
public static int save(Utilisateur u){
int status=0;
try {
Connection con=getConnection();
PreparedStatement ps=[Link]("INSERT INTO utilisateur (nom,passwor,genre,pays)
VALUES (?,?,?,?)");
[Link](1,[Link]());
[Link](2,[Link]());
[Link](3,[Link]());
[Link](4,[Link]());
status=[Link]();
}catch(Exception e){
[Link](e);}
return status;
}
June 2, 2023 @joska,chef de travaux 138
CHAP 3:Client/serveur:
3tiers (JSP)
ACTIVITE: Controlleur Utilisateur(fonction de modification)
public static int update(Utilisateur u){
int status=0;
try {
Connection con=getConnection();
PreparedStatement ps=[Link]("update utilisateur set
nom=?,passwor=?,genre=?,pays=? where id=?");
[Link](1,[Link]());
[Link](2,[Link]());
[Link](3,[Link]());
[Link](4,[Link]());
[Link](5,[Link]());
status=[Link]();
}catch(Exception e){
[Link](e);}
return status;
}
June 2, 2023 @joska,chef de travaux 139
CHAP 3:Client/serveur:
3tiers (JSP)
ACTIVITE: Controlleur Utilisateur(fonction de supression)
public static int delete(int id){
int status=0;
try {
Connection con=getConnection();
PreparedStatement ps=[Link]("delete utilisateur where id=?");
[Link](1,id);
status=[Link]();
}catch(Exception e){
[Link](e);}
return status;
}
June 2, 2023 @joska,chef de travaux 140
CHAP 3:Client/serveur:
3tiers (JSP)
ACTIVITE: Controlleur Utilisateur(fonction de selection des utilisateurs)
///selectionnons tous les utilisateurs
public static List <Utilisateur> tufurayi(){
List<Utilisateur> list=new ArrayList<Utilisateur>();
try{
Connection con=getConnection();
PreparedStatement ps=[Link]("SELECT * FROM UTILISATEUR");
ResultSet rs=[Link]();
while([Link]()){
Utilisateur u=new Utilisateur();
[Link]([Link]("id"));
[Link]([Link]("nom"));
[Link]([Link]("passwor"));
[Link]([Link]("genre"));
[Link]([Link]("pays"));
[Link](u);
} }
catch(Exception e){
[Link](e);
}
return list;
}
}
June 2, 2023 @joska,chef de travaux 141
CHAP 3:Client/serveur:
3tiers (JSP)
ACTIVITE: Vue Utilisateur(la page [Link])
<html>
<head>
<title>TODO supply a title</title>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
</head>
<body> <form action="[Link]" method="post" >
<table>
<tr><td>NOM</td> <td><input type="text" name="nom"/></td> </tr>
<tr><td>PASSWORD</td> <td><input type="password" name="passwor"/></td> </tr>
<tr><td>GENRE</td> <td><input type="radio" value="genre" name="genre"/>MASCULIN
<input type="radio" value="genre" name="genre"/>FEMININ
</td> </tr>
<tr><td>PAYS</td> <td>
<select name="pays"> <option>INDE</option> <option>PAKISTAN</option>
<option>TURQUIE</option> <option>RDC</option> </select>
</td> </tr> <tr><td colspan="2"><input type="submit" value="Add User"/></td></tr>
</table>
</form
</body>
</html>
June 2, 2023 @joska,chef de travaux 142
CHAP 3:Client/serveur:
3tiers (JSP)
ACTIVITE: Vue Utilisateur(la page [Link])
<%--
Document : ajouterUtilisateur
Created on : 22 févr. 2023, [Link]
Author : josue
--%>
<%@page import="controlleur.Controlleur_utilisateur"%>
<jsp:useBean id="u" class="[Link]"></jsp:useBean>
<jsp:setProperty property="*" name="u"/>
<%
int i=Controlleur_utilisateur.save(u);
if(i>0){
[Link]("ajouterUtilisateur_reussi.jsp");
}
else{
[Link]("ajouterUtilisateur_echouer.jsp");
}
%>
June 2, 2023 @joska,chef de travaux 143
CHAP 3:Client/serveur:
3tiers (JSP)
ACTIVITE: Vue Utilisateur(la page [Link])
<%--
Document : ajouterUtilisateur
Created on : 22 févr. 2023, [Link]
Author : josue
--%>
<%@page import="controlleur.Controlleur_utilisateur"%>
<jsp:useBean id="u" class="[Link]"></jsp:useBean>
<jsp:setProperty property="*" name="u"/>
<%
int j=Controlleur_utilisateur.update(u);
if(i>0){
[Link](“modifierUtilisateur_reussi.jsp");
}
else{
[Link]("modifierUtilisateur_echouer.jsp");
}
%>
June 2, 2023 @joska,chef de travaux 144
CHAP 3:Client/serveur:
3tiers (JSP)
ACTIVITE: Vue Utilisateur(la page [Link])
<%--
Document : ajouterUtilisateur
Created on : 22 févr. 2023, [Link]
Author : josue
--%>
<%@page import="controlleur.Controlleur_utilisateur"%>
<jsp:useBean id="u" class="[Link]"></jsp:useBean>
<jsp:setProperty property="*" name="u"/>
<%
int j=Controlleur_utilisateur.delete([Link]);
if(i>0){
[Link](“modifierUtilisateur_reussi.jsp");
}
else{
[Link]("modifierUtilisateur_echouer.jsp");
}
%>
June 2, 2023 @joska,chef de travaux 145
CHAP 3:Client/serveur:
3tiers (JSP)
ACTIVITE: Vue Utilisateur(la page [Link])
<html>
<head>
<title>View Users</title>
</head>
<body>
<%@page import="controlleur.Controlleur_utilisateur,[Link],[Link].*"%>
<%@ taglib uri="[Link] prefix="c"%>
<h1>Users List</h1>
<%
List<Utilisateur> list=Controlleur_utilisateur.tufurayi();
[Link]("list",list);
%>
<table border="1" width="90%">
<tr><th>Id</th><th>Nom</th><th>Password</th><th>Genre</th>
<th>Pays</th><th>Edit</th><th>Delete</th></tr>
<c:forEach items="${list}" var="u">
<tr><td>${[Link]()}</td><td>${[Link]()}</td><td>${[Link]()}</td>
<td>${[Link]()}</td><td>${[Link]()}</td>
<td><a href="[Link]?id=${[Link]()}">Edit</a></td>
<td><a href="[Link]?id=${[Link]()}">Delete</a></td></tr>
</c:forEach>
</table>
<br/><a href="[Link]">Add New User</a>
</body>
</html>
June 2, 2023 @joska,chef de travaux 146
CHAP 3:Client/serveur:
3tiers (JSP)
ACTIVITE: Vue Utilisateur(la page ajouterUtilisateur_echouer.JSP)
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<p>enregistrement echouer</p>
<jsp:include page="[Link]" ></jsp:include>
</body>
</html>
June 2, 2023 @joska,chef de travaux 147
CHAP 3:Client/serveur:
3tiers (JSP)
ACTIVITE: Vue Utilisateur(la page ajouterUtilisateur_reussi.JSP)
<%--
Document : ajouterUtilisateur_reussi
Created on : 22 févr. 2023, [Link]
Author : josue
--%>
<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
<title>JSP Page</title>
</head>
<body>
<p>enregistrement reusi</p>
<jsp:include page="[Link]" ></jsp:include>
</body>
</html>
June 2, 2023 @joska,chef de travaux 148
CHAP 3:Client/serveur:
3tiers (JSP)
ACTIVITE:Capture lors du deployement
June 2, 2023 @joska,chef de travaux 149
CHAP 3:Client/serveur:
3tiers (JSP)
ACTIVITE:Capture
June 2, 2023 @joska,chef de travaux 150
CHAP 3:Client/serveur:
3tiers (JSP)
ACTIVITE:Capture
June 2, 2023 @joska,chef de travaux 151
CHAP 3:Client/serveur:
3tiers (JSP)
ACTIVITE:Capture
June 2, 2023 @joska,chef de travaux 152
conclusion
Nous voilà au terme de notre cours de programmation client/serveur, lequel nous a
permis de retracer un certain nombre des concepts utiles à rendre le futur étudiant en
Informatique un bon développeur en assimilant les bases et les rudiments de la logique
de programmation réseau utilisant les sockets ,une base de données partagée et une
application client/serveur (3 tiers ) utilisant un serveur d’application.
C’est ainsi que nous avons eu à parcourir 3 chapitres, lesquels, estimons être à même de
rendre le lecteur de ce cours habile quant à la programmation orientée objet utilisant
l’aspect réseau, et lui permettre de l’implémenter facilement dans un quelconque type
d’application (console,desktop,web) même si les webservices n’ ont pas été aborder
dans cet ouvrage.
C’est cette raison qui nous pousse à encourager les futurs développeurs de demain, de
passer du temps à s’exercer, et résoudre les différents exercices proposés dans ce cours
(Et pourquoi pas se documenter ailleurs) pour enrichir leurs connaissances.
June 2, 2023 @joska,chef de travaux 153
l’auteur
KALEMA JOSUE DJAMBA,
Je suis développeur depuis 2015, avec une excellente expérience
sur des projets web et mobile en environnement Java/JEE,.Net,
PhP ,Cartographie.
Assistant depuis 2017 puis chef de travaux aux Universités
depuis 2022.
Diplômé d'un master 2 de l’Université libre de Kigali et d'un diplôme
d’ingénieur en Informatique de BAC+5 a l’institut supérieur
d’informatique et de Gestion.
June 2, 2023 @joska,chef de travaux 154
l’auteur
Compétences techniques et fonctionnelles:
-LANGAGES:
Java, J2EE, Android, C, C++, Java script, HTML, CSS3, PL/SQL, Script Shell sousUnix, Secure Shell ,
WebService REST/SOAP, VBA, Assembleur8088 , PHP,
-LOGICIELS ET OUTILS:
NetBeans,Visual Studio ,Intellij idea, Eclipse, Docker, ArcGis, Android Studio, Code Blocks, WampServer, Mongo
Management Studio, DevCPP, Wireshark, Packet Tracer, Excel,,PostgreSQL
-SYSTEMES D’EXPLOITATION:
Windows 7/8.1/10, Mac OS X, GNU/Linux: Ubuntu, Android, IOS,Windows Serveur
-METHODOLOGIE:
Conception objet, UML 2.0, Design pattern, Modèle MVC, architecture client server ,Merise, Cycle en V, Agile,.
-BASES DE DONNEES:
PostgreSQL,Oracle Database 10g, MySQL, MongoDB,
-Framework:
Spring MVC, Spring Data JPA, Spring BOOT, JSP, Bootstrap,Jasperreport,Flask,Laravel,Ajax
June 2, 2023 @joska,chef de travaux 155
Source
[Link]
[Link]
man 2 socket
[Link] FAQ socket
RFC 791 (IP), RFC 793 (TCP), RFC 768 (UDP)
Richard Stevens, UNIX Network Programming
Programmation client-serveur Python, TCP/IP, services,Manuel Munier 11/2022
"The Java Tutorial : Object Oriented Programming for the Internet"
M. Campione, K. Walrath 1977
http ://[Link]/nav/read/Tutorial
[Link]
[Link]/jsp/directives?_x_tr_sl=en&_x_tr_tl=fr&_x_tr_hl=fr&_x_tr_pto=
sc
[Link]
[Link]
June 2, 2023
View publication stats @joska,chef de travaux 156