Uma biblioteca para validar e mapear parâmetros de solicitação para Scalatra.
Aviso: Este projeto não é mais mantido porque foi incorporado ao Scalatra! Consulte a documentação do Scalatra para saber detalhes.
Primeiramente, adicione a seguinte dependência ao seu build.sbt para usar o scalatra-forms.
libraryDependencies += " io.github.gitbucket " %% " scalatra-forms " % " 1.1.0 "
Em seguida, adicione ValidationJavaScriptProvider
ao Bootstrap da sua aplicação Scalatra.
import io . github . gitbucket . scalatra . forms . _
class ScalatraBootstrap extends LifeCycle {
override def init ( context : ServletContext ) {
...
context.mount( new ValidationJavaScriptProvider , " /assets/js/* " )
...
}
}
scalatra-forms agora está pronto.
Defina um mapeamento de formulário. É semelhante ao Play2, mas o scalatra-forms é mais flexível.
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)
Em seguida, crie um servlet (ou filtro) que estenda ScalatraServlet (ou ScalatraFilter). Também misturado em FormSupport
ou ClientSideValidationFormSupport
. O objeto que tem parâmetros de solicitação mapeados é passado como argumento de ação.
class RegisterServlet extends ScalatraServlet with ClientSideValidationFormSupport {
post( " /register " , form) { form : RegisterForm =>
...
}
}
No HTML, você deve fazer duas coisas abaixo.
<script>
para importar jQuery que é exigido por validação.js<script>
para importar validação.js que ajuda na validação do lado do cliente fornecida por ValidationJavaScriptProvider
validation="true"
ao seu <form>
scalatra-forms registra um ouvinte de evento de envio para validar o conteúdo do formulário. Este ouvinte posta todo o conteúdo do formulário em FORM_ACTION/validate
. Esta ação é registrada automaticamente pelo scalatra-forms para validar o conteúdo do formulário. Ele retorna resultados de validação como JSON.
No lado do cliente, scalatra-forms coloca mensagens de erro em 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 >
Você pode criar Constraint
personalizado.
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)
Você também pode criar um validador de vários campos substituindo validate(String, String, Map[String, String])
. É possível procurar outros valores de campo via params
.
Outra maneira de criar um validador de vários campos é chamar verifying
para mapeamento. Você pode fornecer a função para validar a classe de caso mapeada. Esta função pega o valor mapeado e retorna Seq[(String, String)]
que contém erros 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
}
}
Para a ação Ajax, use ajaxGet
ou ajaxPost
em vez de get
ou post
. As ações definidas por ajaxGet
ou ajaxPost
retornam o resultado da validação como resposta JSON.
class RegisterServlet extends ScalatraServlet with ClientSideValidationFormSupport {
ajaxPost( " /register " , form) { form : RegisterForm =>
...
}
}
No lado do cliente, você pode renderizar mensagens de erro 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()
e ajaxDelete()
a ClientSidevalidationFormSupport
.long
.%s
) está disponível em mensagens personalizadas da mesma forma que nas mensagens padrão.dummy()
.long
.list
para propriedades não aninhadas.dummy
.verifying()
para MappingValueType
e remova MappingConstraint
em vez dele.length
.MappingConstraint
para validar o objeto convertido por MappingValueType
.list()
para SingleValueType
.ValidationJavaScriptProvider
adiciona cabeçalho Content-Type para validação.js.oneOf()
que verifica se o valor é uma das strings especificadas.number()
e double()
do ResourceBundle.double()
e date()
.ValidationJavaScriptProvoider
.list()
para a propriedade List.validate(String, String, Map[String, String])
a Constraint
. Possibilita acessar outros parâmetros na validação de campo único.verify()
a MappingValueType
que valida a instância mapeada.