مكتبة للتحقق من صحة وتعيين معلمات الطلب لـ Scalatra.
ملاحظة: لم يعد يتم الحفاظ على هذا المشروع لأنه تم دمجه في Scalatra! راجع وثائق Scalatra لمعرفة التفاصيل.
في البداية، أضف التبعية التالية إلى build.sbt الخاص بك لاستخدام نماذج scalatra.
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 جاهزة الآن.
تحديد تعيين النموذج. إنه مشابه لـ Play2، لكن أشكال Scalatra أكثر مرونة.
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)
بعد ذلك، قم بإنشاء servlet (أو مرشح) الذي يمتد 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 رسائل الخطأ في 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
رأس نوع المحتوى لـ validation.js.oneOf()
الذي يتحقق مما إذا كانت القيمة إحدى السلاسل المحددة.number()
و double()
من ResourceBundle.double()
date()
.ValidationJavaScriptProvoider
.list()
لخاصية القائمة.validate(String, String, Map[String, String])
إلى Constraint
. يجعل من الممكن الوصول إلى معلمة أخرى في التحقق من صحة حقل واحد.verify()
إلى MappingValueType
الذي يتحقق من صحة المثيل المعين.