Vous êtes sur la page 1sur 9

JSP, SERVLET, JDBC, MVC

M.Youssfi

Gestion des factures dun client


Un oprateur Tlcom propose ses clients des abonnements qui sont de deux types Abonnement GSM et Abonnement Fixe. Chaque abonnement reoit mensuellement de factures rgler. Lapplication doit tre dveloppe en respectant la sparation des couches donnes, mtier et de prsentation. La couche de donnes est reprsente par une base de donnes relationnelle. La couche mtier sera dveloppe en utilisant : o Des java-beans persistants qui sont des classes persistantes. o Une faade reprsente par la classe Operateur.java qui contient les diffrentes mthodes mtiers qui assurent la persistante et le mapping objet relationnel. La couche prsentation est une application web base sur les servlets et JSP en respectant larchitecture MVC. Dans un premier temps, nous allons nous intresser uniquement la consultation des clients. Le travail que nous allons raliser consiste afficher les clients en saisissant un mot cl qui reprsente une partie du nom du client La vue quon souhaite raliser est la suivante :

Premire partie : 1- Crer la base de donnes et saisir quelques exemples de clients. 2- Crer le modle (Couche mtier) savoir : a. Client.java : classe persistante reprsente par un java bean. b. Utilitaire.java : classe qui retourne un singleton Connection, en utilisant la mthode statique getConnection() ; c. Operateur.java : Classe non persistante qui contient une mthode qui permet de retourner un vecteur de client sachant un mot cl. d. Tester votre modle en utilisant une simple application. 3- Crer la couche prsentation en utilisant une seule page JSP : Clients1.jsp. 4- Crer une deuxime version de la couche prsentation en respectant le modle MVC.

JSP, SERVLET, JDBC, MVC

M.Youssfi

Solution de la premire partie


1- Base de donnes :

2- Modle a- Client.java
package mod.fact; public class Client { private int idClient; private String nom; private String email; private String tel; private String ville; public String getEmail() { return email; } }

public void setEmail(String email) { this.email = email; public int getIdClient() { return idClient; } public void setIdClient(int idClient) { this.idClient = idClient; } public String getNom() { return nom; } public void setNom(String nom) { public String getTel() { this.nom = nom; }

return tel;} this.tel = tel; } } }

public void setTel(String tel) {

public String getVille() { return ville;

public void setVille(String ville) { this.ville = ville; }

JSP, SERVLET, JDBC, MVC

M.Youssfi

b- Utilitaire.java
package mod.fact; import java.sql.*; public class Utilitaire { private static Connection conn; static{ try { // Pour JDBC ODBC Class.forName("sun.jdbc.odbc.JdbcOdbcDriver"); conn=DriverManager.getConnection("jdbc:odbc:dsnFact","",""); // pour Mysql Driver : //Class.forName("com.mysql.jdbc.Driver"); //conn=DriverManager.getConnection // ("jdbc:mysql://localhost:3306/NOM_BASE", "root", "" ); } catch (ClassNotFoundException e) { e.printStackTrace(); } catch (SQLException e) { e.printStackTrace(); } } public static Connection getConnection(){ return conn; } }

c- Operateur.java
package mod.fact; import java.sql.*; import java.util.*; public class Operateur { public Vector chercheClientsParMotCles(String motCle){ Vector lesClients=new Vector(); Connection conn=Utilitaire.getConnection(); try { PreparedStatement ps=conn.prepareStatement("select * from CLIENTS where NOM LIKE ?"); ps.setString(1,"%"+motCle+"%"); ResultSet rs=ps.executeQuery(); while(rs.next()){ Client c=new Client(); c.setIdClient(rs.getInt("ID_CLIENT")); c.setNom(rs.getString("NOM")); c.setEmail(rs.getString("EMAIL")); c.setTel(rs.getString("TEL")); c.setVille(rs.getString("VILLE")); lesClients.add(c); } rs.close(); ps.close(); } catch (SQLException e) { e.printStackTrace(); } return lesClients; } }

JSP, SERVLET, JDBC, MVC


3- Couche prsentation

M.Youssfi

Clients1.jsp
<%@ page language="java" %> <%@ page import="java.util.*" %> <%@ page import="mod.fact.*" %> <% String mot=request.getParameter("motCle"); if(mot==null) mot=""; Operateur op=new Operateur(); Iterator itCli=op.chercheClientsParMotCles(mot).iterator(); %> <html> <head> <title>Clients</title> </head> <body bgcolor="#FFFFFF"> <center> <form method="post" action="Clients1.jsp"> Client:<input type="text" name="motCle" value="<%=mot%>"> <input name="chercher" type="submit" id="chercher" value="Chercher"> </form>

<table width="80%" border="1"> <tr> <th scope="col">ID Client </th> <th scope="col">NOM</th> <th scope="col">EMAIL</th> <th scope="col">TEL</th> <th scope="col">VILLE</th> </tr> <% while(itCli.hasNext()){ Client cli=(Client)itCli.next(); %> <tr> <td><%=cli.getIdClient()%></td> <td><%=cli.getNom()%></td> <td><%=cli.getEmail()%></td> <td><%=cli.getTel()%></td> <td><%=cli.getVille()%></td> </tr> <%} %> </table> </center> </body> </html>

JSP, SERVLET, JDBC, MVC

M.Youssfi

4- Respecter le modle MVC La page JSP que lon vient de faire fonctionne parfaitement, mais on peut constater quelle soccupe de beaucoup de choses : 1- Rcuprer les donnes de la requte 2- Valider si les donnes on t bien saisies 3- Faire appel au modle pour rcuprer le rsultat. 4- Afficher les rsultats. Il ne faut pas oublier que les pages JSP on t crer simplifier la tache du web designer ; ce qui fait que, dans la pratique, les pages JSP se limitent laffichages uniquement. Cela veut dire que les points 1, 2 et 3 doivent tre dlgus un autre composant. Ce dernier nest autre quune servlet quon appelle le contrleur. Si lon dveloppe de cette manire, nous respectons ce que lon appelle le modle MVC : Modle : reprsente la couche mtier et soccupe des traitements. Dans cette partie, on peut utiliser soit les java-beans, ce qui reprsente notre cas, ou les EJB qui sont des composants distribus qui doivent sexcuter au sein dun serveur dapplication J2EE Contrleur : reprsent par une servlet dont le rle est de : o Rcuprer les donnes de ces requtes, o Stocker ces donnes dans un objet intermdiaire associ la requte et appel form bean (bean de formulaire) o Sassurer de la validation de ces donnes. o Faire appel au modle, qui se charge du traitement, en lui transmettant les donnes de la requte. o Rcuprer les rsultats ventuels retourns par le modle. o Stocker ces rsultats dans le form bean o Faire une redirection vers une page JSP qui va se charger de laffichage de la des rsultats relatif la rponse http. Vues : sont implmentes par les pages JSP. Une page JSP se charge de : o Rcuprer les donnes des rsultats stocks, pralablement par le contrleur, dans le form bean. o Afficher dynamiquement la page HTML en se basant sur les rsultats rcuprs. Une reprsentation graphique du modle MVC peut tre la suivante :

Serveur Client
Navigateur : Aperu de la vue

Rep 6

Vue JSP
Form Bean

JDBC
3

SGBD

Req1

Modle
4

Java beans ou EJB


2

Contrleur Une servlet

JSP, SERVLET, JDBC, MVC Reviennent notre problme notre page JSP sera divise en trois parties : Le form bean : ClientForm.java Le contrleur : ControleurServlet.java La vue : Client2.jsp

M.Youssfi

a- Form Bean : ClientForm.java Daprs la requte, Les donnes envoyes par le client se limitent la valeur de motCles Les rsultats afficher est un vecteur de clients. Le code java du form bean est le suivant :

package form.beans; import java.util.Vector; public class ClientForm { private String motCle=""; private Vector lesClients=new Vector(); public Vector getLesClients() { return lesClients; } public void setLesClients(Vector lesClients) { this.lesClients = lesClients; } public String getMotCle() { return motCle; } public void setMotCle(String motCle) { this.motCle = motCle; } }

b- Contrleur : ControleurServlet.java
import java.io.IOException; import java.util.*; import javax.servlet.*; import javax.servlet.http.*; import form.beans.ClientForm; import mod.fact.Operateur; public class ControleurServlet extends HttpServlet { public void dopost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { doGet(request,response); } public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {

JSP, SERVLET, JDBC, MVC

M.Youssfi

// Crer le form bean pour stocker les donnes de la requte // et galement les rsultats afficher. ClientForm cf=new ClientForm(); // rcuprer les donnes de la requte String mot=request.getParameter("motCle"); if(mot==null) mot=""; // stocker les donnes de la reqte dans le form bean cf.setMotCle(mot); //Rcuprer le rsultatde la couche mtier // en lui transmettant le mot cl Operateur op=new Operateur(); Vector clients=op.chercheClientsParMotCles(cf.getMotCle()); // Stocker le rsultat dans le form bean cf.setLesClients(clients); // stocker le form bean dans la session courante HttpSession session=request.getSession(); session.setAttribute("cf",cf); // rediriger vers la vue pour afficher response.sendRedirect("Clients2.jsp"); } }

Descripteur de dploiement : web.xml


<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE web-app PUBLIC "-//Sun Microsystems, Inc.//DTD Web Application 2.3//EN" "http://java.sun.com/dtd/web-app_2_3.dtd"> <web-app> <servlet> <servlet-name>cs</servlet-name> <servlet-class>ControleurServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>cs</servlet-name> <url-pattern>/clients</url-pattern> </servlet-mapping> </web-app>

d- La vue : Clients2.jsp
<%@ page language="java" %> <%@ page import="java.util.*" %> <%@ page import="mod.fact.*" %> <%@ page import="form.beans.*" %> <% ClientForm cf=(ClientForm)session.getAttribute("cf"); if(cf==null) cf=new ClientForm(); Iterator itCli=cf.getLesClients().iterator(); %> <html> <head> <title>Clients</title> </head>

JSP, SERVLET, JDBC, MVC


<body bgcolor="#FFFFFF"> <center> <form method="post" action="clients"> Client:<input type="text" name="motCle" value="<%=cf.getMotCle()%>"> <input name="chercher" type="submit" id="chercher" value="Chercher"> </form>

M.Youssfi

<table width="80%" border="1"> <tr> <td>ID Client </td> <td>NOM</td> <td>EMAIL</td> <td>TEL</td> <td>VILLE</td> </tr> <% while(itCli.hasNext()){ Client cli=(Client)itCli.next(); %> <tr> <td><%=cli.getIdClient()%></td> <td><%=cli.getNom()%></td> <td><%=cli.getEmail()%></td> <td><%=cli.getTel()%></td> <td><%=cli.getVille()%></td> </tr> <%} %> </table> </center> </body> </html>

JSP, SERVLET, JDBC, MVC

M.Youssfi

Deuxime Partie
Un abonnement est dfini par : - Le numro dabonnement - Le nom de labonnement - Date dabonnement - Le solde de labonnement qui reprsente le montant qui reste consommer de cet abonnement. - Le propritaire de cet abonnement reprsent par un attribut de type Client. Un abonnement GSM est un abonnement qui contient en plus - Le nombre de points fidlo qui reprsente des points obtenus en fonction du montant consomm. Un abonnement FIXE est abonnement qui est caractris par Un dbit Une facture est caractrise par : Le numro de facture Date facture Montant de facture Une proprit qui indique si la facture est rgle ou non Travail demand : 1. Etablir un diagramme de classe complet 2. Crer la base de donnes correspondante ce diagramme de classes 3. Complter la couche mtier : a. Crer les classes Facture, Abonnement, AbFixe et AbGSM b. Ajouter la classe Operateur les mthodes suivantes : i. Une mthode qui permet retourner un objet de type Abonnement sachant son numro, en chargeant dans cet objet Abonnement son propritaire ainsi que toutes les factures. ii. Une mthode qui permet dajouter un nouveau client. iii. Une mthode qui permet de rgler une facture sachant son numro. c. Tester nouveau le modle 4. Crer une application web en utilisant STRUTS qui permet lutilisateur de : a. Saisir le numro dabonnement dans un formulaire b. En validant, afficher, dans la mme page, i. Les caractristiques de cet abonnement ii. Le nom du propritaire de cet abonnement iii. La liste des factures de cet abonnement, en affichant une case cocher qui devrait permettre de rgler une facture.