根無し草日記

好きな事についての雑記帳

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コンテナも幾つか種類があって、guicegoogleが提供するコンポーネントらしい。とりあえず入れておいて損は無さそうだ。

confの作成

資料に沿ってrootディレクトリの下にconfディレクトリを作成する。その下にapplication.confroutesを作成する。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!

何とか出来ていそうだ。