モデル(エンティティ)の作成 (4/5)
作成:2013-12-14 10:42
更新:2013-12-14 10:42
更新:2013-12-14 10:42
■データの追加と一覧表示
では、このMyDataのインスタンスを作ってデータストアに保存し、それを表示する、というデータベース利用の基本部分を作ってみましょう。
今回は、既に作ってあるindexアクション(IndexControllerクラスとindex.jsp)をそのまま再利用することにします。考え方としては、indexアクションのページに、データを追加するためのフォームとデータの一覧を表示したテーブルを用意することにします。フォームをindexにPOST送信したらそれがデータストアに追加されます。とりあえず1つのアクションで追加と表示が作れますね。
まずはコントローラーから作りましょう。IndexControllerクラスを下のリスト欄のように書き換えてください。これでソースコードは完成です。
●エンティティの保存
エンティティのデータストアへの保存は、 if (isPost()){……}の条件分岐で行っています。isPostでPOSTされたかどうかチェックし、された場合は、送信されたフォームの値を取得して、それを元にMyDataインスタンスを作り、データストアに保存します。
フォーム送信の処理については、前回やりましたね? asStringやasIntegerメソッドで、送られてきたフォームの値を取り出すことができました。
●エンティティ一覧の取得
queryは、引数の情報を元にエンティティを取得するためのクエリーオブジェクト(Slim3に用意されているModelQueryというクラスのインスタンスです)を生成します。queryでは、取得するエンティティクラスのclassか、そのメタクラスを引数に指定します。
ここでは引数にMyDataMetaクラスの「get」を指定していますね。これはMyDataMetaインスタンスを返すメソッドです。MyDataMetaクラスはシングルトン(常に1つのインスタンスしかない)なので、newせず、専用メソッドでインスタンスを取得します。
後は、ModelQueryから実際のモデルを取り出すだけです。「asList」は、検索されたエンティティをListにまとめて返すものです。多数のオブジェクトが得られる場合は、基本的にすべてasListでオブジェクトを取得する、と考えてください。
これで、保存されているMyDataがすべてListにまとめて取り出せました。
今回は、既に作ってあるindexアクション(IndexControllerクラスとindex.jsp)をそのまま再利用することにします。考え方としては、indexアクションのページに、データを追加するためのフォームとデータの一覧を表示したテーブルを用意することにします。フォームをindexにPOST送信したらそれがデータストアに追加されます。とりあえず1つのアクションで追加と表示が作れますね。
まずはコントローラーから作りましょう。IndexControllerクラスを下のリスト欄のように書き換えてください。これでソースコードは完成です。
●エンティティの保存
エンティティのデータストアへの保存は、 if (isPost()){……}の条件分岐で行っています。isPostでPOSTされたかどうかチェックし、された場合は、送信されたフォームの値を取得して、それを元にMyDataインスタンスを作り、データストアに保存します。
String myname = asString("myname");フォームから送られた値を取得します。まだindex.jspは作ってませんが、myname, mail, ageと、エンティティクラスのプロパティと同じ名前でフォームのフィールド類が用意されている、という前提でコードを書いておきましょう。
String mail = asString("mail");
int age = asInteger("age");
フォーム送信の処理については、前回やりましたね? asStringやasIntegerメソッドで、送られてきたフォームの値を取り出すことができました。
MyData mydata = new MyData();取得した変数を元に、MyDataインスタンスを作ります。これは単純ですね。newしてSetterメソッドを呼び出していくだけです。これで保存するエンティティのインスタンスは用意できました。
mydata.setMyname(myname);
mydata.setMail(mail);
mydata.setAge(age);
Datastore.put(mydata);これが、エンティティを保存する処理です。Datastoreクラスのputというメソッドを呼び出すだけ! このDatastoreクラスは、GAEの標準ライブラリではなく、Slim3に用意されているクラスです(GAEのデータストアクラスはDataStore、「S」が大文字です)。
●エンティティ一覧の取得
List<MyData> mydatas = Datastore.query(MyDataMeta.get()).asList();残る「エンティティの取得」についてです。これは、上の1文だけで行っています。Datastoreクラスの「query」というメソッドを呼び出し、その返値の「asList」を呼び出していますね。
queryは、引数の情報を元にエンティティを取得するためのクエリーオブジェクト(Slim3に用意されているModelQueryというクラスのインスタンスです)を生成します。queryでは、取得するエンティティクラスのclassか、そのメタクラスを引数に指定します。
ここでは引数にMyDataMetaクラスの「get」を指定していますね。これはMyDataMetaインスタンスを返すメソッドです。MyDataMetaクラスはシングルトン(常に1つのインスタンスしかない)なので、newせず、専用メソッドでインスタンスを取得します。
後は、ModelQueryから実際のモデルを取り出すだけです。「asList」は、検索されたエンティティをListにまとめて返すものです。多数のオブジェクトが得られる場合は、基本的にすべてasListでオブジェクトを取得する、と考えてください。
これで、保存されているMyDataがすべてListにまとめて取り出せました。
(by. SYODA-Tuyano.)
※プログラムリストが表示されない場合
AddBlockなどの広告ブロックツールがONになっていると、プログラムリスト等が表示されない場合があります。これらのツールをOFFにしてみてください。
●プログラム・リスト●
package com.tuyano.libro.myslim3app.controller; import java.util.List; import org.slim3.controller.Controller; import org.slim3.controller.Navigation; import org.slim3.datastore.Datastore; import com.tuyano.libro.myslim3app.meta.MyDataMeta; import com.tuyano.libro.myslim3app.model.MyData; public class IndexController extends Controller { @Override public Navigation run() throws Exception { String msg = "データの入力"; if (isPost()){ String myname = asString("myname"); String mail = asString("mail"); int age = asInteger("age"); MyData mydata = new MyData(); mydata.setMyname(myname); mydata.setMail(mail); mydata.setAge(age); Datastore.put(mydata); } List<MyData> mydatas = Datastore.query(MyDataMeta.get()).asList(); request.setAttribute("msg", msg); request.setAttribute("mydatas", mydatas); return forward("index.jsp"); } }
※関連コンテンツ