1. 概要

このイントロチュートリアルの目的は、Play Frameworkを探索し、それを使用してWebアプリケーションを作成する方法を理解することです。

Playは、コードがコンパイルされ、JVM、主にJavaとScalaで実行されるプログラミング言語向けの生産性の高いWebアプリケーションフレームワークです。 最新のWebアプリケーション開発に必要なコンポーネントとAPIを統合します。

2. PlayFrameworkのセットアップ

Playフレームワークの公式ページにアクセスして、ディストリビューションの最新バージョンをダウンロードしましょう。 このチュートリアルの時点で、最新はバージョン2.7です。

Play Java Hello Worldチュートリアルのzipフォルダーをダウンロードし、ファイルを便利な場所に解凍します。 このフォルダーのルートには、アプリケーションの実行に使用できるsbt実行可能ファイルがあります。 または、公式ページからsbtをインストールすることもできます。

ダウンロードしたフォルダからsbtを使用するには、次のようにします。

cd /path/to/folder/
./sbt run

現在のディレクトリでスクリプトを実行しているため、./構文を使用していることに注意してください。

sbt、をインストールすると、代わりにそれを使用できます。

cd /path/to/folder/
sbt run

このコマンドを実行すると、「(サーバーが起動しました。Enterキーを使用して停止し、コンソールに戻ります…)」というステートメントが表示されます。 これは、アプリケーションの準備ができていることを意味します。したがって、 http:// localhost:9000 に移動して、Playウェルカムページが表示されます。

3. Playアプリケーションの構造

このセクションでは、Playアプリケーションがどのように構造化されているか、およびその構造内の各ファイルとディレクトリが何に使用されるかについて、より深く理解します。

すぐに簡単な例に挑戦したい場合は、次のセクションにスキップしてください。

これらは、典型的なPlayFrameworkアプリケーションで見つかるファイルとフォルダーです。

├── app                      → Application sources
│   ├── assets               → Compiled Asset sources
│   │   ├── javascripts      → Typically Coffee Script sources
│   │   └── stylesheets      → Typically LESS CSS sources
│   ├── controllers          → Application controllers
│   ├── models               → Application business layer
│   └── views                → Templates
├── build.sbt                → Application build script
├── conf                     → Configurations files and other non-compiled resources (on classpath)
│   ├── application.conf     → Main configuration file
│   └── routes               → Routes definition
├── dist                     → Arbitrary files to be included in your projects distribution
├── lib                      → Unmanaged libraries dependencies
├── logs                     → Logs folder
│   └── application.log      → Default log file
├── project                  → sbt configuration files
│   ├── build.properties     → Marker for sbt project
│   └── plugins.sbt          → sbt plugins including the declaration for Play itself
├── public                   → Public assets
│   ├── images               → Image files
│   ├── javascripts          → Javascript files
│   └── stylesheets          → CSS files
├── target                   → Generated files
│   ├── resolution-cache     → Information about dependencies
│   ├── scala-2.11            
│   │   ├── api              → Generated API docs
│   │   ├── classes          → Compiled class files
│   │   ├── routes           → Sources generated from routes
│   │   └── twirl            → Sources generated from templates
│   ├── universal            → Application packaging
│   └── web                  → Compiled web assets
└── test                     → source folder for unit or functional tests

3.1. appディレクトリ

このディレクトリには、Javaソースコード、Webテンプレート、およびコンパイル済みアセットのソース(基本的に、すべてのソースとすべての実行可能リソース)が含まれています。

app ディレクトリには、いくつかの重要なサブディレクトリが含まれています。各サブディレクトリには、MVCアーキテクチャパターンの一部がパッケージ化されています。

  • models –これはアプリケーションビジネスレイヤーです。このパッケージのファイルは、おそらくデータベーステーブルをモデル化し、永続レイヤーにアクセスできるようにします。
  • views –ブラウザにレンダリングできるすべてのHTMLテンプレートがこのフォルダに含まれています
  • controllers –コントローラーがあるサブディレクトリ。 Controllers は、API呼び出しごとに実行されるアクションを含むJavaソースファイルです。 アクションは、HTTP要求を処理し、HTTP応答と同じ結果を返すパブリックメソッドです。
  • asserts –CSSやjavascriptなどのコンパイル済みアセットを含むサブディレクトリ。 上記の命名規則は柔軟であり、パッケージを作成できます。 app /utilsパッケージ。 パッケージの名前をカスタマイズすることもできますapp/ com / baeldung / controllers

また、特定のアプリケーションで必要なオプションのファイルとディレクトリも含まれています。

3.2. publicディレクトリ

public ディレクトリに保存されているリソースは、Webサーバーによって直接提供される静的アセットです。

このディレクトリには通常、画像、CSS、JavaScriptファイル用の3つのサブディレクトリがあります。 すべてのPlayアプリケーションで一貫性を保つために、このようなアセットファイルを整理することをお勧めします。

3.3. confディレクトリ

conf ディレクトリには、アプリケーション構成ファイルが含まれています。 application.conf は、Playアプリケーションのほとんどの構成プロパティを配置する場所です。 アプリのエンドポイントはルートで定義します。

アプリケーションに追加の構成ファイルが必要な場合は、このディレクトリに配置する必要があります。

3.4. libディレクトリ

lib ディレクトリはオプションであり、アンマネージライブラリの依存関係が含まれています。 ビルドシステムで指定されていないjarがある場合は、このディレクトリに配置します。 それらはアプリケーションのクラスパスに自動的に追加されます。

3.5. build.sbtファイル

build.sbtファイルはアプリケーションビルドスクリプトです。 ここに、テストライブラリや永続性ライブラリなど、アプリケーションの実行に必要な依存関係を一覧表示します。

3.6. プロジェクトディレクトリ

SBTに基づいてビルドプロセスを構成するすべてのファイルは、プロジェクトディレクトリにあります。

3.7. ターゲットディレクトリ

このディレクトリには、ビルドシステムによって生成されたすべてのファイル(たとえば、すべての .class ファイル)が含まれます。

ダウンロードしたPlayFrameworkHello Worldの例のディレクトリ構造を確認して調べたので、例を使用してフレームワークの基本を理解できます。

4. 簡単な例

このセクションでは、Webアプリケーションの非常に基本的な例を作成します。 このアプリケーションを使用して、Playフレームワークの基本に慣れます。

サンプルプロジェクトをダウンロードしてビルドする代わりに、 sbt newコマンドを使用して、PlayFrameworkアプリケーションを作成する別の方法を見てみましょう。

コマンドプロンプトを開き、選択した場所に移動して、次のコマンドを実行してみましょう。

sbt new playframework/play-java-seed.g8

これについては、セクション2 で説明されているように、sbtをすでにインストールしておく必要があります。

上記のコマンドは、最初にプロジェクトの名前を入力するように求めます。 次に、パッケージに使用されるドメイン(Javaのパッケージ命名規則とは逆に)を要求します。 角かっこで囲まれたデフォルトを維持したい場合は、名前を入力せずにEnterを押します。

このコマンドで生成されたアプリケーションは、前に生成されたものと同じ構造を持っています。 したがって、以前と同じようにアプリケーションの実行に進むことができます。

cd /path/to/folder/ 
sbt run

上記のコマンドは、実行の完了後、がポート番号9000でサーバーを生成し、 http:// localhost:9000を介してアクセスできるAPIを公開します。 ブラウザに「WelcometoPlay」というメッセージが表示されます。

新しいAPIには2つのエンドポイントがあり、ブラウザから順番に試すことができます。最初のエンドポイント(ロードしたばかり)はルートエンドポイントで、「WelcometoPlay」を含むインデックスページをロードします。 !」 メッセージ。

2番目のhttp:// localhost:9000 / asset、は、パスにファイル名を追加することにより、サーバーからファイルをダウンロードするためのものです。 このエンドポイントをテストするには、アプリケーションとともにダウンロードされた favicon.pngファイルをhttp:// localhost:9000 / Assets / images /favicon.pngで取得します。

5. アクションとコントローラー

要求パラメーターを処理し、クライアントに送信される結果を生成するコントローラークラス内のJavaメソッドは、アクションと呼ばれます。

コントローラーは、 play.mvc.Controller を拡張するJavaクラスであり、クライアントに対して生成される結果に関連する可能性のあるアクションを論理的にグループ化します。

次に、 app-parent-dir / app / controllers に移動し、HomeController。javaに注目しましょう。

HomeController のインデックスアクションは、簡単なウェルカムメッセージを含むWebページを返します。

public Result index() {
    return ok(views.html.index.render());
}

このWebページは、ビューパッケージのデフォルトのindexテンプレートです。

@main("Welcome to Play") {
  <h1>Welcome to Play!</h1>
}

上に示したように、インデックスページはメインテンプレートを呼び出します。 次に、メインテンプレートがページヘッダーと本文タグのレンダリングを処理します。 2つの引数を取ります。ページのタイトル用のStringと、ページの本文に挿入するためのHtmlオブジェクトです。

@(title: String)(content: Html)

<!DOCTYPE html>
<html lang="en">
    <head>
        @* Here's where we render the page title `String`. *@
        <title>@title</title>
        <link rel="stylesheet" media="screen" href="@routes.Assets.versioned("stylesheets/main.css")">
        <link rel="shortcut icon" type="image/png" href="@routes.Assets.versioned("images/favicon.png")">
    </head>
    <body>
        @* And here's where we render the `Html` object containing
         * the page content. *@
        @content

        <script src="@routes.Assets.versioned("javascripts/main.js")" type="text/javascript"></script>
    </body>
</html>

indexファイルのテキストを少し変更してみましょう。

@main("Welcome to Baeldung") {
  <h1>Welcome to Play Framework Tutorial on Baeldung!</h1>
}

ブラウザをリロードすると、太字の見出しが表示されます。

Welcome to Play Framework Tutorial on Baeldung!

HomeControllerindex()メソッドの render ディレクティブを削除して、プレーンテキストまたはHTMLテキストを返すことができるようにすることで、テンプレートを完全になくすことができます。直接:

public Result index() {
    return ok("REST API with Play by Baeldung");
}

上記のようにコードを編集すると、ブラウザにテキストのみが表示されます。 これは、HTMLやスタイルを含まないプレーンテキストになります。

REST API with Play by Baeldung

ヘッダー

タグでテキストをラップし、HTMLテキストを Html.apply メソッドに渡すことで、HTMLを出力することもできます。 気軽に遊んでみてください。

ルート/baeldung /htmlエンドポイントを追加しましょう。

GET    /baeldung/html    controllers.HomeController.applyHtml

次に、このエンドポイントでリクエストを処理するコントローラーを作成しましょう。

public Result applyHtml() {
    return ok(Html.apply("<h1>This text will appear as a heading 1</h1>"));
}

http:// localhost:9000 / baeldung / html にアクセスすると、上記のテキストがHTML形式で表示されます。

応答タイプをカスタマイズすることにより、応答を操作しました。 この機能については、後のセクションで詳しく説明します。

PlayFrameworkの他の2つの重要な機能も見てきました。

まず、ブラウザをリロードすると、コードの最新バージョンが反映されます。 これは、コードの変更がその場でコンパイルされるためです。

次に、Playは、play.mvc.Resultsクラスの標準HTTP応答用のヘルパーメソッドを提供します。 例として、 ok()メソッドがあります。このメソッドは、パラメーターとして渡す応答本文とともにOKHTTP200応答を返します。 ブラウザにテキストを表示する方法はすでに使用しています。

Results クラスには、 notFound() badRequest()などのヘルパーメソッドがあります。

6. 結果の操作

Playのコンテンツネゴシエーション機能は、気付かずに恩恵を受けてきました。 Playは、応答本文から応答コンテンツタイプを自動的に推測します。 これが、okメソッドでテキストを返すことができた理由です。

return ok("text to display");

次に、PlayはContent-Typeヘッダーをtext/plainに自動的に設定します。 これはほとんどの場合機能しますが、コンテンツタイプヘッダーの制御とカスタマイズを引き継ぐことができます。

HomeController.customContentTypeアクションの応答をtext/htmlカスタマイズしてみましょう。

public Result customContentType() {
    return ok("This is some text content").as("text/html");
}

このパターンは、あらゆる種類のコンテンツタイプにまたがっています。 ok ヘルパーメソッドに渡すデータの形式に応じて、 text /htmltext/plainまたはapplication/jsonに置き換えることができます。

setheadersと同様のことができます。

public Result setHeaders() {
    return ok("This is some text content")
            .as("text/html")
            .withHeader("Header-Key", "Some value");
}

7. 結論

この記事では、PlayFrameworkの基本について説明しました。 Playを使用して基本的なJavaWebアプリケーションを作成することもできました。

いつものように、このチュートリアルのソースコードはGitHubから入手できます。