Pustaka untuk memvalidasi dan memetakan parameter permintaan untuk Scalatra.
Pemberitahuan: Proyek ini tidak lagi dipertahankan karena telah digabungkan ke dalam Scalatra! Lihat dokumentasi Scalatra untuk mengetahui detailnya.
Pertama-tama, tambahkan ketergantungan berikut ke build.sbt Anda untuk menggunakan formulir skalara.
libraryDependencies += " io.github.gitbucket " %% " scalatra-forms " % " 1.1.0 "
Selanjutnya, tambahkan ValidationJavaScriptProvider
ke Bootstrap aplikasi Scalatra Anda.
import io . github . gitbucket . scalatra . forms . _
class ScalatraBootstrap extends LifeCycle {
override def init ( context : ServletContext ) {
...
context.mount( new ValidationJavaScriptProvider , " /assets/js/* " )
...
}
}
formulir skalara sekarang sudah siap.
Tentukan pemetaan formulir. Ini mirip dengan Play2, tetapi bentuk skalara lebih fleksibel.
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)
Selanjutnya, buat servlet (atau filter) yang memperluas ScalatraServlet (atau ScalatraFilter). Itu juga dicampur dalam FormSupport
atau ClientSideValidationFormSupport
. Objek yang dipetakan parameter permintaan diteruskan sebagai argumen tindakan.
class RegisterServlet extends ScalatraServlet with ClientSideValidationFormSupport {
post( " /register " , form) { form : RegisterForm =>
...
}
}
Dalam HTML, Anda harus melakukan dua hal di bawah ini.
<script>
untuk mengimpor jQuery yang diperlukan oleh validation.js<script>
untuk mengimpor validation.js yang membantu validasi sisi klien yang disediakan oleh ValidationJavaScriptProvider
validation="true"
ke <form>
Anda scalatra-forms mendaftarkan pendengar acara kiriman untuk memvalidasi isi formulir. Pendengar ini memposting semua isi formulir ke FORM_ACTION/validate
. Tindakan ini didaftarkan oleh scalatra-forms secara otomatis untuk memvalidasi isi formulir. Ini mengembalikan hasil validasi sebagai JSON.
Di sisi klien, scalatra-forms memasukkan pesan kesalahan ke 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 >
Anda dapat membuat Constraint
khusus.
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)
Anda juga dapat membuat validator multi bidang dengan mengganti validate(String, String, Map[String, String])
. Dimungkinkan untuk mencari nilai bidang lain melalui params
.
Cara lain untuk membuat validator multi bidang adalah dengan memanggil verifying
untuk pemetaan. Anda dapat memberikan fungsi untuk memvalidasi kelas kasus yang dipetakan. Fungsi ini mengambil nilai yang dipetakan dan mengembalikan Seq[(String, String)]
yang mengandung kesalahan atau 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
}
}
Untuk tindakan Ajax, gunakan ajaxGet
atau ajaxPost
alih-alih get
atau post
. Tindakan yang ditentukan oleh ajaxGet
atau ajaxPost
mengembalikan hasil validasi sebagai respons JSON.
class RegisterServlet extends ScalatraServlet with ClientSideValidationFormSupport {
ajaxPost( " /register " , form) { form : RegisterForm =>
...
}
}
Di sisi klien, Anda dapat merender pesan kesalahan menggunakan 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()
dan ajaxDelete()
ke ClientSidevalidationFormSupport
.long
.%s
) tersedia dalam pesan khusus sama seperti pesan default.dummy()
.long
.list
untuk properti yang tidak bersarang.dummy
.verifying()
untuk MappingValueType
dan hapus MappingConstraint
sebagai gantinya.length
.MappingConstraint
untuk memvalidasi objek yang dikonversi dengan MappingValueType
.list()
untuk SingleValueType
.ValidationJavaScriptProvider
menambahkan header Tipe Konten untuk validation.js.oneOf()
yang memeriksa apakah nilainya adalah salah satu string yang ditentukan.number()
dan double()
dari ResourceBundle.double()
dan date()
.ValidationJavaScriptProvoider
.list()
untuk properti Daftar.validate(String, String, Map[String, String])
ke Constraint
. Memungkinkan untuk mengakses parameter lain dalam validasi bidang tunggal.verify()
ke MappingValueType
yang memvalidasi instance yang dipetakan.