App Engine のデータストアを JDO で使ってみよう

JDO を用いて App Engine のデータストアにオブジェクトを格納する

ここでは試しに単純に JDO を用いて、App Engine 上のデータストアにオブジェクトが格納できることを確認しましょう。

手順は以下のとおりです。

  1. テスト用サーブレット、ホストページの作成
    • 格納するオブジェクトのクラスの定義
    • PersistenceManagerFactory クラスの作成
    • テスト用サーブレットクラスの作成
    • サーブレットの設定
    • テスト用ホストページの作成
  2. Google App Engine へのデプロイ
  3. テストと動作確認

テスト用サーブレット、ホストページの作成

格納するオブジェクトのクラスの定義

次のような Employee クラスを考えます。フィールドは Key、 name および email であり、 それらを @Persistent として指定しています。Key は ID となるフィールドで、一意となる値を自動生成します。

package com.keicode.gwt.test.mytest.server;

import javax.jdo.annotations.IdGeneratorStrategy;
import javax.jdo.annotations.PersistenceCapable;
import javax.jdo.annotations.Persistent;
import javax.jdo.annotations.PrimaryKey;

import com.google.appengine.api.datastore.Key;

@PersistenceCapable
public class Employee {

     @PrimaryKey
     @Persistent( valueStrategy = IdGeneratorStrategy.IDENTITY )
     private Key key;
     
     @Persistent
     private String name;
     
     @Persistent
     private String email;
     
     public Employee( String name, String email ) {
          this.name = name;
          this.email = email;
     }

     public Key getKey() {
          return this.key;
     }
     
     public String getName() {
          return this.name;
     }
     
     public String getEmail() {
          return this.email;
     }
}

これは、src\com\keicode\gwt\test\mytest\server に作成します。

PersistenceManagerFactory クラスの作成

また、同じパッケージに PersistenceManagerFactory のラッパークラスを作成しておくと便利ですので作ります。

package com.keicode.gwt.test.mytest.server;

import javax.jdo.JDOHelper;
import javax.jdo.PersistenceManagerFactory;

public final class PMF {
     private static final PersistenceManagerFactory pmfInstance =
         JDOHelper.getPersistenceManagerFactory("transactions-optional");

     private PMF() {}

     public static PersistenceManagerFactory get() {
         return pmfInstance;
     }
}

テスト用サーブレットクラスの作成

上記を利用して、サーブレット内でデータを格納します。

まず、SaveEmployeeServlet というクラスを以下のように定義します。

package com.keicode.gwt.test.mytest.server;

import java.io.IOException;
import java.io.PrintWriter;
import javax.jdo.PersistenceManager;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

@SuppressWarnings("serial")
public class SaveEmployeeServlet extends HttpServlet {

     public void doPost(HttpServletRequest req, HttpServletResponse resp) 
          throws IOException {

          // パラメータの取得
          String name = req.getParameter("name");
          String email = req.getParameter("email");
          
          // オブジェクトの生成
          Employee emp = new Employee( name, email);
          
          // PersistenceManager の作成
          PersistenceManager pm = PMF.get().getPersistenceManager();

          try {
                    // オブジェクトの格納
                    pm.makePersistent(emp);

          } finally {
          
               pm.close();
          
          }

          PrintWriter out = resp.getWriter();
          resp.setContentType("text/html");
          out.format(
                    "<html><body><p>%s - %s</p></body></html>",
                    name, email 
          );
          
     }
}

これも src\com\keicode\gwt\test\mytest\server に配置します。

サーブレットの設定

war/WEB-INF/web.xml に以下のエントリを追加します。

<servlet>
   <servlet-name>empServlet</servlet-name>
   <servlet-class>com.keicode.gwt.test.mytest.server.SaveEmployeeServlet
</servlet-class>
</servlet>  
<servlet-mapping>
   <servlet-name>empServlet</servlet-name>
   <url-pattern>/mytest/emp</url-pattern>
</servlet-mapping>

これによって、/mytest/emp への POST リクエストを、 empServert (実装は com.keicode.gwt.test.mytest.server.SaveEmployeeServlet クラス) が処理できるようになります。

テスト用ホストページの作成

サーブレットに POST リクエストを送信するためのホストページ (HTML ページ) を war 以下に作成します。 ここでは war/MyTest2.html として以下を保存します。

<form action="/mytest/emp" method="POST">
<table>
<tr><td>Name:</td><td><input type="text" name="name"></td></tr>
<tr><td>Email:</td><td><input type="text" name="email"></td></tr>
<tr><td colspan="2"><input type="submit" value="OK"></td></tr>
</table>
</form>

Google App Engine へのデプロイ

Eclipse で Google メニュー から Deploy to App Engine を選択すると、自動的にコンパイルされ Google App Engine へデプロイされます。

テストと動作確認

App Engine へのデプロイが完了したら、http://your appid.appspot.com/MyTest2.html にアクセスします。すると、上で作成したテスト用ホストページが表示されるはずです。

テストフォームにテストデータ (この場合は名前とメールアドレス) を入力して、OK をクリックします。

次のように応答があります。

これは上記 SaveEmployeeServlet クラスで書き出している応答です。確かにサーブレットが実行されました。

Google App Engine の管理画面のデータストアビューア (Datastore Viewer) で、 本当にオブジェクトが格納されたか確認しましょう。

Google App Engine の管理画面にサインインして、データストア・ビューアにて GQL を実行することによって、 確かにオブジェクトが格納されていることが確認できます。

以上、このページでは JDO を用いて Google App Engine のデータストアにオブジェクトを格納する簡単なサーブレットを作成し、 テストフォームから送信したデータを基にしたオブジェクトが、確かにデータストアに格納されたことを確認しました。