VI. CREATION DE DONNEES EN BASE▲
VI-A. Etape 7 : Création d'enregistrements dans la base de données▲
VI-A-1. Modification de la classe DAO▲
Ajouter la méthode "creerElementCourse" dans la classe "ListeCoursesDAO".
/**
* Crée un nouvel élément dans la liste des courses
*
@param
pLibelle
Libellé du nouvel élément
*
@param
pQuantite
Quantité du nouvel élément
*
@return
Erreur s'il y a lieu
*/
public
String creerElementCourse
(
final
String pLibelle, final
Integer pQuantite) {
try
{
final
Context lContext =
new
InitialContext
(
);
final
DataSource lDataSource =
(
DataSource) lContext.lookup
(
NOM_RESOURCE_JDBC);
final
Connection lConnection =
lDataSource.getConnection
(
);
// Insertion du nouvel enregistrement
final
PreparedStatement lPreparedStatementCreation =
lConnection.prepareStatement
(
"INSERT INTO LISTECOURSES(LIBELLE, QUANTITE) VALUES(?, ?)"
);
lPreparedStatementCreation.setString
(
1
, pLibelle);
lPreparedStatementCreation.setInt
(
2
, pQuantite);
lPreparedStatementCreation.executeUpdate
(
);
return
null
;
}
catch
(
NamingException e) {
return
"NamingException : "
+
e.getMessage
(
);
}
catch
(
SQLException e) {
return
"SQLException : "
+
e.getMessage
(
);
}
}
Faire un clic droit dans le source. Choisir "Source"/"Organize Imports".
VI-A-2. Création de la classe Action de création▲
Créer une classe "CreerElementCoursesAction" 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;
import
org.apache.struts.validator.DynaValidatorActionForm;
public
class
CreerElementCoursesAction extends
Action {
public
ActionForward execute
(
final
ActionMapping pMapping,
ActionForm pForm, final
HttpServletRequest pRequete,
final
HttpServletResponse pReponse) {
// Récupère les informations du formulaire
final
DynaValidatorActionForm lForm =
(
DynaValidatorActionForm)pForm;
final
String lLibelle =
lForm.getString
(
"libelle"
);
final
Integer lQuantite =
new
Integer
(
lForm.getString
(
"quantite"
));
// Création en base du nouvel enregistrement
final
ListeCoursesDAO lListeCoursesDAO =
new
ListeCoursesDAO
(
);
final
String lErreur =
lListeCoursesDAO.creerElementCourse
(
lLibelle, lQuantite);
if
(
lErreur ==
null
) {
// 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
(
lErreur, 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"
);
}
}
}
VI-A-3. Création d'un nouveau fichier d'internationalisation▲
Créer un nouveau fichier d'internationalisation dans le dossier "src"/"com"/"developpez"/"rpouiller"/"monapplication" sous le nom "ResourcesCreation.properties".
Remplir le fichier "ResourcesCreation.properties" avec :
titre.creation.elementcourses
=Création d'élément de la liste de courses
creation.elementcourses.libelle.libelle
=Libellé
creation.elementcourses.libelle.quantite
=Quantité
creation.libelle.error.required
=Le libellé est nécessaire.
creation.quantité.error.required
=La quantité est nécessaire.
creation.quantité.error.integer
=La quantité doit être numérique.
VI-A-4. Création d'un nouveau fichier de configuration "struts-config-creation.xml"▲
Créer un fichier XML "struts-config-creation.xml" dans "WebContent/WEB-INF".
Remplir le fichier "struts-config-creation.xml" avec :
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE struts-config PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 1.1//EN"
"http://jakarta.apache.org/struts/dtds/struts-config_1_3.dtd"
>
<struts-config>
<!-- ========== Formulaire ============================== -->
<form-beans>
<form-bean
name
=
"creationForm"
type
=
"org.apache.struts.validator.DynaValidatorActionForm"
>
<form-property
name
=
"libelle"
type
=
"java.lang.String"
/>
<form-property
name
=
"quantite"
type
=
"java.lang.String"
/>
</form-bean>
</form-beans>
<!-- ========== Mapping des actions ============================== -->
<action-mappings>
<action path
=
"/AfficherCreationElementCourses"
name
=
"creationForm"
type
=
"com.developpez.rpouiller.monapplication.AfficherListeCoursesAction"
scope
=
"request"
validate
=
"false"
attribute
=
"bean"
>
<forward
name
=
"succes"
path
=
"/pages/creation.jsp"
/>
<forward
name
=
"erreur"
path
=
"/pages/erreur.jsp"
/>
</action>
<action path
=
"/CreerCreationElementCourses"
name
=
"creationForm"
type
=
"com.developpez.rpouiller.monapplication.CreerElementCoursesAction"
scope
=
"request"
validate
=
"true"
attribute
=
"bean"
input
=
"/AfficherCreationElementCourses.do"
>
<forward
name
=
"succes"
path
=
"/AfficherCreationElementCourses.do"
/>
<forward
name
=
"erreur"
path
=
"/pages/erreur.jsp"
/>
</action>
</action-mappings>
<!-- ========== Ressources de definitions de messages =========================== -->
<message-resources
parameter
=
"com.developpez.rpouiller.monapplication.ResourcesCreation"
key
=
"creation"
/>
</struts-config>
VI-A-5. Modification du fichier "web.xml"▲
Modidier la déclaration du paramétrage de la servlet "org.apache.struts.action.ActionServlet" dans le fichier "web.xml".
<!-- Configuration de l'action servlet -->
<servlet>
<servlet-name>
action</servlet-name>
<servlet-class>
org.apache.struts.action.ActionServlet</servlet-class>
<init-param>
<param-name>
config</param-name>
<param-value>
/WEB-INF/struts-config.xml,
/WEB-INF/struts-config-creation.xml
</param-value>
</init-param>
<load-on-startup>
1</load-on-startup>
</servlet>
VI-A-6. Création de la JSP de création▲
Créer une JSP "creation.jsp" dans "pages".
Remplir "creation.jsp" avec :
<%@
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"
%>
<%@
taglib
prefix
=
"nested"
uri
=
"http://struts.apache.org/tags-nested"
%>
<html
:
html
>
<head>
<title><bean
:
message
key=
"titre.creation.elementcourses"
bundle=
"creation"
/></title>
</head>
<body>
<b><i><html
:
errors
/></i></b><br/>
<html
:
form
action=
"/CreerCreationElementCourses.do"
>
<bean
:
message
key=
"creation.elementcourses.libelle.libelle"
bundle=
"creation"
/>
<nested
:
text
property=
"libelle"
/><br>
<bean
:
message
key=
"creation.elementcourses.libelle.quantite"
bundle=
"creation"
/>
<nested
:
text
property=
"quantite"
/><br>
<html
:
submit
/>
</html
:
form
>
<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
>
VI-A-7. Création du fichier de validation "validation-creation.xml"▲
Créer un fichier XML "validation-creation.xml" dans "WebContent/WEB-INF".
Remplir le fichier avec :
<?xml version="1.0" encoding="ISO-8859-1" ?>
<!DOCTYPE form-validation PUBLIC
"-//Apache Software Foundation//DTD Commons Validator Rules Configuration 1.1.3//EN"
"http://jakarta.apache.org/commons/dtds/validator_1_3_0.dtd"
>
<form-validation>
<formset>
<form
name
=
"/CreerCreationElementCourses"
>
<!-- Contraintes sur le champ libelle : obligatoire -->
<field
property
=
"libelle"
depends
=
"required"
>
<msg
name
=
"required"
key
=
"creation.libelle.error.required"
bundle
=
"creation"
/>
</field>
<!-- Contraintes sur le champ quantite : obligatoire et numerique -->
<field
property
=
"quantite"
depends
=
"required, integer"
>
<msg
name
=
"required"
key
=
"creation.quantité.error.required"
bundle
=
"creation"
/>
<msg
name
=
"integer"
key
=
"creation.quantité.error.integer"
bundle
=
"creation"
/>
</field>
</form>
</formset>
</form-validation>
VI-A-8. Modification du fichier de configuration "struts-config.xml"▲
Rajouter la déclaration des validations dans "struts-config.xml" après la déclaration des ressources de messages :
<!-- ========== Validation des formulaires =========================== -->
<plug-in
className
=
"org.apache.struts.validator.ValidatorPlugIn"
>
<set-property
property
=
"pathnames"
value
=
"/org/apache/struts/validator/validator-rules.xml,
/WEB-INF/validation-creation.xml"
/>
</plug-in>
VI-A-9. 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/AfficherCreationElementCourses.do.
VI-A-11. Vérification▲
L'application doit vérifier que les champs "libelle" et "quantite" sont renseignés.
L'application doit vérifier que le champ "quantite" est bien numérique.
L'application doit stocker le nouvel enregistrement et l'afficher ensuite.
VI-B. Fonctionnement de l'ensemble▲
Au démarrage de l'application, la modification du fichier "web.xml" indique que la servlet "org.apache.struts.action.ActionServlet" est initialisée par deux fichiers de configuration.
La modification effectuée dans "struts-config.xml" indique les fichiers de validation de formulaire. Le fichier "validator-rules.xml" est contenue dans la librairie "struts-core-1.3.8.jar". Le chemin correspond au chemin dans le classpath.
Le fichier "validation-creation.xml" indique les conditions de validation du formulaire (champs obligatoires, numériques, etc...) et les messages correspondants aux erreurs de validation.
Le fichier "struts-config-creation.xml" déclare deux actions (une d'affichage et une de création) et un formulaire. Ces deux actions ont le même formulaire. Mais, seule l'action de création nécessite une validation du formulaire.
Lors de l'appel "http://localhost:8080/MonApplication/AfficherCreationElementCourses.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-creation.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/creation.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/creation.jsp" affiche un formulaire de création et un tableau avec les valeurs contenues dans la requête. Le tag "nested:text" permet de saisir une propriété du formulaire (déclarée dans le fichier "struts-config-creation.xml"). Le tag "html:submit" correspond au bouton "Submit".
La JSP "/pages/erreur.jsp" affiche les erreurs stockées dans la requête.
Lors du clic sur le bouton "Submit", le formulaire est soumis au serveur Tomcat.
Le formulaire est tout d'abord validé par les critères définis dans "validation-creation.xml". Les deux champs sont indiqués obligatoires ("required") et le champ "quantite" est également indiqué numérique ("integer").
En cas d'erreur dans la validation, les messages d'erreur sont stockés dans la requête et l'application forwarde vers l'action d'affichage, soit celle spécifiée dans l'attribut input du mapping.
En cas de validation réussie, l'action de création "com.developpez.rpouiller.monapplication.CreerElementCoursesAction" est exécutée. Elle récupère le libellé et la quantité depuis le formulaire. Elle demande à la DAO de créer un nouvel enregistrement. Si tout s'est bien passé, elle demande de forwarder vers le mapping "succes" (action d'affichage). Ou en cas d'erreur, elle demande de forwarder vers le mapping "erreur" ("/pages/erreur.jsp").
La méthode "creerElementCourse" de la DAO "ListeCoursesDAO" crée un nouvel enregistrement dans la table "LISTECOURSES".