Eine Bibliothek zur Validierung und Zuordnung von Anforderungsparametern für Scalatra.
Hinweis: Dieses Projekt wird nicht mehr gepflegt, da es in Scalatra integriert wurde! Weitere Informationen finden Sie in der Scalatra-Dokumentation.
Fügen Sie zunächst die folgende Abhängigkeit zu Ihrer build.sbt hinzu, um scalatra-forms zu verwenden.
libraryDependencies += " io.github.gitbucket " %% " scalatra-forms " % " 1.1.0 " Als nächstes fügen Sie ValidationJavaScriptProvider zum Bootstrap Ihrer Scalatra-Anwendung hinzu.
import io . github . gitbucket . scalatra . forms . _
class ScalatraBootstrap extends LifeCycle {
override def init ( context : ServletContext ) {
...
context.mount( new ValidationJavaScriptProvider , " /assets/js/* " )
...
}
}scalatra-forms ist jetzt fertig.
Definieren Sie eine Formularzuordnung. Es ähnelt Play2, scalatra-forms ist jedoch flexibler.
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) Als nächstes erstellen Sie ein Servlet (oder einen Filter), das ScalatraServlet (oder ScalatraFilter) erweitert. Es wurde auch FormSupport oder ClientSideValidationFormSupport eingemischt. Das Objekt, dem Anforderungsparameter zugeordnet sind, wird als Aktionsargument übergeben.
class RegisterServlet extends ScalatraServlet with ClientSideValidationFormSupport {
post( " /register " , form) { form : RegisterForm =>
...
}
}Im HTML müssen Sie unten zwei Dinge tun.
<script> hinzu, um jQuery zu importieren, das für validation.js erforderlich ist<script> zu import validation.js hinzu, um die von ValidationJavaScriptProvider bereitgestellte clientseitige Validierung zu unterstützenvalidation="true" zu Ihrem <form> hinzu scalatra-forms registriert einen Submit-Ereignis-Listener, um Formularinhalte zu validieren. Dieser Listener sendet den gesamten Formularinhalt an FORM_ACTION/validate . Diese Aktion wird von scalatra-forms automatisch registriert, um Formularinhalte zu validieren. Es gibt Validierungsergebnisse als JSON zurück.
Auf der Clientseite fügt scalatra-forms Fehlermeldungen in span#error-FIELD_NAME ein.
< 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 > Sie können eine benutzerdefinierte Constraint erstellen.
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) Sie können auch einen Mehrfeldvalidator erstellen, indem Sie validate(String, String, Map[String, String]) überschreiben. Es ist möglich, andere Feldwerte über params nachzuschlagen.
Eine andere Möglichkeit, einen Multifeld-Validator zu erstellen, besteht darin, verifying für die Zuordnung aufzurufen. Sie können der Funktion die Validierung der zugeordneten Fallklasse zuweisen. Diese Funktion nimmt den zugeordneten Wert und gibt Seq[(String, String)] zurück, der Fehler oder Nil enthält.
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
}
} Verwenden Sie für die Ajax-Aktion ajaxGet oder ajaxPost anstelle von get oder post . Durch ajaxGet oder ajaxPost definierte Aktionen geben das Validierungsergebnis als JSON-Antwort zurück.
class RegisterServlet extends ScalatraServlet with ClientSideValidationFormSupport {
ajaxPost( " /register " , form) { form : RegisterForm =>
...
}
} Auf der Clientseite können Sie Fehlermeldungen mit displayErrors() rendern.
$ ( '#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() und ajaxDelete() zu ClientSidevalidationFormSupport hinzu.long Werttyp.%s ) sind in benutzerdefinierten Nachrichten genauso verfügbar wie in Standardnachrichten.dummy() -Fehlers.long Werttyp hinzu.list für nicht verschachtelte Eigenschaften behoben.dummy Werttyp hinzu.verifying() für MappingValueType und entfernen Sie stattdessen MappingConstraint .length hinzufügen.MappingConstraint hinzu, um das konvertierte Objekt anhand von MappingValueType zu validieren.list() -Zuordnung für SingleValueType hinzufügen.ValidationJavaScriptProvider fügt Content-Type-Header für validation.js hinzu.oneOf() hinzu, die prüft, ob der Wert einer der angegebenen Strings ist.number() und double() aus ResourceBundle.double() und date() hinzu.ValidationJavaScriptProvoider hinzu.list() -Zuordnung für List-Eigenschaft hinzufügen.validate(String, String, Map[String, String]) zu Constraint hinzu. Es ermöglicht den Zugriff auf andere Parameter bei der Einzelfeldvalidierung.verify() zu MappingValueType hinzu, um die zugeordnete Instanz zu validieren.