PLAYフレームワークでHello World!
こちらのドワンゴさんの新卒向け研修資料を参考にして、PLAYフレームワークを使ってwebアプリを作ってみる。この研修資料ではsbtでPLAYのテンプレートを呼び出す事はせずに、スクラッチで作成しており、最初の勉強として最適だと思う。
やっぱりここでもHello World!
プロジェクトの作成とbuild.sbtの作成
PLAYのフォルダ構成からスクラッチで作成するため、トップディレクトリを作成する。研修資料では"hello-world"となっていたが今回は"play_sample"とした。
SCALA/ >> mkdir play_sample
資料に従い、playのsbt-pluginを入れる。 次にbuild.sbtにプロジェクトの設定を始める、とある。いつも通りと書いてあるが、今回初めて行うので、build.sbtを何処に置けば良いかでつまづく。他の書籍を参考にすると、rootディレクトリの下に置けば良さそうだ。
資料のscalaのバージョンは2.12.4になっていたが、これは今入っているバージョンに合わせた方が良さそうなので、バージョンを調べて3.3.0にする。
play_sample/ >> scala --version Scala code runner version 3.3.0 -- Copyright 2002-2023, LAMP/EPFL
build.sbt
lazy val root = (project in file(".")).enablePlugins(PlayScala) scalaVersion := "3.3.0" libraryDependencies += guice
資料には"最後のlibraryDependencies += guiceでDIコンテナのGuiceを使えるようにする。"とある。判らないので調べる。DIコンテナとはソフトウェアを構成するコンポーネントの依存性を管理するソフトウェアの事らしい。DIコンテナも幾つか種類があって、guiceはgoogleが提供するコンポーネントらしい。とりあえず入れておいて損は無さそうだ。
confの作成
資料に沿ってrootディレクトリの下にconfディレクトリを作成する。その下にapplication.confとroutesを作成する。application.confの方は空のファイルで良い。routesには下記の様に書く。
GET / controllers.HelloController.get(name: Option[String])
HelloControllerの実装
資料そのままだが、一応コピペせずに写経する。
package controllers import javax.inject.Inject import javax.inject.Singleton import play.api.mvc.AbstractController import play.api.mvc.Action import play.api.mvc.AnyContent import play.api.mvc.ControllerComponents import play.api.mvc.Request @Singleton class HelloController @Inject()(cc:ControllerComponents) extends AbstractController(cc){ def get(name: Option[String]) = Action{implicit request: Request[AnyContent] => Ok{ name .map(s => s"hello, $s!") .getOrElse("""Pleases give a name as a query parameter named "name".""") } } }
実行
下記のコマンドでsbtを実行する。
play_sample/ >> sbt run
大量のエラーメッセージが出る。。。
=== 略 === [error] not found: https://repo1.maven.org/maven2/com/typesafe/play/play-akka-http-server_3/2.8.15/play-akka-http-server_3-2.8.15.pom [error] Error downloading com.typesafe.play:filters-helpers_3:2.8.15 === 以下略 ===
どうも、依存関係が解決出来ないようなエラーのようだ。 確かにエラーメッセージに出てくるhttps://repo1.maven.org/maven2/com/typesafe/play/play-akka-http-server_3/2.8.15/play-akka-http-server_3-2.8.15.pomを打ってもそのリンクに到達しない。
https://repo1.maven.org/maven2/com/typesafe/play/play-akka-http-server_3/を打つと確かに2.8.15は無い。代わりに2.9.0-M6っぽいものが出てくるので、一度それに変えてみる。
addSbtPlugin("com.typesafe.play" % "sbt-plugin" % "2.9.0-M6")
--- (Running the application, auto-reloading is enabled) --- INFO p.c.s.AkkaHttpServer - Listening for HTTP on /[0:0:0:0:0:0:0:0]:9000 (Server started, use Enter to stop and go back to the console...)
何となくエラーなく走ったようだ。 webブラウザでローカルホストに以下のようにアクセスする。
localhost:9000/?name=World
以下のように表示された。
hello, World!
何とか出来ていそうだ。