一覧取得のサーブレットを作る
前回、SampleDataオブジェクトをデータストアに保管する処理を作りました。今回は、保存されているSampleDataを取り出して表示する処理を考えていきましょう。
まずは、「すべてのオブジェクトを取得し、一覧表示する」処理を考えましょう。これは、JSPやサーブレットなどですべてまとめて処理してもいいのですが、メンテナンスなどを考え、「一覧を取得してテーブルにまとめて書き出すサーブレット」と、「ページの表示を行うJSP」の組み合わせで作ってみましょう。
まずは、サーブレットからです。これは、プロジェクトに最初から作成されていた「Gae_heloServlet」サーブレットを書き換えて利用することにしましょう。以下のようにソースコードを書き換えてください。
package jp.allabout;
import java.io.*;
import java.util.List;
import javax.jdo.PersistenceManager;
import javax.servlet.http.*;
@SuppressWarnings("serial")
public class Gae_heloServlet extends HttpServlet {
@SuppressWarnings("unchecked")
public void doGet(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
resp.setContentType("text/html");
PersistenceManager pm = PMF.get().getPersistenceManager();
String query = "select from " + SampleData.class.getName();
List<SampleData> datas = (List<SampleData>) pm.newQuery(query).execute();
Writer out = resp.getWriter();
out.write("<table border=\"1\">");
out.write("<tr><th>ID</th><th>Message</th><th>Account</th><th>Date</th></tr>");
for(SampleData data : datas){
out.write("<tr>");
out.write("<td>" + data.getId() + "</td>");
out.write("<td>" + data.getMessage() + "</td>");
out.write("<td>" + data.getAccount() + "</td>");
out.write("<td>" + data.getDate() + "</td>");
out.write("</tr>");
}
out.write("</table>");
}
}
データストアから、指定のクラスのオブジェクトを取得する場合には、まずPersistenceManagerを用意します。
PersistenceManager pm = PMF.get().getPersistenceManager();
PMFクラスのgetでPersistenceManagerFactoryインスタンスを取得し、そのgetPersistenceManagerでPersistenceManagerを取得する、というのが基本でしたね。続いて、必要なデータを取得するためのクエリーをString値として用意します。
String query = "select from " + SampleData.class.getName();
PersistenceManagerでは、クエリーをそのまま実行して結果を得る機能があります。通常のデータベースではSQLを使いますが、JDOの場合、「JDOQL」という専用のデータアクセス言語を使ってクエリーを用意します。といっても、このJDOQLは、ほとんどSQLと同じ感覚で記述することができます。
ここでは、「select from クラス名」という形になっていますね。これにより、指定したクラスのインスタンスをデータストアからすべて取り出して返します。JDOQLでも、データの取得はこのようにselect文を使います。SQLと違うのは、fromで指定するのがテーブル名ではなくクラス名である、という点でしょう。
List<SampleData> datas = (List<SampleData>) pm.newQuery(query).execute();
PersistenceManagerの「newQuery」というメソッドで、Queryクラスのインスタンスが得られます。これは引数にクエリーのStringを渡して呼び出すことで、そのクエリーを実行するためのインスタンスを返す働きをします。
このQueryから「execute」を実行すると、クエリーを実行し、結果を返値として返します。返されるのは、取得されたオブジェクトがまとめられたListインスタンスになります。ここではList<SampleData> datasというように、SampleDataインスタンスのみがまとめられたListにキャストをして取り出しています。
後は、繰り返しを使い、Listから順にオブジェクトを取り出しては、そのgetId、getMessage、getAccount、getDateといったメソッドを使って値をテーブルとして出力していくだけです。これは説明の要はないでしょう。