libro
www.tuyano.com
Google App Engine for Java(GAE/J)プログラミング入門

データストアとオブジェクト検索 (3/7)

作成:2010-05-03 14:39
更新:2010-05-10 17:14

■LinkDataインスタンス取得用サーブレットの作成

では、JDOを利用し、保管してあるLinkDataインスタンスを取得するサーブレットを作成しましょう。これは、前回、自動生成されたMygaeServletクラスをそのまま再利用することにしましょう。

下のリスト欄に、ソースコードを掲載しておきます。ここでは、IDパラメータが送られているかどうかをチェックし、指定されたIDのオブジェクトだけを取り出すか、全オブジェクトを取り出すか決めるようにしています。また、取得されたオブジェクトは、Javaオブジェクトのまま送信するわけにはいかないので、ここではJSONデータとして出力することにしました。JSON(JavaScript Object Notation)は、JavaScriptのオブジェクトを記述するためのフォーマットです。このJSONの形式でデータをフォーマットし送信すれば、向こう側でJavaScriptを利用してデータを自由に活用できます。


※JDOによるデータ取得の流れ

では、どのようにして保管されているデータを所得しているのか、その流れをざっと整理しておきましょう。

1.PersistenceManagerFactoryの取得
まず最初に、PMFクラスのgetを呼び出し、PersistenceManagerFactoryインスタンスを取得します。

2.PersistenceManagerの取得
続いて、PersistenceManagerFactoryから「getPersistenceManager」メソッドを呼び出し、「PersistenceManager」クラスのインスタンスを取得します。このクラスが、JDOを使ってオブジェクトをやり取りするための機能を提供します。これで、データ取得の準備は整いました。

3.データの取得
PersistenceManagerのメソッドを使って、保管されているオブジェクトを取得します。ここでは、2通りの取得方法が使われています。

・IDを指定してオブジェクトを取得する
まず、取り出すオブジェクトのID番号がわかっている場合には、「getObjectById」というメソッドを使います。これは以下のように呼び出します。
Object 変数 = [PersistenceManager].getObjectById( 取得するクラス , ID番号 );

ここでは、getObjectById(LinkData.class,Long.parseLong(param1))というようにして、param1のIDは、番号のLinkDataインスタンスを取り出しています。IDがわかってる場合には、このように簡単に取り出せます。

・クエリーを使って取得する
全オブジェクトを取得する場合は、JDOに用意されている「JDOQL」という簡単なクエリー言語の文を送信して取得をします。これは以下のような形で行われます。
List 変数 = [PersistenceManager].newQuery( クエリー ).execute();

「newQuery」は、引数に指定されたJDOQLのクエリーを実行するためのQueryオブジェクトを生成します。そして、その「execute」を呼び出すことで、クエリーが実行されます。これにより取得されたデータは、Listインスタンスとして返されます。ここから必要に応じてオブジェクトを取り出し処理すればいいのです。

ここで実行しているクエリー文は、SQLのSelect文に相当するものです。これは以下のような形になっています。
select from クラス名

クラス名は、「クラス.class.getName()」という形で取得するのが一般的です。またSQLと異なり、フィールドの指定のようなものはありません。JDOQLで取得されるのはオブジェクトですから、常にすべてのフィールドが一式揃った形で得られます。SQLのように「指定した項目だけ取得する」というわけではないのです。

JDOQLについては、もっとさまざまな使い方があるのですが、とりあえずここでは「こうやってオブジェクトを取得できるのだ」ということだけ覚えておきましょう。

4.PersistenceManagerを閉じる
すべての作業が完了したら、PersistenceManagerの「close」を呼び出し、オブジェクトを開放します。これでデータアクセスの処理はすべて完了です。


なお、データ取得関係は、「取り出すデータが無い」という場合があるので注意しましょう。この場合、JDOObjectNotFoundException という例外が発生しますので、これに対処するようにしてください。またIDでデータを取得する場合、JDOオブジェクトはIDが1以上から開始されるため、IDにゼロを指定してgetObjectByIdすると、JDOObjectNotFoundException とは別の例外が発生しますので注意ください。

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

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

●プログラム・リスト●

package jp.tuyano;

import java.io.*;
import java.util.*;

import javax.jdo.*;
import javax.servlet.http.*;

@SuppressWarnings("serial")
public class MygaeServlet extends HttpServlet {
	public void doGet(HttpServletRequest req,
			HttpServletResponse resp)
			throws IOException {
		PersistenceManagerFactory factory = PMF.get();
		PersistenceManager manager = factory.getPersistenceManager();
		resp.setCharacterEncoding("UTF-8");
		resp.setContentType("text/html");
		req.setCharacterEncoding("utf-8");
		String param1 = req.getParameter("id");
		PrintWriter out = resp.getWriter();
		List<LinkData> list = null;
		if (param1 == null || param1 ==""){
			String query = "select from " + LinkData.class.getName();
			try {
				list = (List<LinkData>)manager.newQuery(query).execute();
			} catch(JDOObjectNotFoundException e){}
		} else {
			try {
				LinkData data = (LinkData)manager.getObjectById(LinkData.class,Long.parseLong(param1));
				list = new ArrayList();
				list.add(data);
			} catch(JDOObjectNotFoundException e){}
		}
		String res = "[";
		if (list != null){
			for(LinkData data:list){
				res += "{id:" + data.getId() + ",url:'" + data.getUrl() + "',title:'" +
					data.getTitle() + "',date:'" + data.getDatetime() +
					"',comment:'" + data.getComment() + "'},";
			}
		}
		res += "]";
		out.println(res);
		manager.close();
	}
}
※関連コンテンツ

「Google App Engine for Java(GAE/J)プログラミング入門」に戻る