トップ 差分 一覧 Farm ソース 検索 ヘルプ PDF RSS ログイン

Diary/2019-9-2

PlayFrameworkメモ

何度目かのPlayFramework入門.とりあえずsbtを用意した状態からスタート.

プロジェクト作成
sbt new playframework/play-scala-seed.g8

プロジェクト名は適当に決める.
プロジェクト名と同名のディレクトリが作られるので,そこに移動.

HelloWorldする

conf/routes にURLと,そのURLにアクセスしたときに実行したいメソッドの対応を書く.
たとえば,

GET     /my-hello                   controllers.MyHello.hello

とか書く.
で,メソッドを用意.クラスはappの下に用意.今回は app/controllers/MyHello.scala.
中身は,

package controllers

import javax.inject._
import play.api.mvc._

import play.api.data._
import play.api.data.Forms._

class MyHello @Inject()(mcc: MessagesControllerComponents)
    extends MessagesAbstractController(mcc){

   def hello() = Action { implicit request : MessagesRequest[AnyContent] =>
     Ok(views.html.myhello("My Hello World", "miyo"))
   }
}

とか.ここで,views.html.myhelloは,app/views/myhello.scala.html に 定義する.
中身は,

@(mesg1: String, mesg2: String)
<html>
<head><title>MyHello</title></head>
<body>
@mesg1 from @mesg2 <br>
<ul>
<li>mesg1.lenth = @mesg1.length</li>
<li>mesg2.lenth = @mesg2.length</li>
<li>mesg1.length + mesg2.length = @(mesg1.length + mesg2.length)</li>
</ul>
</body>
</html>

とか.HTMLにScalaを埋め込んだもの.
必要があれば,@import で,Scalaのimport文が書ける.
@()の中で定義した変数がScalaから引き渡されて,html中で使用できる.

<li>mesg1.length + mesg2.length = @(mesg1.length + mesg2.length)</li>

は,

<li>mesg1.length + mesg2.length = @(@mesg1.length + @mesg2.length)</li>


<li>mesg1.length + mesg2.length = @mesg1.length + @mesg2.length</li>

ではないので注意.

実行する
sbt run

で実行して,ブラウザで

http://localhost:9000/my-hello

にアクセス.エラーがでたら適宜修正.
ブラウザでリロードすると裏でコンパイルプロセスが走って,再実行される.

本来の開発の順番は

逆がよい.
ビューとアクションを用意してからrouteを書くみたい.あたり前か.