ไลบรารีสำหรับตรวจสอบและแมปพารามิเตอร์คำขอสำหรับ 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 ซึ่งช่วยในการตรวจสอบฝั่งไคลเอ็นต์โดย ValidationJavaScriptProvider
validation="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.gitbucket
put()
, delete()
, ajaxPut()
และ ajaxDelete()
ไปยัง ClientSidevalidationFormSupport
long
%s
) มีอยู่ในข้อความที่กำหนดเองเช่นเดียวกับข้อความเริ่มต้นdummy()
long
list
สำหรับคุณสมบัติที่ไม่ซ้อนกันdummy
verifying()
สำหรับ MappingValueType
และลบ MappingConstraint
แทนlength
MappingConstraint
เพื่อตรวจสอบวัตถุที่แปลงแล้วโดย MappingValueType
list()
สำหรับ SingleValueType
ValidationJavaScriptProvider
เพิ่มส่วนหัว Content-Type สำหรับ validation.jsoneOf()
ซึ่งจะตรวจสอบว่าค่าเป็นหนึ่งในสตริงที่ระบุหรือไม่number()
และ double()
จาก ResourceBundledouble()
และ date()
ValidationJavaScriptProvoider
list()
สำหรับคุณสมบัติ Listvalidate(String, String, Map[String, String])
ให้กับ Constraint
ทำให้สามารถเข้าถึงพารามิเตอร์อื่น ๆ ในการตรวจสอบฟิลด์เดียวได้verify()
ให้กับ MappingValueType
ซึ่งจะตรวจสอบอินสแตนซ์ที่แมป