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 ValidationJavaScriptProvidervalidation="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.