Библиотека для проверки и сопоставления параметров запроса для Scalatra.
Примечание. Этот проект больше не поддерживается, поскольку он был объединен со Scalatra! Подробности смотрите в документации Scalatra.
Сначала добавьте следующую зависимость в свой build.sbt, чтобы использовать скалатра-формы.
libraryDependencies += " io.github.gitbucket " %% " scalatra-forms " % " 1.1.0 "
Затем добавьте ValidationJavaScriptProvider
в Bootstrap вашего приложения Scalatra.
import io . github . gitbucket . scalatra . forms . _
class ScalatraBootstrap extends LifeCycle {
override def init ( context : ServletContext ) {
...
context.mount( new ValidationJavaScriptProvider , " /assets/js/* " )
...
}
}
scalatra-forms теперь готова.
Определите сопоставление формы. Это похоже на Play2, но скалатра-формы более гибкие.
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)
Затем создайте сервлет (или фильтр), расширяющий ScalatraServlet (или ScalatraFilter). Он также смешивался с FormSupport
или ClientSideValidationFormSupport
. Объект, которому сопоставлены параметры запроса, передается в качестве аргумента действия.
class RegisterServlet extends ScalatraServlet with ClientSideValidationFormSupport {
post( " /register " , form) { form : RegisterForm =>
...
}
}
В HTML вам нужно сделать две вещи, указанные ниже.
<script>
для импорта jQuery, который требуется для validation.js.<script>
для импорта validation.js, который помогает выполнять проверку на стороне клиента, предоставляемую ValidationJavaScriptProvider
validation="true"
в вашу <form>
scalatra-forms регистрирует прослушиватель событий отправки для проверки содержимого формы. Этот прослушиватель отправляет все содержимое формы в FORM_ACTION/validate
. Это действие автоматически регистрируется scalatra-forms для проверки содержимого формы. Он возвращает результаты проверки в формате JSON.
На стороне клиента scalatra-forms помещает сообщения об ошибках в 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 >
Вы можете создать собственное Constraint
.
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)
Вы также можете создать валидатор с несколькими полями, переопределив validate(String, String, Map[String, String])
. Можно найти другое значение поля через params
.
Другой способ создать валидатор с несколькими полями — вызвать verifying
сопоставления. Вы можете указать функцию для проверки сопоставленного класса регистра. Эта функция принимает сопоставленное значение и возвращает Seq[(String, String)]
, который содержит ошибки или 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
}
}
Для действия Ajax используйте ajaxGet
или ajaxPost
вместо get
или post
. Действия, определенные с помощью ajaxGet
или ajaxPost
возвращают результат проверки в виде ответа JSON.
class RegisterServlet extends ScalatraServlet with ClientSideValidationFormSupport {
ajaxPost( " /register " , form) { form : RegisterForm =>
...
}
}
На стороне клиента вы можете отображать сообщения об ошибках с помощью 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()
и ajaxDelete()
в ClientSidevalidationFormSupport
.long
типа значения.%s
) доступно в пользовательских сообщениях так же, как и в сообщениях по умолчанию.dummy()
.long
тип значения.list
для невложенных свойств.dummy
тип значения.verifying()
для MappingValueType
и удалите вместо нее MappingConstraint
.length
.MappingConstraint
для проверки преобразованного объекта с помощью MappingValueType
.list()
для SingleValueType
.ValidationJavaScriptProvider
добавляет заголовок Content-Type для validation.js.oneOf()
, которое проверяет, является ли значение одной из указанных строк.number()
и double()
из ResourceBundle.double()
и date()
.ValidationJavaScriptProvoider
.list()
для свойства List.validate(String, String, Map[String, String])
в Constraint
. Это позволяет получить доступ к другому параметру при проверке одного поля.verify()
в MappingValueType
, которая проверяет сопоставленный экземпляр.