Académique Documents
Professionnel Documents
Culture Documents
net/publication/371226170
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.
INSTITUT SUPERIEUR DE
COMMERCE/ GOMA
Module adapté aux étudiants de Deuxième Année de Licence en Science et
technologie ( Mention:Informatique de Gestion)
CLIENT/SERVEUR
LES SOCKETS
CLIENT/SERVEUR 2TIERS
CLIENT/SERVEUR 3TIERS
15% PRESENCE
45% TP
40% EXAMEN PRATIQUE
polymorphisme,surcharge)
SQL
HTML,CSS
Adressage IP v4
Systèmes transactionnels(transaction )
Systèmes de messagerie
etc.
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
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
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.
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).
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.
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, ...)
Les classes et interfaces utiles au développement réseau sont regroupés dans le package java.net.
Pour faciliter la compréhension humaine, un serveur particulier appelé DNS (Domaine Name Service) est capable
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 :
resultat
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
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
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
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
} catch (Exception e) { }
June 2, 2023 @joska,chef de travaux 47
CHAP 2:les Sockets
PARTIE CLIENT:
package serveurchat;
import java.io.*;
import java.net.*;
public class Client_chat extends javax.swing.JFrame {
static Socket s;
static DataInputStream din;
static DataOutput dout;
///BUTON ENVOYER////
try{
String msgout="";
msgout=jTextField1.getText().trim();
dout.writeUTF(msgout);}
catch(Exception e){}
///////////DANS LE CONTRUCTEUR ////////////////////////
try{
s=new Socket("127.0.0.1", 1200);
din=new DataInputStream(s.getInputStream());
dout=new DataOutputStream(s.getOutputStream());
String msgin="";
while(!msgin.equals("exit")){
msgin=din.readUTF();
jTextArea1.setText(jTextArea1.getText().trim()+"\n Serveur:\t"+msgin );
}}
catch(Exception e){
}
nombres entrer au clavier par l’utilisateur puis le serveur additionne ces 2 nombres
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
Pour commencer, je pense qu'un petit rappel sur le fonctionnement des bases de données s'impose.
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
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
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
MySQL ;
SQL Server ;
Oracle ;
d'autres bases.
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.
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 :
try {
Class.forName("org.postgresql.Driver");
passwd);
System.out.println("\n**********************************");
System.out.print("\t" +
System.out.println("\n**********************************");
while(result.next()){
System.out.print("\t" + result.getObject(i).toString() +
"\t |");
System.out.println("\n---------------------------------");
result.close();
e.printStackTrace(); }}}
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.
ensuite, c'est demander à mon objet Statement d'exécuter une requête SQL de type SELECT : SELECT * FROM classe.
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 nom de la table à laquelle appartient la colonne (dans le cas d'une jointure de tables) ;
etc.
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.
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.
CONCUR_READONLY : les données sont consultables en lecture seule, c'est-à-dire que l'on ne peut modifier des valeurs
CONCUR_UPDATABLE : les données sont modifiables ; lors d'une modification, la base est mise à jour.
Code : Java
Code : Java
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 !
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.
} catch (Exception e) {
e.printStackTrace();
}
return con;
}
return status;
}
status= ps.executeUpdate();
} catch (Exception e) {
}
return status;
}
}
return status;
}
void charger(){
joska.chagertable(user);
jTable1.setModel(user.getModel());
}
if(!jTextField1.getText().equals("")){
if(joska.deleteUtilisateur(Integer.parseInt(jTextField1.getText()))>0)
{
JOptionPane.showMessageDialog(null,"suppression reussi");
charger();
}}else{
JOptionPane.showMessageDialog(null,"Veuillez completer le champ !");
}
jTextField1.setText(jTable1.getValueAt(jTable1.getSelectedRow(),0).toString());
jTextField2.setText(jTable1.getValueAt(jTable1.getSelectedRow(),1).toString());
jTextField3.setText(jTable1.getValueAt(jTable1.getSelectedRow(),2).toString());
jPasswordField1.setText(jTable1.getValueAt(jTable1.getSelectedRow(),3).toStri
ng());
jComboBox1.setSelectedItem(jTable1.getValueAt(jTable1.getSelectedRow(),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”)
joska.complete(user, jTextField5.getText());
jTable1.setModel(user.getModel());
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.
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
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
<!DOCTYPE html>
<html>
<body>
<%! int variable_value=62; %>
<%= " Your integer data is :"+ variable_value %>
</body>
</html>
Synthaxe:
<!DOCTYPE html>
<html>
<head> <title>Scriptlet Tag</title> </head>
<% int count = 2; %>
<body>
Calculated page count <% out.println(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>
<!DOCTYPE html>
<html>
<body> <%= "A JSP based string" %>
</body>
</html>
<!DOCTYPE html>
<html>
<body> <%= "A JSP based string" %>
</body>
</html>
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.
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.
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é.
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.
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.
Example:
main.jsp
<html>
<head> <title>JSP Actions</title> </head>
<body>
<h3>--DataFlair--</h3>
<jsp:include page="date.jsp" flush="true" />
</body> </html>
date.jsp
<html>
<head> <title>JSP Actions</title> </head>
<body> <p> Today's date: <%= (new java.util.Date()).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" />
Forward.jsp
<html>
<head> <title>JSP Forward</title> </head>
<body> <a>I was the requested page but forwarded the request to other</a>
<jsp:forward page="other.jsp" />
</body>
</html>
Other.jsp
<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).
<!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>
} catch (Exception e) {
System.out.print(e);
}
return con;
}
}catch(Exception e){
System.out.println(e);}
return status;
}
}catch(Exception e){
System.out.println(e);}
return status;
}
status=ps.executeUpdate();
}catch(Exception e){
System.out.println(e);}
return status;
}
<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="ajouterUtilisateur.jsp" 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>
<%--
Document : ajouterUtilisateur
Created on : 22 févr. 2023, 11:19:09
Author : josue
--%>
<%@page import="controlleur.Controlleur_utilisateur"%>
<jsp:useBean id="u" class="model.Utilisateur"></jsp:useBean>
<jsp:setProperty property="*" name="u"/>
<%
int i=Controlleur_utilisateur.save(u);
if(i>0){
response.sendRedirect("ajouterUtilisateur_reussi.jsp");
}
else{
response.sendRedirect("ajouterUtilisateur_echouer.jsp");
}
%>
<%--
Document : ajouterUtilisateur
Created on : 22 févr. 2023, 11:19:09
Author : josue
--%>
<%@page import="controlleur.Controlleur_utilisateur"%>
<jsp:useBean id="u" class="model.Utilisateur"></jsp:useBean>
<jsp:setProperty property="*" name="u"/>
<%
int j=Controlleur_utilisateur.update(u);
if(i>0){
response.sendRedirect(“modifierUtilisateur_reussi.jsp");
}
else{
response.sendRedirect("modifierUtilisateur_echouer.jsp");
}
%>
<%--
Document : ajouterUtilisateur
Created on : 22 févr. 2023, 11:19:09
Author : josue
--%>
<%@page import="controlleur.Controlleur_utilisateur"%>
<jsp:useBean id="u" class="model.Utilisateur"></jsp:useBean>
<jsp:setProperty property="*" name="u"/>
<%
int j=Controlleur_utilisateur.delete(u.getId);
if(i>0){
response.sendRedirect(“modifierUtilisateur_reussi.jsp");
}
else{
response.sendRedirect("modifierUtilisateur_echouer.jsp");
}
%>
<html>
<head>
<title>View Users</title>
</head>
<body>
<%@page import="controlleur.Controlleur_utilisateur,model.Utilisateur,java.util.*"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c"%>
<h1>Users List</h1>
<%
List<Utilisateur> list=Controlleur_utilisateur.tufurayi();
request.setAttribute("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>${u.getId()}</td><td>${u.getNom()}</td><td>${u.getPasswor()}</td>
<td>${u.getGenre()}</td><td>${u.getPays()}</td>
<td><a href="editform.jsp?id=${u.getId()}">Edit</a></td>
<td><a href="deleteuser.jsp?id=${u.getId()}">Delete</a></td></tr>
</c:forEach>
</table>
<br/><a href="adduserform.jsp">Add New User</a>
</body>
</html>
<%--
Document : ajouterUtilisateur_reussi
Created on : 22 févr. 2023, 11:29:02
Author : josue
--%>
<p>enregistrement reusi</p>
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
View publication stats @joska,chef de travaux 156