Play Frameworkに挑戦(Java編 その4) ~モデルの作成と登録処理~

前回の続き

前回ではPlay Frameworkでの自動テストを実行してみた。

今回は前々回ででてきたMVCモデルの残りのM(モデル)についての解説ということになる。イントロダクション動画では8:00~13:00のあたりまで。
Introduction to Play Framework for Java developers on Vimeo

モデルの作成

モデル (models/Bar.java)

モデルについてはPlay Frameworkでは初期プロジェクトになにも作成されていない状態なので、自分で一から作っていくようだ。

動画の8:00~9:00あたりでBarクラスというエンティティクラスを作成している。
動画ではIntelliJ IDEAが使われており、素晴らしい補完機能によりサクサクとコーディングされて行く様子がみられるが、Eclipseを使ってもほぼ同様に作成していくことができる。

models/Bar.java

package models;

import javax.persistence.Entity;
import javax.persistence.Id;
import play.db.ebean.Model;

@Entity
public class Bar extends Model {

	@Id
	public String id;

	public String name;
}

登録機能の追加

データベースの利用 (conf/application.conf)

インメモリデータベース*1を使用するために、下記の部分のコメントを外す。

db.default.driver=org.h2.Driver
db.default.url="jdbc:h2:mem:play"

またEbean*2が対象とするクラスを指定するため?下記の部分もコメントを外す。

ebean.default="models.*"
登録処理の追加

conf/routesファイルに下記記述を追加

POST	/bars			controllers.Application.addBar()

controllers/Application.javaにメソッド追加

import models.Bar;
import play.data.Form;
    public static Result addBar() {
    	Bar bar = Form.form(Bar.class).bindFromRequest().get();
    	bar.save();
    	return redirect(routes.Application.index());
    }

上記コードを解釈してみると

  1. フォームで入力された値を受け取りBarエンティティを作成。
  2. エンティティをデータベースへ保存。
  3. アプリケーションのルートであるindexへリダイレクト

ということのようだ。


入力フォームの作成
views/index.scala.htmlを変更

@(message: String)

@main("Welcome to Play") {

	<form action="@routes.Application.addBar()" method="post">
		<input name="name">
		<input type="submit">
	</form>

}

動作確認

ブラウザからページをリフレッシュしてみると、下記のようなページが表示される。

f:id:FryingHighAgain:20140317011918p:plain

まだオブジェクトにマッピングされるテーブルが存在しないために、このようなページが表示される。わざわざテーブル作成のスクリプトを自動生成してくれるご親切。

こういうところを見ると『オブジェクトが主でリレーショナルが従。テーブルはあくまでオブジェクトの永続化の先の一つ』という思想を感じられる気がする。

「Apply this script now!」 というボタンを押すと、実際にテーブルを作成してくれ次のような画面が表示される。
「送信」ボタンを押すと内容が登録されるようだが、この時点ではまだ本当に登録できたのか確認できない。

f:id:FryingHighAgain:20140317020719p:plain

今回はここまで。

*1:今流行りのインメモリデータベース。H2というJavaで記述されたデータベースのようだ。 H2 Database Engine

*2:EbeanとはここのORマッピングツールのことらしい。 Avaje Ebean ORM Peristence Layer (Java) - Compare to JPA