Hatena::ブログ(Diary)

すにぺっと

2011-04-16

play-scalaを改めて学ぶ-2 Getting Start

| 13:57 | play-scalaを改めて学ぶ-2 Getting Startを含むブックマーク

http://scala.playframework.org/documentation/scala-0.9/home

のGetting Startをちょろちょろすすめる。

目次は

1.Installing Scala support for Play

2.‘Hello World’ tutorial — Your first Play Scala application

3.Learning Scala with Play

とあり、1はインストールおよびセッティング。

いままでとあまり変わらないので問題なし。

ちなみにScalaのバージョンは2.8.1。


次は

Hello Worldチュートリアル.

play1.2とscalaモジュールインストールしておく。

んで、プロジェクト作成。

$ play new helloworld --with scala
~        _            _ 
~  _ __ | | __ _ _  _| |
~ | '_ \| |/ _' | || |_|
~ |  __/|_|\____|\__ (_)
~ |_|            |__/   
~
~ play! 1.2, http://www.playframework.org
~
~ The new application will be created in $HOME/helloworld
~ What is the application name? [helloworld] 
~
Picked up _JAVA_OPTIONS: -Dfile.encoding=UTF-8
~ Resolving dependencies using $HOME/helloworld/conf/dependencies.yml,
~
~ 	play->scala 0.9 (from playLocalModules)
~
~ Installing resolved dependencies,
~
~ 	modules/scala-0.9 -> $PLAY_HOME/play-1.2/modules/scala-0.9
~ 	lib/commons-collections-3.2.1.jar
~ 	lib/commons-logging-1.1.1.jar
~
~ Done!
~
~ OK, the application is created.
~ Start it with : play run helloworld
~ Have fun!
~

いままでどおり、play new でプロジェクト作成。

appディレクトリ以下にはscalaファイルが置かれる。

デフォルトでは controllers.scalaが作られる。

それ以外もいままでと特に変わらず。

では実行。

$ play run helloworld

localhost:9000にアクセスすれば

今までと同じ、ローカルのチュートリアルアプリが表示される。


ではチュートリアル内にあるように、

フォームアプリを作成してみる。

helloworld/app/views/Application/index.html

を下記のように。

#{extends 'main.html' /}
#{set title:'Home' /}
 
<form action="@{Application.sayHello()}" method="GET">
    <input type="text" name="myName" /> 
    <input type="submit" value="Say hello!" />
</form> 

ここでformをGETにしているのは、

副作用をもっていないから、らしい。

@{…}は自動的にplayにApplication.sayHello()のための

URLを生成されるが、今の状態でブラウザをリロードさせると、

まだコントローラーにsayHelloがないのでエラーになる。

なのでメソッドを追加。

package controllers

import play._
import play.mvc._

object Application extends Controller {
    
    def index = Template
 
	def sayHello(myName:String) = Template('myName -> myName)   
}

メソッドはmyNameというパラメータをとる。

そして渡されたパラメータをmyNameというシンボルにバインド。


リロードするとフォームがでる。

ここで適当な値を入力してsubmitすると、今度は

sayHello.htmlがないぞ、とエラー。

なのでhelloworld/app/views/Application/sayHello.html

を作ってあげる。

#{extends 'main.html' /}
#{set title:'Home' /}
 
<h1>Hello ${myName ?: 'guest'}!</h1>
 
<a href="@{Application.index()}">Back to form</a>

${myName ?: 'guest'}

となっているのは、フォームになにも入力せず

submitした場合、デフォルト値としてguestを設定するようにしている。


URLをちょっとまともにする

いまはURL

http://localhost:9000/application/sayhello?myName=

とかなっていてかっこ悪い。

routeファイルをみると、

*       /{controller}/{action}                  {controller}.{action}

となってるので、HTMLで展開されるURL

コントローラー名/アクション名

になっている。

このrouteファイルの行の上に

GET     /hello                                  Application.sayHello

と追加する。

すると、展開されるHTML

   <form action="/hello" method="GET"> 

となり、表示されるURL

http://localhost:9000/hello?myName=

となる。


レイアウトカスタマイズ

helloworld/app/views/main.htmlに書けばレイアウトが変わる。


バリデーション

次に入力する名前にバリデーションをかけてみる。

sayHelloメソッドを書き換え。

package controllers

import play._
import play.mvc._
import play.data.validation.Annotations._

object Application extends Controller {
    
  def index = Template
 
  def sayHello(@Required myName:String) = {
    if(validation.hasErrors) {
      flash += "error" -> "Oops, please enter your name!"
      Action(index)
    } else {
      Template('myNameSym -> myName)
    }
  }
}

play.data.validation.Annotationsパッケージをimportして、

@Requiredアノテーションを使用できるようにしておく。

myNameに何も入力されなかった場合、

validation.hasErrorsがtrueになる。

その場合にはエラーメッセージをfalsh変数に入れ、

Action関数をつかってindexページへリダイレクト

ちなみに、

Redirect("文字列URL")とすれば外部サイトへのリダイレクトもできる。


最後に

helloworld/app/views/Application/index.html

を書き換え。

#{extends 'main.html' /}
#{set title:'Home' /}
 
#{if flash.error}
    <p style="color:#c00">
        ${flash.error}
    </p>
#{/if}
 
<form action="@{Application.sayHello()}" method="GET">
    <input type="text" name="myName" /> 
    <input type="submit" value="Say hello!" />
</form>

エラー時にはflash変数に入れられたエラー内容を表示している。

これで、フォームになにも入力されなかったときは

エラーが表示される。


自動テスト

テスト部分はあまり変わってなさそう。

$play test helloworld 

として、

http://localhost:9000/@tests

にアクセス。

ブラウザ上から単体テストseleniumテストもできる。


いままでとそこまで違っている部分はなさげ。

次はLearning Scala with Playを見てみる。

これって前まであったっけ?

トラックバック - http://d.hatena.ne.jp/sy-2010/20110416/1302929852