Play framework 1.2x + Scalaで配列やオブジェクトをPOSTする

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

Play-ScalaでPOST

このあたりをみればわかりますが、PlayframeworkではPOSTした値を簡単にバインディングできる仕組みをもっており、
コントローラーのメソッドの引数へフォームの値の受け渡しを簡単に行うことができます。
play-scalaでも同じようにバインディングは可能で、今回配列やオブジェクトへのバインディングをおこなったのでメモしておきます。

今回使用した動作環境は以下のとおりです。

  • OS : MacOS X 10.7.4
  • Playframework : 1.2.1
  • Play-Scala : 0.9.1
  • Java : 1.6.0_31

プロジェクトの準備

play1.2をインストールし、パスをとおしておいてください。
そしてplay-scalaをインストールします。

$ play install scala

bindSampleという名前でScalaプロジェクトを作成します。

$ play new bindSample --with scala

配列へのバインド

パラメータとして、カンマ区切りでわたされた文字列を配列にバインドしてみます。
デフォルトで生成されたコントローラー、app/controllers/controllers.scalaを下記のように変更しましょう。

・・・
import play.data.binding.As

object Application extends Controller {
  def arrayBind(@As(Array(",")) paramArray: Array[String]) = {
    paramArray.map(println)
    html.index("Your Scala application is ready!")
  }
}

Asアノテーションを使用すると、パラメータの内容を解析し、引数で指定された文字で分割します。
各文字列は、Arrayに格納されます。

conf/routesファイルにパスを追加します。

GET     /bindArray             Application.arrayBind

play runでアプリケーションを起動し、ブラウザからカンマ区切りのパラメータを渡してアクセスしてみましょう。
コンソールでString配列の値が表示されます。

http://localhost:9000/?paramArray=1,2,3

オブジェクトへのバインド

オブジェクトのコレクションを一度に渡すことも可能です。 Applicationにメソッドを追加し、クラスを追加します。

・・・
object Application extends Controller {
  def objBind(objList: java.util.List[User]) = {
     println(objList)
     html.index("Your Scala application is ready!")
  }
・・・
}

case class User(name:String,age:Int)

Userクラスをcontroller.scala内に定義し、objBindにはそのリストを渡します。
ScalaのListはバインドされないので、java.util.Listを明示的に指定しています。

conf/routesファイルにパスを追加します。

GET     /obj                                       Application.objBind

play runでアプリケーションを起動し、ブラウザからパラメータを渡してアクセスしてみましょう。
Userオブジェクトを2つ同時にパラメータで指定して渡してみます。
「引数の名前[インデックス].フィールド名=値」として指定すればパラメータを渡すことができます。

http://localhost:9000/obj?objList[0].name=taro&objList[0].age=20&objList[1].name=hanako&objList[1].age=25

//結果のコンソール
[User(taro,20), User(hanako,25)]

オブジェクトのコレクションも簡単に渡すことができます。
JSを使用しても、上記のようにクエリパラメータを指定すればバインドさせることができます。