V. AFFICHAGE DE DONNEES EN BASE▲
V-A. Etape 4 : Création de la base de données▲
V-A-1. Installation et lancement de HSQLDB▲
Décompresser le fichier "hsqldb_1_8_0_10.zip" à la racine du disque C.
Lancer le manager de HSQLDB grâce à la commande ""C:\Program Files\Java\jre1.5.0_17\bin\java" -classpath c:\hsqldb\lib\hsqldb.jar org.hsqldb.util.DatabaseManager".
Saisir "maBase" dans "Setting Name", "HSQL Database Engine Standalone" dans "Type", "jdbc:hsqldb:file:C:\hsqldb\data\maBase" dans "URL". Cliquer sur "OK".
V-A-2. Création de la table "LISTECOURSES"▲
Saisir la requête :
CREATE
TABLE
LISTECOURSES(
IDOBJET INTEGER
GENERATED
BY
DEFAULT
AS
IDENTITY
(
START
WITH
1
)
PRIMARY
KEY
, LIBELLE VARCHAR
, QUANTITE INTEGER
)
;
Cliquer sur "Execute".
Aller dans le menu "View". Cliquer sur "Refresh Tree", afin que la nouvelle table apparaisse dans l'arbre à gauche. Cliquer sur "Execute".
V-A-3. Insertion des données▲
Saisir la requête :
INSERT
INTO
LISTECOURSES(
LIBELLE, QUANTITE)
VALUES
(
'Banane'
, 3
)
;
INSERT
INTO
LISTECOURSES(
LIBELLE, QUANTITE)
VALUES
(
'Sucre blanc'
, 75
)
;
INSERT
INTO
LISTECOURSES(
LIBELLE, QUANTITE)
VALUES
(
'Oeuf'
, 1
)
;
INSERT
INTO
LISTECOURSES(
LIBELLE, QUANTITE)
VALUES
(
'Levure'
, 1
)
;
INSERT
INTO
LISTECOURSES(
LIBELLE, QUANTITE)
VALUES
(
'Sel'
, 1
)
;
INSERT
INTO
LISTECOURSES(
LIBELLE, QUANTITE)
VALUES
(
'Farine'
, 150
)
;
INSERT
INTO
LISTECOURSES(
LIBELLE, QUANTITE)
VALUES
(
'Beurre'
, 70
)
;
Cliquer sur "Execute".
Aller dans le menu "Options". Cliquer sur "Commit".
Fermer le manager HSQLDB.
V-A-4. Vérification▲
Lancer le manager de HSQLDB grâce à la commande "C:\Program Files\Java\jre1.5.0_16\bin\java" -classpath c:\hsqldb\lib\hsqldb.jar org.hsqldb.util.DatabaseManager".
Choisir "maBase" dans "Recent". Cliquer sur "OK".
Saisir la requête :
SELECT
*
FROM
LISTECOURSES;
Cliquer sur "Execute".
V-B. Etape 5 : Développement de l'affichage▲
V-B-1. Déclaration de la ressource dans "web.xml"▲
Ajouter la déclaration de l'utilisation par l'application de la ressource dans le fichier "web.xml".
<!-- Action Servlet Mapping -->
<servlet-mapping>
<servlet-name>
action</servlet-name>
<url-pattern>
*.do</url-pattern>
</servlet-mapping>
<!-- Declaration de l'utilisation de la ressource JDBC -->
<resource-ref>
<description>
Ressource JDBC de l'application</description>
<res-ref-name>
jdbc/dsMonApplication</res-ref-name>
<res-type>
javax.sql.DataSource</res-type>
<res-auth>
Container</res-auth>
</resource-ref>
V-B-2. Création de la classe de bean▲
Faire clic droit sur "Java Resources: src". Choisir "New"/"Class".
Saisir "com.developpez.rpouiller.monapplication" dans "Package", "ElementCourseBean" dans "Name". Cliquer sur "Finish".
Saisir le code suivant pour le bean.
package
com.developpez.rpouiller.monapplication;
import
java.io.Serializable;
public
class
ElementCourseBean implements
Serializable {
private
static
final
long
serialVersionUID =
58409687792501803
L;
private
Long idObjet;
private
String libelle;
private
Integer quantite;
public
Long getIdObjet
(
) {
return
idObjet;
}
public
void
setIdObjet
(
Long idObjet) {
this
.idObjet =
idObjet;
}
public
String getLibelle
(
) {
return
libelle;
}
public
void
setLibelle
(
String libelle) {
this
.libelle =
libelle;
}
public
Integer getQuantite
(
) {
return
quantite;
}
public
void
setQuantite
(
Integer quantite) {
this
.quantite =
quantite;
}
}
V-B-3. Création de la classe de bean de retour de la DAO▲
Créer une classe "RetourRechercherBean" dans le package "com.developpez.rpouiller.monapplication".
Saisir le code suivant pour le bean.
package
com.developpez.rpouiller.monapplication;
import
java.io.Serializable;
import
java.util.List;
public
class
RetourRechercherBean implements
Serializable {
private
static
final
long
serialVersionUID =
1050432583446929484
L;
private
String erreur;
private
List<
ElementCourseBean>
listeCourses;
public
String getErreur
(
) {
return
erreur;
}
public
void
setErreur
(
String erreur) {
this
.erreur =
erreur;
}
public
List<
ElementCourseBean>
getListeCourses
(
) {
return
listeCourses;
}
public
void
setListeCourses
(
List<
ElementCourseBean>
listeCourses) {
this
.listeCourses =
listeCourses;
}
}
V-B-4. Création de la classe DAO accédant à la base de données▲
Créer une classe "ListeCoursesDAO" dans le package "com.developpez.rpouiller.monapplication".
Saisir le code suivant pour la DAO.
package
com.developpez.rpouiller.monapplication;
import
java.sql.Connection;
import
java.sql.ResultSet;
import
java.sql.SQLException;
import
java.sql.Statement;
import
java.util.LinkedList;
import
java.util.List;
import
javax.naming.Context;
import
javax.naming.InitialContext;
import
javax.naming.NamingException;
import
javax.sql.DataSource;
public
class
ListeCoursesDAO {
private
final
static
String NOM_RESOURCE_JDBC =
"java:comp/env/jdbc/dsMonApplication"
;
/**
* Retourne la liste des courses stockées dans la base.
*
@return
La liste des courses/erreurs.
*/
public
RetourRechercherBean rechercherElementsCourses
(
) {
final
RetourRechercherBean lRetourRechercher =
new
RetourRechercherBean
(
);
try
{
final
Context lContext =
new
InitialContext
(
);
final
DataSource lDataSource =
(
DataSource) lContext.lookup
(
NOM_RESOURCE_JDBC);
final
List<
ElementCourseBean>
lListeCourses =
new
LinkedList<
ElementCourseBean>(
);
final
Connection lConnection =
lDataSource.getConnection
(
);
final
Statement lStatement =
lConnection.createStatement
(
);
final
ResultSet lResultSet =
lStatement.executeQuery
(
"SELECT * FROM LISTECOURSES"
);
while
(
lResultSet.next
(
)) {
final
ElementCourseBean lElementCourse =
new
ElementCourseBean
(
);
final
Long lIdObjet =
lResultSet.getLong
(
"IDOBJET"
);
final
String lLibelle =
lResultSet.getString
(
"LIBELLE"
);
final
Integer lQuantite =
lResultSet.getInt
(
"QUANTITE"
);
lElementCourse.setIdObjet
(
lIdObjet);
lElementCourse.setLibelle
(
lLibelle);
lElementCourse.setQuantite
(
lQuantite);
lListeCourses.add
(
lElementCourse);
}
lRetourRechercher.setListeCourses
(
lListeCourses);
}
catch
(
NamingException e) {
// Trace l'erreur dans la log du serveur
e.printStackTrace
(
);
// Stocke l'erreur dans le retour
lRetourRechercher.setErreur
(
"NamingException : "
+
e.getMessage
(
));
}
catch
(
SQLException e) {
// Trace l'erreur dans la log du serveur
e.printStackTrace
(
);
// Stocke l'erreur dans le retour
lRetourRechercher.setErreur
(
"SQLException : "
+
e.getMessage
(
));
}
return
lRetourRechercher;
}
}
V-B-5. Création de la classe Action d'affichage▲
Créer une classe "AfficherListeCoursesAction" dans le package "com.developpez.rpouiller.monapplication".
Saisir le code suivant pour l'action.
package
com.developpez.rpouiller.monapplication;
import
javax.servlet.http.HttpServletRequest;
import
javax.servlet.http.HttpServletResponse;
import
org.apache.struts.Globals;
import
org.apache.struts.action.Action;
import
org.apache.struts.action.ActionForm;
import
org.apache.struts.action.ActionForward;
import
org.apache.struts.action.ActionMapping;
import
org.apache.struts.action.ActionMessage;
import
org.apache.struts.action.ActionMessages;
public
class
AfficherListeCoursesAction extends
Action {
public
ActionForward execute
(
final
ActionMapping pMapping,
ActionForm pForm, final
HttpServletRequest pRequete,
final
HttpServletResponse pReponse) {
// Récupère les informations dans la base
final
ListeCoursesDAO lListeCoursesDAO =
new
ListeCoursesDAO
(
);
final
RetourRechercherBean lRetourRechercher =
lListeCoursesDAO.rechercherElementsCourses
(
);
if
(
lRetourRechercher.getErreur
(
) ==
null
) {
// Stocke les informations dans la requête
pRequete.setAttribute
(
"LISTE_COURSES"
, lRetourRechercher.getListeCourses
(
));
// S'il n'y a pas d'erreurs, on retourne le forward "succes"
return
pMapping.findForward
(
"succes"
);
}
else
{
final
ActionMessages lErreurs =
getErrors
(
pRequete);
final
ActionMessage lActionMessage =
new
ActionMessage
(
lRetourRechercher.getErreur
(
), false
);
lErreurs.add
(
Globals.ERROR_KEY, lActionMessage);
saveErrors
(
pRequete, lErreurs);
// S'il y a des erreurs, on retourne le forward "erreur"
return
pMapping.findForward
(
"erreur"
);
}
}
}
V-B-6. Création de la JSP d'affichage de la liste de courses▲
Créer une nouvelle JSP "listeCourses.jsp" dans "pages".
Saisir le code suivant pour la JSP.
<%@
page
language
=
"java"
contentType
=
"text/html; charset=ISO-8859-1"
pageEncoding=
"ISO-8859-1"
%>
<%@
taglib
prefix
=
"html"
uri
=
"http://struts.apache.org/tags-html"
%>
<%@
taglib
prefix
=
"bean"
uri
=
"http://struts.apache.org/tags-bean"
%>
<%@
taglib
prefix
=
"logic"
uri
=
"http://struts.apache.org/tags-logic"
%>
<html
:
html
>
<head>
<title><bean
:
message
key=
"titre.listecourses"
/></title>
</head>
<body>
<table border=
"1"
>
<thead>
<tr>
<th><bean
:
message
key=
"colonne.identifiant"
/></th>
<th><bean
:
message
key=
"colonne.libelle"
/></th>
<th><bean
:
message
key=
"colonne.quantite"
/></th>
</tr>
</thead>
<tbody>
<logic
:
iterate
id=
"elementCourse"
name=
"LISTE_COURSES"
type=
"com.developpez.rpouiller.monapplication.ElementCourseBean"
>
<tr>
<td><bean
:
write
name=
"elementCourse"
property=
"idObjet"
/></td>
<td><bean
:
write
name=
"elementCourse"
property=
"libelle"
/></td>
<td><bean
:
write
name=
"elementCourse"
property=
"quantite"
/></td>
</tr>
</logic
:
iterate
>
</tbody>
</table>
</body>
</html
:
html
>
V-B-7. Création de la JSP d'erreur▲
Créer une nouvelle JSP "erreur.jsp" dans "pages".
Saisir le code suivant pour la JSP.
<%@
page
language
=
"java"
contentType
=
"text/html; charset=ISO-8859-1"
pageEncoding=
"ISO-8859-1"
%>
<%@
taglib
prefix
=
"html"
uri
=
"http://struts.apache.org/tags-html"
%>
<%@
taglib
prefix
=
"bean"
uri
=
"http://struts.apache.org/tags-bean"
%>
<html
:
html
>
<head>
<title><bean
:
message
key=
"titre.erreur"
/></title>
</head>
<body>
<html
:
errors
/><br/>
</body>
</html
:
html
>
V-B-8. Modification du fichier d'internationalisation▲
Ajouter les lignes suivantes dans le fichier "Resources.properties".
titre.listecourses
=Liste de courses
colonne.identifiant
=IDOBJET
colonne.libelle
=LIBELLE
colonne.quantite
=QUANTITE
titre.erreur
=Erreur
V-B-9. Modification du fichier de configuration "struts-config.xml"▲
Ajouter les lignes suivantes dans le fichier "struts-config.xml" (les lignes doivent être avant la déclaration du fichier d'internationalisation).
<!-- ========== Mapping des actions ============================== -->
<action-mappings>
<!-- Indique la correspondance entre une action sous forme d'URL (ici /AfficherListeCourses.do),
une classe (ici com.developpez.rpouiller.monapplication.AfficherListeCoursesAction) -->
<action path
=
"/AfficherListeCourses"
type
=
"com.developpez.rpouiller.monapplication.AfficherListeCoursesAction"
>
<forward
name
=
"succes"
path
=
"/pages/listeCourses.jsp"
/>
<forward
name
=
"erreur"
path
=
"/pages/erreur.jsp"
/>
</action>
</action-mappings>
V-C. Etape 6 : Configuration de Tomcat▲
V-C-1. Déclaration de la ressource JDBC dans le serveur▲
Ouvrir le fichier "server.xml" du serveur Tomcat (paramétrage accessible depuis Eclipse).
Ajouter la déclaration de la ressource JNDI dans les ressources globales (partie "GlobalNamingResources").
<Resource
auth
=
"Container"
driverClassName
=
"org.hsqldb.jdbcDriver"
maxActive
=
"100"
maxIdle
=
"30"
maxWait
=
"10000"
name
=
"jdbc/dsMaBase"
password
=
""
type
=
"javax.sql.DataSource"
url
=
"jdbc:hsqldb:file:C:\hsqldb\data\maBase"
username
=
"sa"
/>
V-C-2. Déclaration du lien de la ressource▲
Ouvrir le fichier "context.xml" du serveur Tomcat (paramétrage accessible depuis Eclipse).
Ajouter la déclaration du lien entre de la ressource globale et la déclaration dans l'application.
<ResourceLink
name
=
"jdbc/dsMonApplication"
global
=
"jdbc/dsMaBase"
type
=
"javax.sql.DataSource"
/>
V-C-3. Copie de la librairie HSQLDB dans les librairies Tomcat▲
Copier la librairie "hsqldb.jar" depuis le zip "hsqldb_1_8_0_10.zip" dans les librairies de Tomcat ("C:\Program Files\Apache Software Foundation\Tomcat 6.0\lib").
V-C-4. Déploiement de l'application▲
Si le serveur est à l'état "Restart" (Il faut qu'il soit à l'état "Synchronized") : Sélectionner le serveur Tomcat dans la vue "Servers". Faire un clic droit sur le serveur Tomcat. Puis sélectionner "Restart".
Ouvrir un navigateur web à l'adresse : http://localhost:8080/MonApplication/AfficherListeCourses.do.
Si l'application est en erreur, comme dans l'image. Il faut redémarrer Eclipse. Et une fois Eclipse redémarré, redémarrer le serveur Tomcat.
V-D. Fonctionnement de l'ensemble▲
Au démarrage du serveur Tomcat, le fichier "server.xml" déclare une ressource JDBC globale avec ses paramètres de connexion.
Le fichier "context.xml" définit un mappage entre une ressource JDBC déclarée dans une application et la ressource JDBC globale.
Au démarrage de l'application, le fichier "web.xml" indique que les urls finissant par ".do" sont mappées vers la servlet "org.apache.struts.action.ActionServlet". Le fichier indique également que l'application utilise la ressource JDBC "jdbc/dsMonApplication"
Le fichier de configuration "struts-config.xml" déclare une action "com.developpez.rpouiller.monapplication.AfficherListeCoursesAction". Cette action peut être suivie lors de son exécution de deux JSP ("/pages/listeCourses.jsp" ou "/pages/erreur.jsp") selon la direction décidée dans l'action.
Lors de l'appel "http://localhost:8080/MonApplication/AfficherListeCourses.do", la servlet "org.apache.struts.action.ActionServlet" est exécutée (url terminée par ".do"). Elle utilise le mapping des actions contenues dans "struts-config.xml", pour appeler l'action "com.developpez.rpouiller.monapplication.AfficherListeCoursesAction".
L'action appelle la DAO afin d'obtenir la liste des enregistrements contenus en base. Elle stocke la liste des enregistrements dans la "requête". Si tout s'est bien passé, elle demande de forwarder vers le mapping "succes" ("/pages/listeCourses.jsp"). Ou en cas d'erreur, elle demande de forwarder vers le mapping "erreur" ("/pages/erreur.jsp").
La DAO "ListeCoursesDAO" utilise la ressource JDBC pour accéder à la base. Elle fournit une méthode retournant les informations contenues dans la table "LISTECOURSES".
La JSP "/pages/listeCourses.jsp" affiche un tableau avec les valeurs contenues dans la requête. Le tag "logic:iterate" effectue une boucle sur les élément de la liste des courses qui a été stockée dans la requête sous le nom "LISTE_COURSES". A chaque itération, l'élément courant de la liste possède le nom "elementCourse" et est de classe "com.developpez.rpouiller.monapplication.ElementCourseBean". Chaque tag "bean:write" affiche une propriété (property) de l'élément courant.
La JSP "/pages/erreur.jsp" affiche les erreurs stockées dans la requête. Le tag "html:errors" affiche les erreurs qui ont été ajoutées dans la requête par la classe d'affichage.