Le Commons Validator utilisé dans Struts est un outil extrêmement utile. Non seulement il permet de générer automatiquement les contrôles JavaScript côté client et les contrôles Java côté serveur, mais il permet surtout de factoriser (et réutiliser) ces contrôles.

J’ai écrit il y a quelque temps un nouveau type de contrôle que je publie ici librement sous la licence GPL.

Certains formulaires contiennent des champs que j’appelle de confirmation. Ce sont des champs qui demandent à l’utilisateur de saisir deux fois une information pour s’assurer de la validité de la saisie (surtout pour éviter les fautes de frappe). Cela s’avère très utile pour les champs de saisie de mot de passe ou d’adresse email.

Les contrôles offerts en standard dans Struts ne permettent pas de réaliser de type de contrôle. C’est pour cela que j’ai écrit un patch pour Struts et Commons Validator.

Voici un exemple d’utilisation :

Si vous avez ce genre de formulaire :

<html:javascript formName="userForm" />
<html:form action="/user.do" focus="username" onsubmit="return validateUserForm(this);">
<html:hidden property="id" />
<ul>
	<li>
		<logic:present name="userForm" property="username">
			<bean:message key="profile.username" /> : <html:text property="username" readonly="true" />
		</logic:present>
		<logic:notPresent name="userForm" property="username">
			<bean:message key="profile.username" /> : <html:text property="username" />
		</logic:notPresent>
	</li>
	<li><bean:message key="profile.password" /> : <html:password property="password" redisplay="false" /></li>
	<li><bean:message key="profile.cpassword" /> : <html:password property="confirmpassword" redisplay="false" /></li>
	<li><bean:message key="profile.firstname" /> : <html:text property="firstname" /></li>
	<li><bean:message key="profile.lastname" /> : <html:text property="lastname" /></li>
	<li><bean:message key="profile.email" /> : <html:text property="email" /></li> </ul>
<logic:present name="userForm" property="username">
	<html:submit property="action"><bean:message key="user.update" /></html:submit>
</logic:present> <logic:notPresent name="userForm" property="username">
	<html:submit property="action"><bean:message key="user.create" /></html:submit>
</logic:notPresent>
<html:reset />
</html:form>

Il suffit de paramétrer le validator (validation.xml) ainsi[1] :

<formset>
	<form name="userForm">
		<field property="username" depends="required,mask,minlength,maxlength">
			<arg0 key="profile.username"/>
			<arg1 name="minlength" key="${var:minlength}" resource="false" />
			<arg1 name="maxlength" key="${var:maxlength}" resource="false" />
			<var>
				<var-name>mask</var-name>
				<var-value>^0-9a-zA-Z*$</var-value>
			</var>
			<var>
				<var-name>minlength</var-name>
				<var-value>4</var-value>
			</var>
			<var>
				<var-name>maxlength</var-name>
				<var-value>16</var-value>
			</var>
		</field>
		<field property="password" depends="required,minlength,maxlength">
			<arg0 key="profile.password"/>
			<arg1 name="minlength" key="${var:minlength}" resource="false" />
			<arg1 name="maxlength" key="${var:maxlength}" resource="false" />
			<var>
				<var-name>minlength</var-name>
				<var-value>8</var-value>
			</var>
			<var>
				<var-name>maxlength</var-name>
				<var-value>16</var-value>
			</var>
		</field>
		<field property="confirmpassword" depends="required,minlength,maxlength,compareTo">
			<arg0 key="profile.cpassword"/>
			<arg1 name="minlength" key="${var:minlength}" resource="false" />
			<arg1 name="maxlength" key="${var:maxlength}" resource="false" />
			<arg1 name="compareTo" key="profile.password" />
			<var>
				<var-name>minlength</var-name>
				<var-value>8</var-value>
			</var>
			<var>
				<var-name>maxlength</var-name>
				<var-value>16</var-value>
			</var>
			<var>
				<var-name>compareTo</var-name>
				<var-value>password</var-value>
			</var>
		</field>
		<field property="firstname" depends="required">
			<arg0 key="profile.firstname"/>
		</field>
		<field property="lastname" depends="required">
			<arg0 key="profile.lastname"/>
		</field>
		<field property="email" depends="required,email">
			<arg0 key="profile.email"/>
		</field>
	</form>
</formset>

Notes

[1] Ce qui est intéressant ici, c’est le champ confirmpassword avec le contrôle compareTo.