EBeanによるModelの作成[Java編] (3/5)
作成:2013-03-03 11:11
更新:2013-03-03 11:11
更新:2013-03-03 11:11
■レコードを作成する
では、Modelによるデータベースの利用を行なってみましょう。まずは、なにはともあれ「レコードの作成」からです。データがなければ何も表示できませんからね。
レコードの作成には、先ほどのFinderは使いません。前回、ViewとControllerの説明で、フォームを管理するフォームヘルパーとFormクラスを利用しましたが、あのFormクラスを使ってModelを取得し、レコードを保存するのです。
これは、実際にサンプルコードを見ながら説明したほうがわかりやすいでしょう。下のリスト欄に、先ほどのSampleDataを利用したフォーム送信ページのサンプルを掲載しておきました。indexにアクセスして表示されるフォームにテキストを書いて送信すると、そのレコードがデータベースに保存されます。
ただし、最初にアクセスすると、Scalaのときにも出てきた「Database 'default' needs evolusion!」という表示が現れ、「このSQLスクリプトを実行する必要がある」と言ってきますので、「Apply this script now!」ボタンを押してSQLスクリプトを実行してください。Playによって自動生成されたSQLスクリプトが実行され、データベースにテーブルが自動生成されます。以後は、フォームが表示され、普通に送信できるようになります。(ただし、レコードの表示はまだ作ってないので、送信しても何も表示されませんが……)
ここでは、SampleData用のフォームを用意し、それを送信してコントローラー側でレコードに保存処理をしています。まずフォームヘルパーを見てみましょう。こんな具合に作っていますね。
actionは、sendformを指定してあります。そして、args = 'id -> "SampleData"と指定をしています。これにより、SampleDataというIDが設定されます。
フォーム内には3つの@inputTextが用意されています。例えば名前を入力する部分を見てみましょう。
fieldには、sampleform("name")が指定されています。sampleformというのは、冒頭の変数宣言を見ると、sampleform: Form[SampleData])とありますね。SampleDataの情報を保管するFormインスタンスであることがわかります。これで、保管するSampleDataのnameフィールドを指定していたわけです。
こんな具合に、フォームに用意するコントロールでは、fieldの値に、Modelインスタンスを保管するFormのフィールドを指定します。これさえ間違えずに行えば、フォームとModelをシームレスに処理できるようになります。
さて、コントローラー側を見てみましょう。送信されたフォームはsendformで処理されます。が、行なっている処理は実に簡単なものです。
まず、form(SampleData.class)というもののbindFromRequestメソッドを呼び出して、Formインスタンスを取得します。form(SampleData.class)というのは、SampleDataを管理するFormインスタンスを返すものです。これに、bindFromRequestによりリクエストで送られてきたフォームの情報をバインドし、送信された値を組み込んでいるのです。
これで、送信された値を保持するForm<SampleData.class>インスタンスができました。後はこれを保存するだけです。
getは、Formに保管されているModelのインスタンスを返すメソッドです。これによりSampleDataのインスタンスが返されます。そしてその「save」を呼び出せば、SampleDataの内容がテーブルに保存されます。実に簡単!
念のため、バッファなどをフラッシュするflashを呼び出しておいて、これで保存はおしまいです。あとは、redirectメソッドをreturnしてリダイレクトしておくだけです。
このように、Modelの保存は、Model継承クラスのインスタンスを用意し、そのsaveを呼び出すだけで行えます。
レコードの作成には、先ほどのFinderは使いません。前回、ViewとControllerの説明で、フォームを管理するフォームヘルパーと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インスタンスであることがわかります。これで、保管するSampleDataのnameフィールドを指定していたわけです。
こんな具合に、フォームに用意するコントロールでは、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を呼び出すだけで行えます。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
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">
}
}
※関連コンテンツ