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"> } }
※関連コンテンツ