2011-12-14
Play!ScalaでGAE
Play!がいつの間にやらScalaのフレームワークになっていたから触ってみた
モジュールインストール
とりあえずPlay!のScala、GAE、sienaモジュールをインストールしてプロジェクト作成する
sienaというライブラリがあること初めて知った
$play install scala $play install gae $play install siena $play new miyukiti --with scala
実行するときは
プロジェクトの中まで移動して
$play run
もしくは
$play run miyukiti
で実行できます
モジュール設定
conf/application.confにモジュールの設定を行う。
これで各モジュールが利用できるようになります。
module.scala=${play.path}/modules/scala-0.9.1
module.gae=${play.path}/modules/gae-1.4
module.siena=${play.path}/modules/siena-2.0.6
デプロイ
war/appengine-generatedフォルダにappengine-web.xmlがあるのでアプリケーションIDなどを書き換えて
$play gae:deploy
でデプロイできます。
Todoアプリ
モデル
package models import play.modules.siena._ import siena._ import java.util._ class Todo ( @NotNull n:String, @NotNull t:String, f:Boolean = false ) extends Model { val task:String = t val name:String = n var finish:Boolean = f @Id var id: Long = _ } object Todo { def all(): Query[Todo] = Model.all(classOf[Todo]) def allfetch = all.fetch() def getAllTask = all.filter("finish", false).fetch() def get(id: Long) = all.filter("id", id).get() }
コントローラ
app/controllers.scala
package controllers import play._ import play.mvc._ import play.modules.gae._ import com.google.appengine.api.users._ import models._ import scala.collection.JavaConversions._ import java.util._ object Application extends Controller{ import views.Application._ def index = { html.index(todos = Todo.getAllTask.toList) } def insert = { val name = params.get("name") val task = params.get("task") val todo = new Todo(task , name) todo.insert Action(index) } def done(id:Long) = { val todo = Todo.get(id) todo.finish = true todo.update Action(index) } def delete = { val todos = Todo.allfetch.toList for(todo <- todos){ todo.delete } Action(index) } }
ビュー
@の後はScalaのコードが書けるみたい
@(title:String = "")(body: => Html) <!DOCTYPE html> <html> <head> <title>@title</title> <link rel="stylesheet" media="screen" href="@asset("public/stylesheets/main.css")"> <link rel="shortcut icon" type="image/png" href="@asset("public/images/favicon.png")"> <script src="@asset("public/javascripts/jquery-1.5.2.min.js")" type="text/javascript"></script> </head> <body> The Hello world app. <hr /> @body </body> </html>
app/views/Application/index.scala.html
@(todos:List[models.Todo])
@main(){
Welcome!
<a href="@action(controllers.Application.login)">Login</a>
<a href="@action(controllers.Application.logout)">Logout</a>
@form(controllers.Application.insert){
<input type="text" name="name" />
<input type="text" name="task" />
<input type="submit" value="add" />
}
@if(!todos.isEmpty){
@todos.map{ todo =>
<li>
<span>task: @todo.name</span>
<span>task:@todo.task</span>
<a href="@action(controllers.Application.done(todo.id:Long))">Done!</a>
</li>
}
}else{
<p>No Entity</p>
}
}
簡単!こんなんで動いた!凄い簡単!Scalaよく分かってないけど書けた。
ローカルデータストアを見たいんだけどどうしたらいいかわからない。今まではhttp://localhost:8080/_ah/adminでローカルデータストア一覧したり削除したりできたのに…。deleteメソッド作成したけど何か一覧できる方法あるのかしら…。
トラックバック - http://d.hatena.ne.jp/TaRO/20111214/1323857516
リンク元
- 48 http://www.google.co.jp/url?sa=t&rct=j&q=winusbcoinstaller.dll&source=web&cd=1&ved=0CC0QFjAA&url=http://d.hatena.ne.jp/TaRO/20110406/1302076361&ei=FF_pTqL8BqutiQeaibjdCA&usg=AFQjCNFnrEev_CzVcEqkWkhBpaXwGnXJQQ
- 25 http://www.google.co.jp/url?sa=t&rct=j&q=java html 解析&source=web&cd=2&ved=0CEMQFjAB&url=http://d.hatena.ne.jp/TaRO/20110314/1300071165&ctbs=qdr:y&ei=LUjpTuCHGcXUmAWLt5meCg&usg=AFQjCNHNwBByfMyyjJC3lK5v0PqCQCVX9g
- 20 http://www.google.co.jp/url?sa=t&rct=j&q=chrome tumblr アドオン&source=web&cd=3&ved=0CDQQFjAC&url=http://d.hatena.ne.jp/TaRO/20100831&ei=A7DoTrSBJM2xrAfsk72TBw&usg=AFQjCNHDUIwgkiyHAVeALgo-Gars3mb13Q
- 18 http://www.google.co.jp/url?sa=t&rct=j&q=tumblr chrome アドオン&source=web&cd=3&ved=0CDkQFjAC&url=http://d.hatena.ne.jp/TaRO/20100831&ei=Im_xTtP0GvD1mAWsq7mVAg&usg=AFQjCNHDUIwgkiyHAVeALgo-Gars3mb13Q&sig2=5U3EQ5lwQ
- 15 http://www.google.co.jp/url?sa=t&rct=j&q=java html parser&source=web&cd=5&ved=0CEkQFjAE&url=http://d.hatena.ne.jp/TaRO/20110314/1300071165&ei=rqcET_CnHs-ZiQfnzqy_Aw&usg=AFQjCNHNwBByfMyyjJC3lK5v0PqCQCVX9g
- 15 http://www.google.co.jp/url?sa=t&rct=j&q=java+html+parser&source=web&cd=5&ved=0CEEQFjAE&url=http://d.hatena.ne.jp/TaRO/20110314/1300071165&ei=wl_xTu2BEcjImAW98pSZAg&usg=AFQjCNHNwBByfMyyjJC3lK5v0PqCQCVX9g&sig2=GVM14xtlMsc4gcx7R-uZPw
- 14 http://www.google.co.jp/url?sa=t&rct=j&q=flashの上に画像&source=web&cd=2&ved=0CDkQFjAB&url=http://d.hatena.ne.jp/TaRO/20100511/1273565821&ei=86zqTuX2AuvLmAX62cXuCQ&usg=AFQjCNHD5IudhQR7t7A5LbJtZ8qnOWYLog
- 12 http://tai.ia.inf.shizuoka.ac.jp/
- 12 http://www.google.co.jp/url?sa=t&rct=j&q=しゃっくりを12秒で止める方法&source=web&cd=3&ved=0CC4QFjAC&url=http://d.hatena.ne.jp/TaRO/20100729/1280412531&e
- 12 http://www.google.co.jp/url?sa=t&rct=j&q=オートページャライズ クローム&source=web&cd=1&ved=0CCAQFjAA&url=http://d.hatena.ne.jp/TaRO/2010012

ありがとうございます。
1つだけ自分の環境では足りていなかった点があったので報告しておきます。
app/views/Application/index.scala.html で使われているlogout,loginメソッドの定義がapp/controllers.scalaから抜けていて自分の環境では動きませんでした。
ちなみに、環境は
play-1.2.4
gae-1.6.0_b1
scala-0.9.1
siena-2.0.6
でした。