Hatena::ブログ(Diary)

ryugateの日記 このページをアンテナに追加 RSSフィード Twitter

E-Mail:hawk.seki_at_gmail.com
ryugateをフォローしましょう

2013-05-05

2013年05月05日のツイート 2013年05月05日のツイートを含むブックマーク 2013年05月05日のツイートのブックマークコメント

トラックバック - http://d.hatena.ne.jp/ryugate/20130505

2012-08-15

2012年08月15日のツイート 2012年08月15日のツイートを含むブックマーク 2012年08月15日のツイートのブックマークコメント

トラックバック - http://d.hatena.ne.jp/ryugate/20120815

2012-03-13

2012年03月13日のツイート 2012年03月13日のツイートを含むブックマーク 2012年03月13日のツイートのブックマークコメント

トラックバック - http://d.hatena.ne.jp/ryugate/20120313

2011-12-19

2011年12月19日ツイート 2011年12月19日のツイートを含むブックマーク 2011年12月19日のツイートのブックマークコメント

トラックバック - http://d.hatena.ne.jp/ryugate/20111219

2011-12-16

[]Scala Advent Calendar2011: Play2.0 + Scala Scala Advent Calendar2011: Play2.0 + Scalaを含むブックマーク Scala Advent Calendar2011: Play2.0 + Scalaのブックマークコメント

この記事は、Scala Advent Calendar JP 2011 の16日目です。

【お断り】Play 2.0はまだベータ版です。将来仕様変更が行われて、下記の操作がそのまま動かなくなる可能性があります

相次いで、Typesafe StackやHerokuでのサポート表明がされるなど、期待のWEBフレームワーク Play 2.0(beta) + Scalaを駆け足でめぐります


なにはともあれ、インストールしま

ダウンロードして、展開して、パスを通しておきましょう。アーカイブこちらから

http://download.playframework.org/releases/play-2.0-beta.zip


新規Scalaアプリケーション「MyApp」を作成しま

> play new MyApp

What is the application name?

> MyApp

Which template do you want to use for this new application?

1 - Create a simple Scala application

2 - Create a simple Java application

3 - Create an empty project

> 1

OK, application MyApp is created.

Have fun!

以上の操作で、MyAppフォルダとその中に幾つかのフォルダファイルが生成されます


すぐに、サーバを起動しま

2.0からSBTベースになりました。

カレントディレクトリを変更して

> cd MyApp

playコンソールを実行します。

> play


そして起動!

[MyApp] $ run

      • (Running the application from SBT, auto-reloading is enabled) ---

[info] play - Listening for HTTP on port 9000...

(Server started, use Ctrl+D to stop and go back to the console...)

以上でサーバが起動しました。


早速サーバアクセスしてみましょう

URLは「http://localhost:9000/」です。

Welcome to Play 2.0 beta!

などと表示されれば成功です。


少しコントローラをいじってみます

デフォルトコントローラクラスファイル「app/controllers/Application.scala

package controllers

import play.api._
import play.api.mvc._

object Application extends Controller {
  
  def index = Action {
    Ok(views.html.index("Your new application is ready."))
  }
  
}

の、index関数の下に、新しい関数を追加します。

  def hello = Action {
    Ok("Hello Play World!")
  }

ルーティング定義ファイル「conf/route」に以下の行を追加します。

GET /hello controllers.Application.hello()

以下のURLをロードするだけです。

http://localhost:9000/hello

コンパイル不要です。


引数を渡せるようにしてみましょう

まずは、コントローラの修正

  def hello(name:String) = Action {
    Ok("Hello "+ name +" World!")
  }

次にルーティングの修正

GET /hello/:name controllers.Application.hello(name:String)

引数文字列型(のまま)の場合は型を省略できるので、以下でもOKです。

GET /hello/:name controllers.Application.hello(name)

確認してみましょう。

http://localhost:9000/hello/Scala

ただし2バイト文字を使うと・・・

http://localhost:9000/hello/スカラ

Hello %E3%82%B9%E3%82%AB%E3%83%A9 World!

のように、・・・URLエンコードされたまま・・・になります

ので、URLデコードしてあげましょう。

  def hello(name:String) = Action {
    Ok("Hello "+ java.net.URLDecoder.decode(name) +" World!")
  }

確認してみましょう・・・

http://localhost:9000/hello/日本語

Hello 繧ケ繧ォ繝ゥ World!

あぁ・・今度は、文字化け・・・orz

今は単純なテキストとして帰っているので、HTMLとして返してあげましょう。

ここでは、テンプレートを使って簡単にHTMLします。

まずは app/views/index.scala.htmlを使いまわします。

コントローラだけの修正です。

  def hello(name:String) = Action {
    Ok(views.html.index("Hello "+ java.net.URLDecoder.decode(name) +" World!"))
  }

ひとまず文字化け解消したと思います


こんどは、独自のテンプレートを作りましょう

app/views/hello.scala.html作成します。

まずはシンプルバージョンです。

@(message:String)

@main("Hello") {
  @message
}

上記の簡単は意味は、

です。

コントローラも修正して、読み込むテンプレートを変更しましょう。

  def hello(name:String) = Action {
    Ok(views.html.hello("Hello "+ java.net.URLDecoder.decode(name) +" World!"))
  }

テンプレートをいじってみましょう

メッセージを10回繰り返します。

@main("Hello") {
  @for(i <- (1 to 10)) {
    @message<br />
  }
}

コントローラに渡す引数ひとつ増やして、繰り返し回数を指定できるようにしてみます

@(message:String, num:Int)

@main("Hello") {
  @for(i <- (1 to num)) {
    @message<br />
  }
}
  def hello(name:String, num:Int) = Action {
    Ok(views.html.hello("Hello "+ java.net.URLDecoder.decode(name) +" World!", num))
  }

GET /hello/:name/:num controllers.Application.hello(name, num:Int)

実験してみましょう。

http://localhost:9000/hello/日本語/6


実は、今の状態だと・・・

http://localhost:9000/hello/日本語

http://localhost:9000/hello

は受け付けなくなっています

これに対応するには、ルーティングファイル引数の初期値を以下のように修正します。

GET /hello controllers.Application.hello(name="Play", num:Int=10)

GET /hello/:name controllers.Application.hello(name, num:Int=10)

GET /hello/:name/:num controllers.Application.hello(name, num:Int)

注:上からマッチングが行われるので、順番が重要です。


RESTでなく、普通に?以下のパラメータを受け取る事も出来ます

GET /hello controllers.Application.hello(name, num:Int)

これとデフォルト引数を組み合わせることできます

GET /hello controllers.Application.hello(name ?= "Play", num:Int ?= 10)

上記の設定の場合

http://localhost:9000/hello?name=scala&num=12

といったURLになります

サーバの終了するには

サーバはCtrl+Dで終了できます

コンソールはexitで終了します。


参考サイト

 Play2.0のホーム http://www.playframework.org/2.0

 API http://playframework.github.com/api/scala/#package

 ソースドキュメント https://github.com/playframework/Play20/wiki/ScalaHome

 Play2.0ホームの日本語訳 http://playdocja.appspot.com/2.0

トラックバック - http://d.hatena.ne.jp/ryugate/20111216