Vous êtes sur la page 1sur 28

Formation MVC

TP : Implémentation du MVC Web 3-tier avec Java, Jsp et Servlet


Date : 12/06/2009

Par : M. Abbou

I-Objectif du TP

L’objectif de ce TP est de vous montrer comment implémenter le modèle MVC II avec Java, JSP et
les Servlets pour une architecture 3-tier.

Vous allez apprendre comment :

Définir le contrôleur ;
Définir les vues ;
Définir le modèle. Ce dernier est composé de la couche métier et la couche DAO ;
Implémenter la couche DAO en utilisant une liste statique ;
Implémenter la couche DAO en utilisant l’API JDBC ;
Traiter les requêtes émanant des utilisateurs ;
Le contrôleur décide du choix de la vue à afficher ;
Le contrôleur fournit le modèle à la vue pour qu’il soit présenté par cette dernière ;
La couche présentation est indépendante de la couche métier ;
Tester les vues indépendamment du Modèle et du Contrôleur.

II- Introduction
L’application web que nous allons développer va permettre de gérer un groupe de personnes avec
quatre opérations :

Afficher la liste des personnes du groupe ;


Ajouter une personne au groupe ;
Modifier une personne du groupe ;
Supprimer une personne du groupe.

Les personnes seront stockées dans une base de données.


Nous allons développer deux versions de cette application :

Dans la version 1, la couche [dao] n’utilisera pas de base de données. Les personnes du
groupe seront stockées dans un simple objet [ArrayList] géré en interne par la couche [dao].
Cela permettra de tester l’application sans contrainte de base de données.

Formation MVC : TP2 1


Dans la version 2, nous placerons le groupe de personnes dans une table de base de
données. Nous montrerons que cela se fera sans impact sur la couche web de la version 1
qui restera inchangée. (parmi les points forts du MVC)

III- Réalisation du projet


1. Architecture de l’application

La couche [présentation] est contenue dans le paquetage


ma.emsi.formation.mvc.presentation

La couche métier est contenue dans le paquetage ma.emsi.formation.mvc.service

La couche dao est contenue dans le paquetage ma.emsi.formation.mvc.dao

Le pacquage ma.emsi.formation.mvc.tests contient les tests Junit des couches [dao]


et [service].

2. Création du projet web (Dynamique Web Project) mvc2


Dans Eclipse, créer un nouveau projet web.

Cliquer ensuite sur « Next ». La fenêtre suivante est affichée :

Formation MVC : TP2 2


Cliquer sur « Next ». La fenêtre suivante est affichée :

Cliquer ensuite sur « Finish ». L’arborescence suivante est crée :

Formation MVC : TP2 3


3. Création des packages comme suit :

4. Couche Métier (ou Service)

a. Dans le package ma.emsi.formation.mvc.service, créer la classe


personne.java, comme le montre la fenêtre suivante :

b. Le contenu de la classe Personne.java est le suivant :

package service;

import java.text.SimpleDateFormat;
import java.util.Date;

public class Personne {


private int id;// identifiant unique de la personne
private String nom;
private String prenom;
private Date dateNaissance;
private boolean marie = false;
private int nbEnfants;// le nombre d'enfants

public Personne(int id, String prenom, String nom, Date


dateNaissance,
boolean marie, int nbEnfants) {

Formation MVC : TP2 4


setId(id);
setNom(nom);
setPrenom(prenom);
setDateNaissance(dateNaissance);
setMarie(marie);
setNbEnfants(nbEnfants);
}

public Personne() {
// TODO Auto-generated constructor stub
}

public String toString() {


return "[" + id + "," + prenom + "," + nom + ","
+ new
SimpleDateFormat("dd/MM/yyyy").format(dateNaissance)
+ "," + marie + "," + nbEnfants + "]";
}

public int getId() {


return id;
}

public void setId(int id) {


this.id = id;
}

public Date getDateNaissance() {


return dateNaissance;
}

public void setDateNaissance(Date dateNaissance) {


this.dateNaissance = dateNaissance;
}

public boolean getMarie() {


return marie;
}

public void setMarie(boolean marie) {


this.marie = marie;
}

public int getNbEnfants() {


return nbEnfants;
}

public void setNbEnfants(int nbEnfants) {


this.nbEnfants = nbEnfants;
}

public String getNom() {


return nom;
}

public void setNom(String nom) {


this.nom = nom.trim();
}

public String getPrenom() {


return prenom;

Formation MVC : TP2 5


}

public void setPrenom(String prenom) {


this.prenom = prenom.trim();
}
}

5. Couche dao
a. Dans ce package ma.emsi.formation.mvc.dao, créer les 5 classes suivantes :

[IDao] est l’interface présentée par la couche [dao]


[DaoException] est un type d’exceptions non contrôlées (unchecked),
lancées par la couche [dao]
[DaoImplList] est une implémentation de celle-ci où le groupe de
personnes est encapsulé dans un objet [ArrayList]
[DaoImplJDBC] est une implémentation de celle-ci où le groupe de
personnes est enregistré dans une base de données et l’accés se fait
via l’API JDBC ;
[Utils] pour les méthodes utiles

b. IDao.java :
Le code de l’interface IDao.java est le suivant :

package dao;

import java.util.Collection;

import service.Personne;

public interface IDao {


void init();

Collection getAll();

Personne getOne(int id);

void saveOne(Personne personne);

void deleteOne(int id);


}

Formation MVC : TP2 6


c. DaoException.java
Le code de la classe DaoException.java est le suivant :

package dao;

public class DaoException extends RuntimeException {

/**
*
*/
private static final long serialVersionUID =
2545452232963083750L;
private int code;

public int getCode() {


return code;
}

public DaoException(String message, int code) {


super(message);
this.code = code;
}
}

d. Utils.java
Le code de la classe Utils.java est le suivant :

package dao;

import java.util.ArrayList;

import service.Personne;

public class Utils {


private static Utils instance;

private Utils() {
}

public static Utils getInstance() {


if (instance == null) {
instance = new Utils();
}
return instance;
}

// vérification d'une personne


public static void check(Personne p) {
// personne p
if (p == null) {
throw new DaoException("Personne null", 10);
}
// id
if (p.getId() != -1 && p.getId() < 0) {
throw new DaoException("Id [" + p.getId() + "] invalide",
11);

Formation MVC : TP2 7


}
// date de naissance
if (p.getDateNaissance() == null) {
throw new DaoException("Date de naissance manquante", 12);
}
// nombre d'enfants
if (p.getNbEnfants() < 0) {
throw new DaoException("Nombre d'enfants [" +
p.getNbEnfants()
+ "] invalide", 13);
}
// nom
if (p.getNom() == null || p.getNom().trim().length() == 0) {
throw new DaoException("Nom manquant", 14);
}
// prénom
if (p.getPrenom() == null || p.getPrenom().trim().length() ==
0) {
throw new DaoException("Prénom manquant", 15);
}
}
// rechercher une personne
public static int getPosition(ArrayList personnes, int id) {
int rang = 0;
for (int j = 0; j < personnes.size(); j++) {
if (((Personne) personnes.get(j)).getId() == id) {
return rang;
}
rang++;
}
return rang;
}
}

e. DaoImplList.java
Le code de cette classe est le suivant :

package dao;

import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;

import service.Personne;

public class DaoImplList implements IDao {


// une liste de personnes
private ArrayList<Personne> personnes = new ArrayList<Personne>();

// n° de la prochaine personne
private int id = -1;

public void init() {


try {
Personne p1 = new Personne(-1, "Alami", "Fouad",
new SimpleDateFormat("yyyy-MM-dd").parse("1977-
01-01"),

Formation MVC : TP2 8


true, 2);
saveOne(p1);
Personne p2 = new Personne(-1, "Amrani", "Hassan",
new SimpleDateFormat("yyyy-MM-dd").parse("1985-
02-12"),
false, 1);
saveOne(p2);
Personne p3 = new Personne(-1, "Kadiri", "Mohammed",
new SimpleDateFormat("yyyy-MM-dd").parse("1986-
03-01"),
false, 0);
saveOne(p3);
} catch (ParseException ex) {
throw new DaoException(
"Erreur d'initialisation de la couche [dao] : "
+ ex.toString(), 1);
}
}

// liste des personnes


public Collection getAll() {
return personnes;
}

// obtenir une personne en particulier


public Personne getOne(int id) {
// on cherche la personne
int i = Utils.getPosition(personnes, id);
// a-t-on trouvé ?
if (i != -1) {
return (Personne) personnes.get(i);
} else {
throw new DaoException("Personne d'id [" + id + "]inconnue",
2);
}
}

// ajouter ou modifier une personne


public void saveOne(Personne personne) {
// le paramètre personne est-il valide ?
Utils.check(personne);
// ajout ou modification ?
if (personne.getId() == -1) {
// ajout
personne.setId(++id);
personnes.add(personne);
return;
}
// modification - on cherche la personne
int i = Utils.getPosition(personnes, personne.getId());
// a-t-on trouvé ?
if (i == -1) {
throw new DaoException("La personne d'Id [" +
personne.getId()
+ "] qu'on veut modifier n'existe pas", 2);
}
Personne personFound = (Personne) personnes.get(i);

// c'est bon - on fait la modification


personFound.setNom(personne.getNom());
personFound.setPrenom(personne.getPrenom());

Formation MVC : TP2 9


personFound.setDateNaissance((personne.getDateNaissance()));
personFound.setMarie(personne.getMarie());
personFound.setNbEnfants(personne.getNbEnfants());
}

// suppression d'une personne


public void deleteOne(int id) {
// on cherche la personne
int i = Utils.getPosition(personnes, id);
// a-t-on trouvé ?
if (i == -1) {
throw new DaoException("Personne d'id [" + id + "]
inconnue", 2);
} else {
// on supprime la personne
personnes.remove(i);
}
}
}

f. DaoImplJDBC.java

package dao;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Collection;

import service.Personne;

public class DaoImplJDBC implements IDao {


Connection conn;
String pilote = "com.mysql.jdbc.Driver";
String url = new String("jdbc:mysql://localhost:3306/mvc2");

// une liste de personnes


private ArrayList<Personne> personnes = new ArrayList<Personne>();

public void init() {


try {
Class.forName(pilote);
} catch (ClassNotFoundException e) {
e.printStackTrace();
}

// liste des personnes


public Collection getAll() {
personnes = new ArrayList<Personne>();
try {
conn = DriverManager.getConnection(url, "root", "root");

Formation MVC : TP2 10


Statement stmt = conn.createStatement();
ResultSet rs = stmt.executeQuery("select * from personne");
while (rs.next()) {
Personne personne = new Personne(rs.getInt("id"), rs
.getString("prenom"), rs.getString("nom"),
rs
.getDate("dateNaissance"),
rs.getBoolean("marie"), rs
.getInt("nbreEnfants"));
personnes.add(personne);
}
rs.close();
stmt.close();
conn.close();

} catch (SQLException e) {
System.out.println("SQLException: " + e.getMessage());
System.out.println("SQLState: " + e.getSQLState());
System.out.println("VendorError: " + e.getErrorCode());
}

return personnes;
}

// obtenir une personne en particulier


public Personne getOne(int id) {
Personne personne = null;
try {
conn = DriverManager.getConnection(url, "root", "root");
Statement stmt = conn.createStatement();
ResultSet rs = stmt
.executeQuery("select * from personne where
id='" + id
+ "'");
if (rs.wasNull())
throw new DaoException("Personne d'id [" + id + "]
inconnue", 2);

while (rs.next()) {
personne = new Personne(rs.getInt("id"),
rs.getString("prenom"),
rs.getString("nom"), rs
.getDate("dateNaissance"), rs
.getBoolean("marie"),
rs.getInt("nbreEnfants"));
personnes.add(personne);
}
rs.close();
stmt.close();
conn.close();

} catch (SQLException e) {
System.out.println("SQLException: " + e.getMessage());
System.out.println("SQLState: " + e.getSQLState());
System.out.println("VendorError: " + e.getErrorCode());
}
return personne;
}

// ajouter ou modifier une personne


public void saveOne(Personne personne) {

Formation MVC : TP2 11


try {
conn = DriverManager.getConnection(url, "root", "root");
Statement stmt = conn.createStatement();

if (personne.getId() == -1) {
String findMaxIDrequest = "select max(id) as id from
personne";
ResultSet rs1 = stmt.executeQuery(findMaxIDrequest);
int maxId = 0;
while (rs1.next()) {
maxId = rs1.getInt("id");
}
rs1.close();
personne.setId(++maxId);

String insertRequest = ("insert into personne


values('"
+ personne.getId()
+ "','"
+ personne.getNom()
+ "','"
+ personne.getPrenom()
+ "','"
+ new SimpleDateFormat("yyyy-MM-
dd").format(personne
.getDateNaissance()) + "','"
+ toBoolean(personne.getMarie()) + "','"
+ personne.getNbEnfants() + "')");

stmt.executeUpdate(insertRequest);
stmt.close();
} else {

stmt.executeUpdate("update personne set nom='"


+ personne.getNom()
+ "',prenom='"
+ personne.getPrenom()
+ "',dateNaissance='"
+ new SimpleDateFormat("yyyy-MM-
dd").format(personne
.getDateNaissance()) +
"',marie='"
+ toBoolean(personne.getMarie()) +
"',nbreEnfants='"
+ personne.getNbEnfants() + "'" + " WHERE
id='"
+ personne.getId() + "'");
}

conn.close();
getAll();
} catch (SQLException e) {
System.out.println("SQLException: " + e.getMessage());
System.out.println("SQLState: " + e.getSQLState());
System.out.println("VendorError: " + e.getErrorCode());
}
}

private int toBoolean(boolean marie) {


if (marie)
return 1;

Formation MVC : TP2 12


else
return 0;
}

// suppression d'une personne


public void deleteOne(int id) {
try {
conn = DriverManager.getConnection(url, "root", "root");
Statement stmt = conn.createStatement();
stmt.executeUpdate("delete from personne where id='" + id +
"'");
getAll();
stmt.close();
conn.close();

} catch (SQLException e) {
System.out.println("SQLException: " + e.getMessage());
System.out.println("SQLState: " + e.getSQLState());
System.out.println("VendorError: " + e.getErrorCode());
}
}
}

6. La couche Service ou Métier

a. Dans ce package, créer les deux classes suivantes :

b. IService.java

Le code de l’interface IService.java est :

package service;

import java.util.Collection;

import service.Personne;

public interface IService {


void init();

Collection getAll();

Personne getOne(int id);

void saveOne(Personne personne);

void deleteOne(int id);


}

Formation MVC : TP2 13


c. ServiceImpl.java
Le code de cette classe est :

package service;

import java.util.Collection;

import dao.DaoImplJDBC;
import dao.DaoImplList;
import dao.IDao;

public class ServiceImpl implements IService {


IDao dao;

public void deleteOne(int id) {


dao.deleteOne(id);

public Collection getAll() {


return dao.getAll();
}

public Personne getOne(int id) {


return dao.getOne(id);
}

public void init() {


dao=new DaoImplList();
dao.init();
}

public void saveOne(Personne personne) {


dao.saveOne(personne);
}

7. La couche Web
La couche [web ou bien présentation] va offrir des écrans à l’utilisateur pour lui
permettre de gérer le groupe de personnes :
- Liste des personnes du groupe ;
- Ajout d’une personne au groupe ;
- Modification d’une personne du groupe ;
- Suppression d’une personne du groupe.

a. Controleur.java

Le code de cette classe est :

package presentation;

Formation MVC : TP2 14


import java.io.IOException;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.Map;

import javax.servlet.ServletConfig;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import service.IService;
import service.Personne;
import service.ServiceImpl;

public class Controleur extends HttpServlet {


// parametres d'instance
private String urlErreurs = null;
private ArrayList erreursInitialisation = new ArrayList<String>();
private String[] parametres = { "urlList", "urlEdit", "urlErreurs" };
private Map params = new HashMap<String, String>();
IService service = null;

public void init() throws ServletException {


// on récupère les parametres d'initialisation de la servlet
ServletConfig config = getServletConfig();
// on traite les autres parametres d'initialisation
String valeur = null;
for (int i = 0; i < parametres.length; i++) {
// valeur du paramètre
valeur = config.getInitParameter(parametres[i]);
// paramètre présent ?
if (valeur == null) {
// on note l'erreur
erreursInitialisation.add("Le paramètre [" + parametres[i]
+ "] n'a pas été initialisé");
} else {
// on mémorise la valeur du paramètre
params.put(parametres[i], valeur);
}
}
// l'url de la vue [erreurs] a un traitement particulier
urlErreurs = config.getInitParameter("urlErreurs");
if (urlErreurs == null)

Formation MVC : TP2 15


throw new ServletException(
"Le paramètre [urlErreurs] n'a pas été initialisé");
service = new ServiceImpl();
service.init();
}

// GET
public void doGet(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
// on vérifie comment s'est passée l'initialisation de la servlet
if (erreursInitialisation.size() != 0) {
// on passe la main à la page d'erreurs
request.setAttribute("erreurs", erreursInitialisation);
getServletContext().getRequestDispatcher(urlErreurs).forward(
request, response);
// fin
return;
}

// on récupère la méthode d'envoi de la requête


String methode = request.getMethod().toLowerCase();
// on récupère l'action à exécuter
String action = request.getPathInfo();
// action ?
if (action == null) {
action = "/list";
}
// exécution action
if (methode.equals("get") && action.equals("/list")) {
// liste des personnes
doListPersonnes(request, response);
return;
}
if (methode.equals("get") && action.equals("/delete")) {
// suppression d'une personne
doDeletePersonne(request, response);
return;
}
if (methode.equals("get") && action.equals("/edit")) {
// présentation formulaire ajout / modification d'une personne
doEditPersonne(request, response);
return;
}
if (methode.equals("post") && action.equals("/validate")) {
// validation formulaire ajout / modification d'une personne
doValidatePersonne(request, response);
return;

Formation MVC : TP2 16


}
// autres cas
doListPersonnes(request, response);
}

// affichage liste des personnes


private void doListPersonnes(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// le modèle de la vue [list]
request.setAttribute("personnes", service.getAll());
// affichage de la vue [list]
getServletContext()
.getRequestDispatcher((String) params.get("urlList")).forward(
request, response);
}

// modification / ajout d'une personne


private void doEditPersonne(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// on récupère l'id de la personne
int id = Integer.parseInt(request.getParameter("id"));
// ajout ou modification ?
Personne thePersonne = null;
if (id != -1) {
// modification - on récupère la personne à modifier
thePersonne = service.getOne(id);
} else {
// ajout - on crée une personne vide
thePersonne = new Personne();
thePersonne.setId(-1);
}
// on met l'objet [Personne] dans le modèle de la vue [edit]
request.setAttribute("thePersonne", thePersonne);
// affichage de la vue [edit]
getServletContext()
.getRequestDispatcher((String) params.get("urlEdit")).forward(
request, response);
}

// validation modification / ajout d'une personne


private void doDeletePersonne(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// on récupère l'id de la personne
int id = Integer.parseInt(request.getParameter("id"));
// on supprime la personne
service.deleteOne(id);
// on redirige vers la liste des personnes

Formation MVC : TP2 17


response.sendRedirect("list");
}

// validation modification / ajout d'une personne


public void doValidatePersonne(HttpServletRequest request,
HttpServletResponse response) throws ServletException, IOException {
// on récupère les éléments postés
boolean formulaireErrone = false;
boolean erreur;
// le prénom
String prenom = request.getParameter("prenom").trim();
// prénom valide ?
if (prenom.length() == 0) {
// on note l'erreur
request.setAttribute("erreurPrenom", "Le prénom est obligatoire");
formulaireErrone = true;
}
// le nom
String nom = request.getParameter("nom").trim();
// prénom valide ?
if (nom.length() == 0) {
// on note l'erreur
request.setAttribute("erreurNom", "Le nom est obligatoire");
formulaireErrone = true;
}
// la date de naissance
Date dateNaissance = null;
try {
dateNaissance = new SimpleDateFormat("yyyy-MM-dd").parse(request
.getParameter("dateNaissance").trim());
} catch (ParseException e) {
// on note l'erreur
request.setAttribute("erreurDateNaissance", "Date incorrecte");
formulaireErrone = true;
}
// état marital
boolean marie = Boolean.parseBoolean(request.getParameter("marie")
.trim());
// nombre d'enfants
int nbEnfants = 0;
erreur = false;
try {
nbEnfants = Integer.parseInt(request.getParameter("nbEnfants")
.trim());
if (nbEnfants < 0) {
erreur = true;
}

Formation MVC : TP2 18


} catch (NumberFormatException ex) {
// on note l'erreur
erreur = true;
}
// nombre d'enfants erroné ?
if (erreur) {
// on signale l'erreur
request.setAttribute("erreurNbEnfants",
"Nombre d'enfants incorrect");
formulaireErrone = true;
}
// id de la personne
int id = Integer.parseInt(request.getParameter("id"));
// le formulaire est-il erroné ?
if (formulaireErrone) {
// on réaffiche le formulaire avec les messages d'erreurs
showFormulaire(request, response, "");
// fini
return;
}
// le formulaire est correct - on enregistre la personne
Personne personne = new Personne(id, prenom, nom, dateNaissance, marie,
nbEnfants);
try {
// enregistrement
service.saveOne(personne);
} catch (Exception ex) {
// on réaffiche le formulaire avec le message de l'erreur survenue
showFormulaire(request, response, ex.getMessage());
// fini
return;
}
// on redirige vers la liste des personnes
response.sendRedirect("list");
}

// affichage formulaire pré-rempli


private void showFormulaire(HttpServletRequest request,
HttpServletResponse response, String erreurEdit)
throws ServletException, IOException {
// on prépare le modèle de la vue [edit]
Personne thePersonne = new Personne();
request.setAttribute("erreurEdit", erreurEdit);
thePersonne.setId(Integer.parseInt(request.getParameter("id")));

thePersonne.setPrenom(request.getParameter("prenom").trim());
thePersonne.setNom(request.getParameter("nom").trim());

Formation MVC : TP2 19


try {
thePersonne.setDateNaissance(new SimpleDateFormat("yyyy-MM-dd")
.parse(request.getParameter("dateNaissance").trim()));
} catch (ParseException e) {
// TODO: handle exception
}
thePersonne.setMarie(Boolean.getBoolean(request.getParameter("marie")));

try {
thePersonne.setNbEnfants(Integer.parseInt(request.getParameter(
"nbEnfants").trim()));
} catch (Exception e) {
thePersonne.setNbEnfants(0);
}

// affichage de la vue [edit]


request.setAttribute("thePersonne", thePersonne);
getServletContext()
.getRequestDispatcher((String) params.get("urlEdit")).forward(
request, response);
}

// post
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws IOException, ServletException {
// on passe la main au GET
doGet(request, response);
}

b. Les vues (V dans le MVC)

Créer les pages jsp suivantes comme le montre la fenêtre suivante :

index.jsp :

Formation MVC : TP2 20


Son code est :
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%
response.sendRedirect("/mvc2/do/list");
%>

edit.jsp
<%@ page language="java" pageEncoding="ISO-8859-1"
contentType="text/html;charset=ISO-8859-1"%>

<%
String erreurEdit = (String) request.getAttribute("erreurEdit");
Personne thePersonne = (Personne) request.getAttribute("thePersonne");
%>

<%@page import="service.Personne"%>
<%@page import="java.text.SimpleDateFormat"%><html>
<head>
<title>MVC - Personnes</title>
</head>
<body>
<h2>Ajout/Modification d'une personne</h2>

<%
if (erreurEdit != null && erreurEdit != "") {
out.println("<h3>Echec de la mise à jour :</h3>");
out.print("L'erreur suivante s'est produite :");
out.println(erreurEdit);
out.println("<hr>");
}
%>

<form method="post" action="/mvc2/do/validate">


<table border="1">
<tr>
<td>Id</td>
<td><%=thePersonne.getId()%></td>
</tr>

<tr>
<td>Pr&eacute;nom</td>
<td><input type="text" value="<%=thePersonne.getPrenom()%>"
name="prenom" size="20"></td>
<td>
<%
String erreurPrenom = (String) request.getAttribute("erreurPrenom");
if (erreurPrenom == null || erreurPrenom == "")
erreurPrenom = "";
out.print(erreurPrenom);
%>
</td>
</tr>
<tr>
<td>Nom</td>
<td><input type="text" value="<%=thePersonne.getNom()%>"

Formation MVC : TP2 21


name="nom" size="20"></td>
<td>
<%
String erreurNom = (String) request.getAttribute("erreurNom");
if (erreurNom == null || erreurNom == "")
erreurNom = "";

out.print(erreurNom);
%>
</td>
</tr>
<tr>
<td>Date de naissance (AAAA-MM-JJ)</td>
<td><input type="text"
value="<%if (thePersonne.getDateNaissance() == null)
out.print("");
else
out.print(new SimpleDateFormat("yyyy-MM-dd").format(thePersonne
.getDateNaissance()));%>"
name="dateNaissance"></td>
<td>
<%
String erreurDateNaissance = (String) request
.getAttribute("erreurDateNaissance");
if (erreurDateNaissance == null || erreurDateNaissance == "")
erreurDateNaissance = "";

out.print(erreurDateNaissance);
%>
</td>
</tr>
<tr>
<td>Mari&eacute;</td>
<td>
<%
String marie = String.valueOf(thePersonne.getMarie());
if (marie == "true") {
out.println("<input type=\"radio\" name=\"marie\"
value=\"true\" checked>Oui");
out.println("<input type=\"radio\" name=\"marie\"
value=\"false\">Non");
} else {
out.println("<input type=\"radio\" name=\"marie\"
value=\"true\">Oui");
out.println("<input type=\"radio\" name=\"marie\" value=\"false\"
checked>Non");
}
%>
</td>
</tr>
<tr>
<td>Nombre d'enfants</td>
<td><input type="text" value="<%=thePersonne.getNbEnfants()%>"
name="nbEnfants"></td>
<td><%=thePersonne.getNbEnfants()%></td>
</tr>
</table>
<br>
<input type="hidden" value="<%=thePersonne.getId()%>" name="id" /> <input
type="submit" value="Valider" /> <a href="/mvc2/do/list"
/>Annuler</a></form>

Formation MVC : TP2 22


</body>
</html>

list.jsp
<%@ page language="java" pageEncoding="ISO-8859-1"
contentType="text/html;charset=ISO-8859-1"%>

<%
ArrayList erreurs = (ArrayList) request.getAttribute("erreurs");
Collection personnes = (Collection) request
.getAttribute("personnes");
%>

<%@page import="java.util.ArrayList"%>
<%@page import="service.*"%>

<%@page import="java.util.Collection"%>
<%@page import="java.util.Iterator"%>
<%@page import="java.text.SimpleDateFormat"%><html>
<head>
<title>MVC - Personnes</title>
</head>
<body>

<%
if (erreurs != null) {
out
.println("<h3>Les erreurs suivantes se sont
produites :</h3>");
out.println("<ul>");

for (int i = 0; i < erreurs.size(); i++) {


out.println("<li>" + erreurs.get(i) + "</li>");
}
out.println("<ul>");
out.println("<hr>");
}
%>

<h2>Liste des personnes</h2>


<table border="1">
<tr>
<th>Id</th>
<th>Pr&eacute;nom</th>
<th>Nom</th>
<th>Date de naissance</th>
<th>Mari&eacute;</th>
<th>Nombre d'enfants</th>
<th></th>
</tr>
<%
Iterator iter = personnes.iterator();
while (iter.hasNext()) {
Personne personne = (Personne) iter.next();
out.println("<tr>");

Formation MVC : TP2 23


out.println("<td>" + personne.getId() + "</td>");
out.println("<td>" + personne.getPrenom() + "</td>");
out.println("<td>" + personne.getNom() + "</td>");
out.println("<td>"
+ new
SimpleDateFormat("dd/MM/yyyy").format(personne
.getDateNaissance()) + "</td>");
out.println("<td>" + personne.getMarie() + "</td>");
out.println("<td>" + personne.getNbEnfants() + "</td>");
out.println("<td><a href=\"/mvc2/do/edit?id="
+ personne.getId() + "\">Modifier</a></td>");
out.println("<td><a href=\"/mvc2/do/delete?id="
+ personne.getId() +
"\">Supprimer</a></td>");
out.println("</tr>");
}
%>
</table>
<br>
<a href="/mvc2/do/edit?id=-1">Ajout</a>
</body>
</html>

exception.jsp :

<%@ page language="java" pageEncoding="ISO-8859-1"


contentType="text/html;charset=ISO-8859-1"%>
<%@ page isErrorPage="true" %>

<%
response.setStatus(200);
%>

<html>
<head>
<title>MVC - Personnes</title>
</head>
<body>
<h2>MVC - personnes</h2>
L'exception suivante s'est produite :
<%= exception.getMessage()%>
<br><br>
<a href="/do/list">Retour &agrave; la liste</a>
</body>
</html>

erreurs.jsp :
<%@ page language="java" contentType="text/html; charset=ISO-8859-1"
pageEncoding="ISO-8859-1"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<%
ArrayList erreurs = (ArrayList) request.getAttribute("erreurs");
%>

<%@page import="java.util.ArrayList"%>

<html>

Formation MVC : TP2 24


<head>
<title>MVC - Personnes</title>
</head>
<body>
<h2>Les erreurs suivantes se sont produites</h2>
<ul>
<%
for (int i = 0; i < erreurs.size(); i++) {
out.println("<li>" + erreurs.get(i) + "</li>");
}
%>
</ul>
</body>
</html>

web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app id="WebApp_ID" version="2.4"
xmlns="http://java.sun.com/xml/ns/j2ee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee
http://java.sun.com/xml/ns/j2ee/web-app_2_4.xsd">
<display-name>mvc2</display-name>
<!-- ServletPersonne -->
<servlet>
<servlet-name>mvc2</servlet-name>
<servlet-class>
presentation.Controleur
</servlet-class>
<init-param>
<param-name>urlEdit</param-name>
<param-value>/WEB-INF/vues/edit.jsp</param-value>
</init-param>
<init-param>
<param-name>urlErreurs</param-name>
<param-value>/WEB-INF/vues/erreurs.jsp</param-value>
</init-param>
<init-param>
<param-name>urlList</param-name>
<param-value>/WEB-INF/vues/list.jsp</param-value>
</init-param>
</servlet>
<!-- Mapping ServletPersonne-->
<servlet-mapping>
<servlet-name>mvc2</servlet-name>
<url-pattern>/do/*</url-pattern>
</servlet-mapping>
<!-- fichiers d'accueil -->
<welcome-file-list>
<welcome-file>/WEB-INF/vues/index.jsp</welcome-file>
</welcome-file-list>
<!-- Page d'erreur inattendue -->
<error-page>
<exception-type>java.lang.Exception</exception-type>
<location>/WEB-INF/vues/exception.jsp</location>
</error-page>
</web-app>

Formation MVC : TP2 25


Tests :

Pour tester l’application, démarrer le serveur TOMCAT et lancer le lien :


http://localhost:8080/mvc2/do/list

La page suivante sera affichée :

Pour ajouter une nouvelle personne, cliquer sur le lien Ajouter. La page suivante sera
affichée :

Entrer le nom, le prénom, la date de naissance et cocher le flag marié et entrer le nombre
d’enfants :

Formation MVC : TP2 26


Cliquer sur Valider. La page suivante sera affichée :

Pour supprimer une personne, cliquer sur le lien « Supprimer ».

Pour modifier une personne, cliquer sur le lien « Modifier », le formulaire de modification
sera affichée. Entrer par la suite les modifications et cliquer sur le bouton valider :

Formation MVC : TP2 27


Implémentation de la couche DAO avec JDBC :

Dans la partie suivante, nous allons basculer à la deuxième implémentation de la couche


DAO en utilisant l’API JDBC. Pour ceci, dans MYSQL 5.0, créer le schéma MVC2 et créer la
table personne comme suit :

CREATE TABLE `mvc2`.`personne` (


`ID` int(11) NOT NULL,
`NOM` varchar(30) NOT NULL,
`PRENOM` varchar(30) NOT NULL,
`DATENAISSANCE` date NOT NULL,
`MARIE` tinyint(1) NOT NULL,
`nbreEnfants` int(11) NOT NULL,
PRIMARY KEY (`ID`),
UNIQUE KEY `NOM` (`NOM`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

Ensuite, dans la classe ServiceImpl , remplacer le code de la méthode init() par le code
suivant :

public void init() {


dao=new DaoImplJDBC();
dao.init();
}

Formation MVC : TP2 28

Vous aimerez peut-être aussi