libro
www.tuyano.com
初心者のためのPlay Framework入門

EBeanによるModelの作成[Java編] (3/5)

作成:2013-03-03 11:11
更新:2013-03-03 11:11

■レコードを作成する

では、Modelによるデータベースの利用を行なってみましょう。まずは、なにはともあれ「レコードの作成」からです。データがなければ何も表示できませんからね。

レコードの作成には、先ほどのFinderは使いません。前回、ViewControllerの説明で、フォームを管理するフォームヘルパーFormクラスを利用しましたが、あのFormクラスを使ってModelを取得し、レコードを保存するのです。

これは、実際にサンプルコードを見ながら説明したほうがわかりやすいでしょう。下のリスト欄に、先ほどのSampleDataを利用したフォーム送信ページのサンプルを掲載しておきました。indexにアクセスして表示されるフォームにテキストを書いて送信すると、そのレコードがデータベースに保存されます。

ただし、最初にアクセスすると、Scalaのときにも出てきた「Database 'default' needs evolusion!」という表示が現れ、「このSQLスクリプトを実行する必要がある」と言ってきますので、「Apply this script now!」ボタンを押してSQLスクリプトを実行してください。Playによって自動生成されたSQLスクリプトが実行され、データベースにテーブルが自動生成されます。以後は、フォームが表示され、普通に送信できるようになります。(ただし、レコードの表示はまだ作ってないので、送信しても何も表示されませんが……)

ここでは、SampleData用のフォームを用意し、それを送信してコントローラー側でレコードに保存処理をしています。まずフォームヘルパーを見てみましょう。こんな具合に作っていますね。
@form(action = routes.Application.sendform, args = 'id -> "SampleData") {

actionは、sendformを指定してあります。そして、args = 'id -> "SampleData"と指定をしています。これにより、SampleDataというIDが設定されます。

フォーム内には3つの@inputTextが用意されています。例えば名前を入力する部分を見てみましょう。
@inputText( 
    field = sampleform("name"),
    args = '_label -> "名前",
    'placeholder -> "名前を入力" )

fieldには、sampleform("name")が指定されています。sampleformというのは、冒頭の変数宣言を見ると、sampleform: Form[SampleData])とありますね。SampleDataの情報を保管するFormインスタンスであることがわかります。これで、保管するSampleDatanameフィールドを指定していたわけです。

こんな具合に、フォームに用意するコントロールでは、fieldの値に、Modelインスタンスを保管するFormのフィールドを指定します。これさえ間違えずに行えば、フォームとModelをシームレスに処理できるようになります。

さて、コントローラー側を見てみましょう。送信されたフォームはsendformで処理されます。が、行なっている処理は実に簡単なものです。
Form<SampleData> dataform = form(SampleData.class).
    bindFromRequest();

まず、form(SampleData.class)というもののbindFromRequestメソッドを呼び出して、Formインスタンスを取得します。form(SampleData.class)というのは、SampleDataを管理するFormインスタンスを返すものです。これに、bindFromRequestによりリクエストで送られてきたフォームの情報をバインドし、送信された値を組み込んでいるのです。

これで、送信された値を保持するForm<SampleData.class>インスタンスができました。後はこれを保存するだけです。
dataform.get().save();

getは、Formに保管されているModelのインスタンスを返すメソッドです。これによりSampleDataのインスタンスが返されます。そしてその「save」を呼び出せば、SampleDataの内容がテーブルに保存されます。実に簡単!
flash();

念のため、バッファなどをフラッシュするflashを呼び出しておいて、これで保存はおしまいです。あとは、redirectメソッドをreturnしてリダイレクトしておくだけです。

このように、Modelの保存は、Model継承クラスのインスタンスを用意し、そのsaveを呼び出すだけで行えます。

※プログラムリストが表示されない場合

AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。

●プログラム・リスト●

※Application.java

package controllers;

import java.util.*;

import com.avaje.ebean.*;
import models.*;
import play.*;
import play.mvc.*;
import play.data.*;
import static play.data.Form.*;
import views.html.*;

public class Application extends Controller {

    public static Result index() {
        String title = "Sample Page";
        String msg = "フォームを入力";
        Form<SampleData> dataform = form(SampleData.class);
        return ok(index.render(title, msg, dataform));
    }
    
    public static Result sendform() {
        Form<SampleData> dataform = form(SampleData.class).
            bindFromRequest();
        if (!dataform.hasErrors()) {
            dataform.get().save();
            flash();
        }
        return redirect(routes.Application.index());        
    }
}



※index.scala.html

@(title: String, message: String, sampleform: Form[SampleData]) 
@import helper._ 

@main(title) {

    <h1>@title</h1>
    <p>@message</p>
    @form(action = routes.Application.sendform, args = 'id -> "SampleData") {
    
        @inputText( 
            field = sampleform("name"), 
            args = '_label -> "名前", 
            'placeholder -> "名前を入力" ) 
        @inputText( 
            field = sampleform("title"), 
            args = '_label -> "題名", 
            'placeholder -> "タイトル" ) 
        @inputText( 
            field = sampleform("memo"), 
            args = '_label -> "メモ", 
            'placeholder -> "いろいろ書く。" )
        
        <input type="submit">
    
    }

}

※関連コンテンツ

「初心者のためのPlay Framework入門」に戻る