XV. Exemple 12 - Conversions et validations diverses▲
La nouvelle application présente la saisie de divers éléments disposant de validateurs Struts :
- en [1], le formulaire de saisie
- en [2], la confirmation des saisies
L'application a un fonctionnement similaire aux précédentes aussi ne commenterons-nous que les points qui diffèrent.
XV-A. Le projet Netbeans▲
Le projet Netbeans est le suivant :
- en [1], les vues de l'application
- [Accueil.jsp] : la page d'accueil
- [FormDivers.jsp] : le formulaire de saisie
- [ConfirmationFormDivers.jsp] : la page de confirmation
- en [2], le fichier des messages [messages.properties] et le fichier de configuration principal de Struts
- en [3] :
- [FormDivers.java] : l'action qui affiche et traite le formulaire
- [FormDivers-validation.xml] : les règles de validation de l'action [FormDivers]. Ce fichier délègue ces validations au modèle.
- [FormDiversModel] : le modèle de l'action [FormDivers]
- [ FormDiversModel-validation.xml] : les règles de validation du modèle
- [FormDiversModel.properties] : le fichier des messages du modèle
- [example.xml] : fichier de configuration secondaire de Struts
XV-B. La configuration du projet▲
Le projet est principalement configuré par le fichier [example.xml] suivant :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
<?xml version="1.0" encoding="UTF-8" ?>
<!DOCTYPE struts PUBLIC
"-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
"http://struts.apache.org/dtds/struts-2.0.dtd"
>
<struts>
<package
name
=
"example"
namespace
=
"/example"
extends
=
"struts-default"
>
<action
name
=
"Accueil"
>
<result
name
=
"success"
>
/example/Accueil.jsp</result>
</action>
<action
name
=
"FormDivers"
class
=
"example.FormDivers"
>
<result
name
=
"input"
>
/example/FormDivers.jsp</result>
<result
name
=
"cancel"
type
=
"redirect"
>
/example/Accueil.jsp</result>
<result
name
=
"success"
>
/example/ConfirmationFormDivers.jsp</result>
</action>
</package>
</struts>
Il est analogue à celui qui a été étudié dans les version précédentes.
XV-C. Les fichiers des messages▲
Le fichier [messages.properties] est le suivant :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
Accueil.titre=Accueil
Accueil.message=Struts 2 - Conversions et validations
Accueil.FormDivers=Saisies diverses (email, url, chaine de caract\u00e8res avec contr\u00f4le du nombre de caract\u00e8res)
Form.titre=Conversions et validations
FormDivers.message=Struts 2 - Conversions et validations de types divers
Form.submitText=Valider
Form.cancelText=Annuler
Form.clearModel=Raz mod\u00e8le
Confirmation.titre=Confirmation
Confirmation.message=Confirmation des valeurs saisies
Confirmation.champ=champ
Confirmation.valeur=valeur
Confirmation.lien=Formulaire de test
xwork.default.invalid.fieldvalue=Valeur invalide pour le champ "{0}".
Le fichier [FormDiversModel.properties] est le suivant :
2.
3.
4.
5.
6.
email.prompt=1-Tapez une adresse \u00E9lectronique (x@y.z)
email.error=Format invalide
url.prompt=2-Tapez une url (http://www.ibm.com)
url.error=Format invalide
chaine.prompt=3-Tapez une chaine de 5 caract\u00E8res
chaine.error=Format invalide
XV-D. Le formulaire de saisie▲
La vue [FormDivers.jsp] est la suivante :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
<%@
page
contentType
=
"text/html; charset=UTF-8"
pageEncoding=
"UTF-8"
%>
<%@
taglib
prefix
=
"s"
uri
=
"/struts-tags"
%>
<html>
<head>
<title><s
:
text
name=
"Form.titre"
/></title>
<s
:
head
/>
</head>
<body background=
"<s:url value="
/ressources/standard.jpg
"/>"
>
<h2><s
:
text
name=
"FormDivers.message"
/></h2>
<s
:
form
name=
"formulaire"
action=
"FormDivers"
>
<s
:
textfield
name=
"email"
key=
"email.prompt"
size=
"30"
/>
<s
:
textfield
name=
"url1"
key=
"url.prompt"
size=
"30"
/>
<s
:
textfield
name=
"chaine"
key=
"chaine.prompt"
size=
"10"
/>
<s
:
submit
key=
"Form.submitText"
method=
"execute"
/>
</s
:
form
>
<br/>
<s
:
url
id=
"url"
action=
"FormDivers"
method=
"cancel"
/>
<s
:
a
href=
"%{url}"
><s
:
text
name=
"Form.cancelText"
/></s
:
a
>
<br/>
<s
:
url
id=
"url"
action=
"FormDivers"
method=
"clearModel"
/>
<s
:
a
href=
"%{url}"
><s
:
text
name=
"Form.clearModel"
/></s
:
a
>
</body>
</html>
Les lignes 12 à 14 sont les trois zones de saisie.
XV-E. La vue de confirmation▲
La vue de confirmation [ConfirmationFormDivers.jsp] est la suivante :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
<%@
page
contentType
=
"text/html; charset=UTF-8"
pageEncoding=
"UTF-8"
%>
<%@
taglib
prefix
=
"s"
uri
=
"/struts-tags"
%>
<html>
<head>
<title><s
:
text
name=
"Confirmation.titre"
/></title>
<s
:
head
/>
</head>
<body background=
"<s:url value="
/ressources/standard.jpg
"/>"
>
<h2><s
:
text
name=
"Confirmation.message"
/></h2>
<table border=
"1"
>
<tr>
<th><s
:
text
name=
"Confirmation.champ"
/></th>
<th><s
:
text
name=
"Confirmation.valeur"
/></th>
</tr>
<tr>
<td><s
:
text
name=
"email.prompt"
/></td>
<td><s
:
text
name=
"email"
/></td>
</tr>
<tr>
<td><s
:
text
name=
"url.prompt"
/></td>
<td><s
:
text
name=
"url1"
/></td>
</tr>
<tr>
<td><s
:
text
name=
"chaine.prompt"
/></td>
<td><s
:
text
name=
"chaine"
/></td>
</tr>
</table>
<br/>
<s
:
url
id=
"url"
action=
"FormDivers!input"
/>
<s
:
a
href=
"%{url}"
><s
:
text
name=
"Confirmation.lien"
/></s
:
a
>
</body>
</html>
XV-F. Le modèle [FormDiversModel]▲
Les champs de saisie du formulaire [FormDivers.jsp] sont injectés dans le modèle [FormDiversModel] suivant :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
package
example;
public
class
FormDiversModel {
// constructeur sans paramètre
public
FormDiversModel
(
) {
}
// champs
private
String email;
private
String url1 ;
private
String chaine;
// raz modèle
public
void
clearModel
(
) {
email =
null
;
url1 =
null
;
chaine =
null
;
}
// getters et setters
...
}
XV-G. La validation du modèle▲
La validation du modèle est contrôlée par deux fichiers : [FormDivers-validation.xml] et [FormDiversModel-validation.xml].
Le fichier [FormDivers-validation.xml] délègue les validations au fichier [FormDiversModel-validation.xml] suivant :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
<!--
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//
EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
-->
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//
EN"
"http://localhost:8084/exemple-10/example/xwork-validator-1.0.2.dtd"
>
<validators>
<field
name
=
"model"
>
<field-validator
type
=
"visitor"
>
<param
name
=
"appendPrefix"
>
false</param>
<message/>
</field-validator>
</field>
</validators>
Nous avons déjà rencontré ce fichier.
Le fichier [FormDateModel-validation.xml] contient les règles de validation suivantes :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
<!--
<!DOCTYPE validators PUBLIC "-//OpenSymphony Group//XWork Validator 1.0.2//
EN" "http://www.opensymphony.com/xwork/xwork-validator-1.0.2.dtd">
-->
<!DOCTYPE validators PUBLIC
"-//OpenSymphony Group//XWork Validator 1.0.2//
EN"
"http://localhost:8084/exemple-12/example/xwork-validator-1.0.2.dtd"
>
<validators>
<field
name
=
"email"
>
<field-validator
type
=
"requiredstring"
short-circuit
=
"true"
>
<message
key
=
"email.error"
/>
</field-validator>
<field-validator
type
=
"email"
short-circuit
=
"true"
>
<message
key
=
"email.error"
/>
</field-validator>
</field>
<field
name
=
"url1"
>
<field-validator
type
=
"requiredstring"
short-circuit
=
"true"
>
<message
key
=
"url.error"
/>
</field-validator>
<field-validator
type
=
"url"
short-circuit
=
"true"
>
<message
key
=
"url.error"
/>
</field-validator>
</field>
<field
name
=
"chaine"
>
<field-validator
type
=
"requiredstring"
short-circuit
=
"true"
>
<message
key
=
"chaine.error"
/>
</field-validator>
<field-validator
type
=
"stringlength"
short-circuit
=
"true"
>
<param
name
=
"minLength"
>
5</param>
<param
name
=
"maxLength"
>
5</param>
<message
key
=
"chaine.error"
/>
</field-validator>
</field>
</validators>
- lignes 11-18 : vérifient la validité du champ email
- lignes 15-17 : vérifient que la chaîne email est une adresse électronique valide
- lignes 20-27 : vérifient la validité du champ url1
- lignes 24-26 : vérifient que la chaîne url1 est une Url valide
- lignes 29-38 : vérifient la validité du champ chaine
- lignes 33-37 : vérifient que la chaîne chaine a 5 caractères exactement.
XV-H. L'action [FormDivers]▲
L'action [FormDivers] est la suivante :
2.
3.
4.
5.
6.
7.
8.
9.
10.
11.
12.
13.
14.
15.
16.
17.
18.
19.
20.
21.
22.
23.
24.
25.
26.
27.
28.
29.
30.
31.
32.
33.
34.
35.
36.
37.
38.
39.
40.
41.
42.
43.
44.
package
example;
import
com.opensymphony.xwork2.ActionSupport;
import
com.opensymphony.xwork2.ModelDriven;
import
java.util.Map;
import
org.apache.struts2.interceptor.SessionAware;
import
org.apache.struts2.interceptor.validation.SkipValidation;
public
class
FormDivers extends
ActionSupport implements
ModelDriven, SessionAware {
// constructeur sans paramètre
public
FormDivers
(
) {
}
// modèle de l'action
public
Object getModel
(
) {
if
(
session.get
(
"model"
) ==
null
) {
session.put
(
"model"
, new
FormDiversModel
(
));
}
return
session.get
(
"model"
);
}
@SkipValidation
public
String clearModel
(
) {
// raz du modèle
((
FormDiversModel) getModel
(
)).clearModel
(
);
// résultat
return
INPUT;
}
public
String cancel
(
) {
// on nettoie le modèle
((
FormDiversModel) getModel
(
)).clearModel
(
);
// résultat
return
"cancel"
;
}
// SessionAware
Map<
String, Object>
session;
public
void
setSession
(
Map<
String, Object>
session) {
this
.session =
session;
}
}
L'action [FormDivers] est bâtie sur le même modèle que les actions étudiées précédemment. Ici, il n'y a simplement pas de méthode validate pour compléter la validation faite par le fichier [FormDiversModel-validation.xml].