Scalatra のリクエスト パラメーターを検証してマップするためのライブラリ。
注意:このプロジェクトは Scalatra にマージされたため、維持されなくなりました。詳細については、Scalatra のドキュメントを参照してください。
まず、scalatra-forms を使用するために次の依存関係を build.sbt に追加します。
libraryDependencies += " io.github.gitbucket " %% " scalatra-forms " % " 1.1.0 "
次に、 ValidationJavaScriptProvider
Scalatra アプリケーションの Bootstrap に追加します。
import io . github . gitbucket . scalatra . forms . _
class ScalatraBootstrap extends LifeCycle {
override def init ( context : ServletContext ) {
...
context.mount( new ValidationJavaScriptProvider , " /assets/js/* " )
...
}
}
これで scalatra-forms の準備が整いました。
フォームマッピングを定義します。これは Play2 に似ていますが、scalatra-forms の方が柔軟性があります。
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 では、以下の 2 つのことを行う必要があります。
<script>
を追加します。ValidationJavaScriptProvider
によって提供されるクライアント側の検証に役立つ validation.js をインポートするために<script>
を追加します。<form>
にvalidation="true"
追加します。 scalatra-forms は、フォームの内容を検証するために送信イベント リスナーを登録します。このリスナーは、すべてのフォームの内容をFORM_ACTION/validate
にポストします。このアクションは、フォームの内容を検証するために scalatra-forms によって自動的に登録されます。検証結果は 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
を呼び出すことです。マップされたケースクラスを検証する関数を与えることができます。この関数はマップされた値を受け取り、エラーまたはNil
含むSeq[(String, String)]
を返します。
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 アクションの場合は、 get
またはpost
代わりにajaxGet
またはajaxPost
を使用します。 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
値の型を追加します。MappingValueType
のverifying()
修正し、代わりにMappingConstraint
削除します。length
制約を追加します。MappingConstraint
を追加して、変換されたオブジェクトをMappingValueType
によって検証します。SingleValueType
のlist()
マッピングを追加します。ValidationJavaScriptProvider
validation.js の Content-Type ヘッダーを追加します。oneOf()
制約を追加します。number()
およびdouble()
のエラー メッセージを取得するように修正しました。double()
とdate()
マッピングを追加します。ValidationJavaScriptProvoider
を追加します。list()
マッピングを追加します。validate(String, String, Map[String, String])
をConstraint
に追加します。単一フィールド検証で他のパラメータにアクセスできるようになります。verify()
をMappingValueType
に追加します。