一覧取得のサーブレットを作る


前回、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といったメソッドを使って値をテーブルとして出力していくだけです。これは説明の要はないでしょう。