Una biblioteca para validar y mapear parámetros de solicitud para Scalatra.
Aviso: ¡Este proyecto ya no se mantiene porque se ha fusionado con Scalatra! Consulte la documentación de Scalatra para conocer los detalles.
Al principio, agregue la siguiente dependencia a su build.sbt para usar scalatra-forms.
libraryDependencies += " io.github.gitbucket " %% " scalatra-forms " % " 1.1.0 " A continuación, agregue ValidationJavaScriptProvider al Bootstrap de su aplicación Scalatra.
import io . github . gitbucket . scalatra . forms . _
class ScalatraBootstrap extends LifeCycle {
override def init ( context : ServletContext ) {
...
context.mount( new ValidationJavaScriptProvider , " /assets/js/* " )
...
}
}Scalatra-Forms ya está listo.
Definir un mapeo de formulario. Es similar a Play2, pero Scalatra-Forms es más 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) A continuación, cree un servlet (o filtro) que extienda ScalatraServlet (o ScalatraFilter). También se mezcló con FormSupport o ClientSideValidationFormSupport . El objeto al que se asignan los parámetros de solicitud se pasa como argumento de acción.
class RegisterServlet extends ScalatraServlet with ClientSideValidationFormSupport {
post( " /register " , form) { form : RegisterForm =>
...
}
}En HTML, debes hacer dos cosas a continuación.
<script> para importar jQuery que requiere validation.js<script> para importar validation.js, lo que ayuda a la validación del lado del cliente proporcionada por ValidationJavaScriptProvidervalidation="true" a su <form> scalatra-forms registra un detector de eventos de envío para validar el contenido del formulario. Este oyente publica todo el contenido del formulario en FORM_ACTION/validate . Scalatra-forms registra esta acción automáticamente para validar el contenido del formulario. Devuelve resultados de validación como JSON.
En el lado del cliente, scalatra-forms coloca mensajes de error en 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 > Puede crear Constraint personalizada.
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) También puede crear un validador de múltiples campos anulando validate(String, String, Map[String, String]) . Es posible buscar otros valores de campo mediante params .
Otra forma de crear un validador de múltiples campos es llamar verifying para el mapeo. Puede darle a la función validar la clase de caso asignada. Esta función toma el valor asignado y devuelve Seq[(String, String)] que contiene errores o 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
}
} Para la acción Ajax, utilice ajaxGet o ajaxPost en lugar de get o post . Las acciones definidas por ajaxGet o ajaxPost devuelven el resultado de la validación como respuesta JSON.
class RegisterServlet extends ScalatraServlet with ClientSideValidationFormSupport {
ajaxPost( " /register " , form) { form : RegisterForm =>
...
}
} En el lado del cliente, puede representar mensajes de error usando 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() y ajaxDelete() a ClientSidevalidationFormSupport .long .%s ) está disponible en los mensajes personalizados al igual que en los mensajes predeterminados.dummy() .long .list para propiedades no anidadas.dummy .verifying() para MappingValueType y elimine MappingConstraint en su lugar.length .MappingConstraint para validar el objeto convertido mediante MappingValueType .list() para SingleValueType .ValidationJavaScriptProvider agrega un encabezado Content-Type para validation.js.oneOf() que verifica si el valor es una de las cadenas especificadas.number() y double() de ResourceBundle.double() y date() .ValidationJavaScriptProvoider .list() para la propiedad List.validate(String, String, Map[String, String]) a Constraint . Permite acceder a otros parámetros en la validación de un solo campo.verify() a MappingValueType que valida la instancia asignada.