本格派エンジニアの工具箱

第15回 「Play Framework」でモデル/コントロールをカスタマイズする

この記事を読むのに必要な時間:およそ 3 分

コントロールのカスタマイズ

前回に引き続き,Play Framework⁠日本語サイトはこちらの使い方を解説します。Play Frameworkで作成したアプリケーションはモデル/ビュー/コントロールの各パーツから構成され,それぞれプロジェクトのmodels/views/controllersフォルダ内に格納されています。前回はビューの修正を行ったので,今回はまずコントロールをカスタマイズしてみましょう。

デフォルトのコントロールはcontrollersフォルダにApplication.javaとして作成されています。このindex()メソッドがビューのindex.htmlに関連付けられていることは前回説明しました。index()メソッドでは,次のようにrender()メソッドの呼び出しを行っています。これがPlay Frameworkのテンプレートエンジンを利用してWebページのレンダリングを行う処理です。

public static void index() {
    render();
}

render()メソッドにはObject型の引数を渡すことができます。渡した引数は,ビューのテンプレート内で変数として参照することができます。例えば,次のようにrender()にStringの値を渡したとします。

public static void index() {
    String message = "ようこそ、Play Frameworkへ!";
    render(message);
}

この場合,index.html側ではmessageという変数が利用できるようになり,その値はrender()の呼び出し時に設定されていた「ようこそ,Play Frameworkへ!」という文字列となっています。テンプレート内で,変数の値は「${変数名}」で参照できます。message変数の場合には以下のような具合です。

#{extends 'main.html' /}
#{set title:'Play Frameworkの使用例' /}

<h2>Playで作成したアプリケーションです</h2>

<div>${message}</div>

Webブラウザでページをリロードすると,図1のようにコントロールから渡されたmessageの値が表示に反映されていることが確認できます。

図1 messageの値が反映されている

図1 messageの値が反映されている

なお,render()の引数は可変長なので,同時に複数のオブジェクトを渡すことも可能です。

入力フォームとモデルの利用

続いて,モデルとの連携を行ってみましょう。ここでは,フォームから入力された名前とメールアドレスをデータベースに記録していくというアプリケーションを作ってみます。モデルの定義はJavaクラスで行います。次に示すAddressクラスは,名前とメールアドレスをプロパティに持つモデルを定義した例です。

package models;
 
import java.util.*;
import javax.persistence.*;
import play.db.jpa.*;
 
@Entity
public class Address extends Model {
    public String name;
    public String email;
    
    public Address(String name, String email) {
	this.name = name;
	this.email = email;
    }
}

Play Frameworkでは,モデルの永続化にJPA(Java Persistence API)を利用しています。JPAでは,@Entityアノテーションを使ってデータベースに永続化するエンティティを定義します。Addressクラスが継承しているplay.db.jpa.Modelは,JPAを利用して永続化するクラスの基底クラスになります。作成したAddressクラスはモデルを表すクラスなので,modelsフォルダに配置します。

データベースへの永続化を利用する場合には,confフォルダにある「applocation.conf」ファイルの設定を変更する必要があります。データベースとして付属のH2を利用する場合には,この設定ファイルから「db=mem」と書かれた部分を探して次のようにコメントインしましょう。

# Database configuration
# ~~~~~ 
# Enable a database engine if needed.
#
# To quickly set up a development database, use either:
#   - mem : for a transient in memory database (H2 in memory)
#   - fs  : for a simple file written database (H2 file stored)
db=mem
#
# To connect to a local MySQL5 database, use:
# db=mysql:user:pwd@database_name
#
# If you need a full JDBC configuration use the following :
# db.url=jdbc:postgresql:database_name
# db.driver=org.postgresql.Driver
# db.user=root
# db.pass=secret

この設定だとH2がインメモリーで実行されます。⁠db=fs」とすると,ファイルに記録する形で実行されます。その他,MySQLやPostgreSQLを使う場合には,それぞれデータベースの設定をコメントインして,URLやドライバの設定を行ってください。

コメント

コメントの記入