ScalaでのPlayFrameworkの紹介
1. 概要
このチュートリアルでは、Scalaを使用した PlayFrameworkを見ていきます。 Play Frameworkをセットアップする方法、開発ツールを使用して最初のプロジェクトを生成する方法、および独自の機能を実装する方法を学習します。 さらに、組み込みのテスト機能についても説明します。
また、Java開発者向けに、JavaバージョンのPlayFrameworkチュートリアルも用意しています。
2. プロジェクトの設定
開始する前に、 sbtコマンドラインツール(および少なくともJDK 8)をインストールする必要があります。 この記事では、sbtバージョン1.3.10を使用してPlayFrameworkバージョン2.8.2をインストールしています。
3. コマンドラインツール
Play Frameworkのドキュメントは、「強力なコンソールおよびビルドツール」を約束します。
sbtを使用して新しいPlayFrameworkアプリケーションのスキャフォールディングを生成することから始めることができます。
sbt new playframework/play-scala-seed.g8
多くの依存関係をロードした後、ツールはプロンプトを表示し、新しいプロジェクトに名前を付けて組織名を指定するように求めます。
This template generates a Play Scala project
name [play-scala-seed]:
この例では、「baeldung-play-framework」という名前を付けます。 パッケージ名として組織名を使用します。 Scalaパッケージ名は、Javaパッケージ名と同じ規則に従います。 したがって、パッケージ名は「baeldung.com」になります。
これで、baeldung-play-frameworkディレクトリからプロジェクトを実行できます。
cd baeldung-play-framework
sbt run
プロジェクトを初めて実行するときは、ライブラリをコンパイルしてビルドするため、数分かかる場合があります。 起動したら、ブラウザで http:// localhost:9000 を開いて、デフォルトのウェルカムページを取得できます。
これまで、コードに触れることなく、PlayFrameworkで動作するHTTPサーバーを作成してきました。
4. プロジェクト構造
次に、プロジェクトコードを IDEにロードし、ディレクトリ構造を確認します。
プロジェクトディレクトリには、 sbt テンプレートによって作成された4つのディレクトリ、 app / controllers、app / views、conf 、およびpublicがあります。
- controllers ディレクトリは、Scalaコードを保存する場所です
- views ディレクトリは、HTMLテンプレートを保存する場所です
- conf ディレクトリには、リクエストURLを特定のクラスとメソッドにマッピングするルーター構成が含まれています
- 最後に、 public ディレクトリには、PlayFrameworkサーバーによって提供される静的コンテンツが含まれています
今のところ、ディレクトリについて知っておく必要があるのはこれだけです。
5. 最初の変更を行う
Play Frameworkは、「ヒット更新ワークフロー」を提供します。 アイデアは、サーバーを再起動せずに
まず、 app /viewディレクトリに新しいファイルを作成しましょう。 これをfirstexample.scala.htmlと呼びます。 次に、ファイルを開き、次のコードをコンテンツとして保存します。
@()
@main("Welcome to Introduction to Play Framework!") {
<h1>Welcome to Introduction to Play Framework!</h1>
}
HTMLファイルを変更することに加えて、Scalaコードを更新する必要があります。 app / controllers / HomeController.scala ファイルを開き、次の行を変更してみましょう: Ok(views.html.index())から Ok(views.html.firstexample( ))
まだ実行中のPlayサーバーの出力を見ると、新しいものは何もありません。 まだ何も起きていないようです。
ただし、ブラウザの[更新]ボタンを押すと、ブラウザウィンドウに次のコンテンツが表示されます。
6. 新しいアクションを定義する方法
前の例では、既存のコードにいくつかの変更を加えて、結果を確認しました。 それでは、Playの内部を見て、それがどのように機能し、他に何ができるかを理解しましょう。
Playサーバーはリクエストを受信すると、 config / routers ファイルをチェックして、リクエストを処理するコントローラーとメソッドを決定します。 コントローラ内で定義され、ルートファイルで使用されるメソッドはアクションと呼ばれます。
HomeController クラスで新しいアクションを定義し、新しいルートを構成するとします。 このコードは、URLから2つのパラメーターを取得し、それらの2つのパラメーターに基づいて値を出力します。 わかりやすくするために、URLで提供されている2つの数字を読み取り、それらの数字の合計を印刷するページを表示します。
新しいアクションを実装するには、Scalaファイル( HomeController.scala )を開き、2つのパラメーターを受け取り、それらの合計を計算して、結果をビューテンプレートに渡す新しいメソッドを追加します。
def printSum(first: Long, second: Long) = Action { implicit request: Request[AnyContent] =>
val sum = first + second
Ok(views.html.index(sum))
}
それでは、 index.scala.htmlファイルを開き、ファイルの上に sum パラメーターを追加して、コンテンツで使用してみましょう。
@(sum: Long)
@main("Add two numbers") {
<h1>The sum is @sum!</h1>
}
ページを生成する関数を定義しました。 ビューファイルの最初の行には、関数パラメーターが記述されています。 他の行は、出力を生成するコードです。
合計はコントローラーで計算され、 Ok 関数に渡されます。この関数は、ステータスコード 200OKのコンテンツを返します。
最後に、 routers ファイルを開いて、新しいパスとアクションを追加する必要があります。
GET /sum/:first/:second controllers.HomeController.printSum(first: Long, second: Long)
ルートは3つの部分で構成されています。 まず、HTTPメソッドを指定します。 次に、パスとその変数を定義します。 この例では、計算する合計のfirstとsecondの数を表す2つの変数を使用しています。
最後に、コントローラーと、要求を処理するために使用するアクションを指定します。 関数のパラメーターとしてパス変数を使用していることに注意してください。
ブラウザで次のURLを開くと: http:// localhost:9000 / sum / 5/15 、次のページが表示されます。
7. テスト
最後になりましたが、新しいPlayプロジェクトを作成する際に、sbtによって生成されたテストを確認する必要があります。
tests /controllersディレクトリからHomeControllerSpecファイルを開くと、ScalaTest仕様が表示されます。
コードを完成させるには、作成した追加ルートのテストを作成する必要があります。 2つの数値パラメータを使用して/sum ルートを呼び出す、「2つの数値の合計を出力するページをレンダリングする」という新しいテストケースを定義しましょう。
"render a page that prints the sum of two numbers" in {
val request = FakeRequest(GET, "/sum/10/20")
val sumOfNumbers = route(app, request).get
// the rest of the test
}
もちろん、結果を検証するにはアサーションが必要です。 この場合、「合計は30です!」というテキストが表示されると予想されます。 正常にレンダリングされたHTMLページ。
status(sumOfNumbers) mustBe OK
contentType(sumOfNumbers) mustBe Some("text/html")
contentAsString(sumOfNumbers) must include ("The sum is 30!")
sbttestコマンドを使用してテストを実行できます。 コマンドを実行すると、新しいテストに合格したことがわかります。
8. 結論
この記事では、Play Frameworkコマンドラインツールを使用して簡単なWebサイトを作成し、新しいビューテンプレートを追加し、パラメーター化されたテンプレートを使用して新しいルートを定義しました。 最後に、自動生成されたテストを確認し、テストケースを実装しました。
アプリケーションのソースコードは、GitHubでから入手できます。