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