Projet JAVA Java TP 15-04-10

Embed Size (px)

Citation preview

JSP, SERVLET, JDBC, MVC

Marzouk

Gestion des factures dun clientUn 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.

1

JSP, SERVLET, JDBC, MVC

Marzouk

Solution de la premire partie1- Base de donnes :

2- Modle a- Client.javapackage 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;

2

JSP, SERVLET, JDBC, MVC

Marzouk

b- Utilitaire.javapackage 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.javapackage 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; } }

3

JSP, SERVLET, JDBC, MVC 3- Crer Une classe Test avec la mthode main qui permet de tester la couche mtier.package pres; import java.io.*; import java.util.Iterator; import mod.fact.*; public class TestOp {

Marzouk

public static void main(String[] args) throws IOException { BufferedReader clavier=new BufferedReader(new InputStreamReader(System.in)); System.out.print("Mot cl:"); String mot=clavier.readLine(); Operateur op=new Operateur(); Iterator it=op.getClients(mot).iterator(); while(it.hasNext()){ Client cl=(Client)it.next(); System.out.println(cl.getNom()); } } }

4

JSP, SERVLET, JDBC, MVC

Marzouk

4- Couche prsentation web : Une simple page JSP Clients1.jsp Clients Client: ID Client NOM EMAIL TEL VILLE

5

JSP, SERVLET, JDBC, MVC

Marzouk

5- 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 :

Navigateur : Aperu de la vue

Client

ServeurRep 6 1 Req

Vue JSPForm Bean

JDBC3

SGBD

5

Modle4

Java beans ou EJB2

Contrleur Une servlet

6

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

Marzouk

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.javaimport 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 {

7

JSP, SERVLET, JDBC, MVC

Marzouk

// 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 cs ControleurServlet cs /clients

d- La vue : Clients2.jsp Clients

8

JSP, SERVLET, JDBC, MVC

Marzouk

Client: ID Client NOM EMAIL TEL VILLE

9

JSP, SERVLET, JDBC, MVC

Marzouk

Deuxime PartieUn 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.

10