Une bibliothèque pour valider et mapper les paramètres de requête pour Scalatra.
Remarque : Ce projet n'est plus maintenu car il a été fusionné dans Scalatra ! Consultez la documentation Scalatra pour connaître les détails.
Dans un premier temps, ajoutez la dépendance suivante dans votre build.sbt pour utiliser scalatra-forms.
libraryDependencies += " io.github.gitbucket " %% " scalatra-forms " % " 1.1.0 "
Ensuite, ajoutez ValidationJavaScriptProvider
au Bootstrap de votre application Scalatra.
import io . github . gitbucket . scalatra . forms . _
class ScalatraBootstrap extends LifeCycle {
override def init ( context : ServletContext ) {
...
context.mount( new ValidationJavaScriptProvider , " /assets/js/* " )
...
}
}
scalatra-forms est maintenant prêt.
Définissez un mappage de formulaire. C'est similaire à Play2, mais scalatra-forms est plus flexible.
import io . github . gitbucket . scalatra . forms . _
case class RegisterForm ( name : String , description : String )
val form = mapping(
" name " -> text(required, maxlength( 40 )),
" description " -> text()
)( RegisterForm .apply)
Ensuite, créez un servlet (ou filtre) qui étend ScalatraServlet (ou ScalatraFilter). Il est également mélangé à FormSupport
ou ClientSideValidationFormSupport
. L'objet qui correspond aux paramètres de requête mappés est passé comme argument d'action.
class RegisterServlet extends ScalatraServlet with ClientSideValidationFormSupport {
post( " /register " , form) { form : RegisterForm =>
...
}
}
Dans le HTML, vous devez faire deux choses ci-dessous.
<script>
pour importer jQuery qui est requis par validation.js<script>
pour importer validation.js qui facilite la validation côté client fournie par ValidationJavaScriptProvider
validation="true"
à votre <form>
scalatra-forms enregistre un écouteur d'événement de soumission pour valider le contenu du formulaire. Cet écouteur publie tout le contenu du formulaire dans FORM_ACTION/validate
. Cette action est enregistrée automatiquement par scalatra-forms pour valider le contenu du formulaire. Il renvoie les résultats de validation au format JSON.
Côté client, scalatra-forms place les messages d'erreur dans span#error-FIELD_NAME
.
< script src = " http://code.jquery.com/jquery-2.0.3.min.js " ></ script >
< script src = " /assets/js/validation.js " ></ script >
...
< form method = " POST " action = " /register " validation = " true " >
Name : < input type = " name " type = " text " >
< span class = " error " id = " error-name " ></ span >
< br />
Description : < input type = " description " type = " text " >
< span class = " error " id = " error-description " ></ span >
< br />
< input type = " submit " value = " Register " />
</ form >
Vous pouvez créer Constraint
personnalisée.
def identifier : Constraint = new Constraint (){
override def validate ( name : String , value : String ) : Option [ String ] =
if ( ! value.matches( " ^[a-zA-Z0-9 \ -_]+$ " )){
Some ( s " ${name} contains invalid character. " )
} else {
None
}
}
val form = mapping(
" name " -> text(required, identifier),
" description " -> text()
)( RegisterForm .apply)
Vous pouvez également créer un validateur multi-champs en remplaçant validate(String, String, Map[String, String])
. Il est possible de rechercher une autre valeur de champ via params
.
Une autre façon de créer un validateur multi-champs consiste à appeler verifying
du mappage. Vous pouvez donner à la fonction la validation de la classe de cas mappée. Cette fonction prend la valeur mappée et renvoie Seq[(String, String)]
qui contient des erreurs ou Nil
.
val form = mapping(
" reason " -> number(required),
" description " -> optional(text)
)( ReasonForm .apply).verifying { value =>
if (value.reason == 4 && value.descripsion){
Seq ( " description " -> " If reason is 'Other' then description is required. " )
} else {
Nil
}
}
Pour l'action Ajax, utilisez ajaxGet
ou ajaxPost
au lieu de get
ou post
. Les actions définies par ajaxGet
ou ajaxPost
renvoient le résultat de validation sous forme de réponse JSON.
class RegisterServlet extends ScalatraServlet with ClientSideValidationFormSupport {
ajaxPost( " /register " , form) { form : RegisterForm =>
...
}
}
Côté client, vous pouvez afficher les messages d'erreur en utilisant displayErrors()
.
$ ( '#register' ) . click ( function ( e ) {
$ . ajax ( $ ( this ) . attr ( 'action' ) , {
type : 'POST' ,
data : {
name : $ ( '#name' ) . val ( ) ,
description : $ ( '#description' ) . val ( )
}
} )
. done ( function ( data ) {
$ ( '#result' ) . text ( 'Registered!' ) ;
} )
. fail ( function ( data , status ) {
displayErrors ( $ . parseJSON ( data . responseText ) ) ;
} ) ;
} ) ;
io.github.gitbucket
.put()
, delete()
, ajaxPut()
et ajaxDelete()
à ClientSidevalidationFormSupport
.long
.%s
) est disponible dans les messages personnalisés comme dans les messages par défaut.dummy()
.long
.list
pour les propriétés non imbriquées.dummy
.verifying()
pour MappingValueType
et supprimez MappingConstraint
à la place.length
.MappingConstraint
pour valider l'objet converti par MappingValueType
.list()
pour SingleValueType
.ValidationJavaScriptProvider
ajoute l'en-tête Content-Type pour validation.js.oneOf()
qui vérifie si la valeur fait partie des chaînes spécifiées.number()
et double()
depuis ResourceBundle.double()
et date()
.ValidationJavaScriptProvoider
.list()
pour la propriété List.validate(String, String, Map[String, String])
à Constraint
. Il permet d'accéder à d'autres paramètres en validation sur un seul champ.verify()
à MappingValueType
qui valide l'instance mappée.