ไลบรารีสำหรับตรวจสอบและแมปพารามิเตอร์คำขอสำหรับ 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/* " )
...
}
}ตอนนี้แบบฟอร์มสกาลาตร้าพร้อมแล้ว
กำหนดการแมปแบบฟอร์ม มันคล้ายกับ 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 ซึ่งช่วยในการตรวจสอบฝั่งไคลเอ็นต์โดย ValidationJavaScriptProvidervalidation="true" ให้กับ <form> ของคุณ salatra-forms ลงทะเบียน Listener เหตุการณ์การส่งเพื่อตรวจสอบเนื้อหาของแบบฟอร์ม Listener นี้โพสต์เนื้อหาแบบฟอร์มทั้งหมดไปที่ FORM_ACTION/validate การดำเนินการนี้ได้รับการลงทะเบียนโดยแบบฟอร์มสกาลาตร้าโดยอัตโนมัติเพื่อตรวจสอบเนื้อหาของแบบฟอร์ม ส่งคืนผลลัพธ์การตรวจสอบเป็น 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.gitbucketput() , delete() , ajaxPut() และ ajaxDelete() ไปยัง ClientSidevalidationFormSupportlong%s ) มีอยู่ในข้อความที่กำหนดเองเช่นเดียวกับข้อความเริ่มต้นdummy()longlist สำหรับคุณสมบัติที่ไม่ซ้อนกันdummyverifying() สำหรับ MappingValueType และลบ MappingConstraint แทนlengthMappingConstraint เพื่อตรวจสอบวัตถุที่แปลงแล้วโดย MappingValueTypelist() สำหรับ SingleValueTypeValidationJavaScriptProvider เพิ่มส่วนหัว Content-Type สำหรับ validation.jsoneOf() ซึ่งจะตรวจสอบว่าค่าเป็นหนึ่งในสตริงที่ระบุหรือไม่number() และ double() จาก ResourceBundledouble() และ date()ValidationJavaScriptProvoiderlist() สำหรับคุณสมบัติ Listvalidate(String, String, Map[String, String]) ให้กับ Constraint ทำให้สามารถเข้าถึงพารามิเตอร์อื่น ๆ ในการตรวจสอบฟิลด์เดียวได้verify() ให้กับ MappingValueType ซึ่งจะตรวจสอบอินสแตนซ์ที่แมป