sola's note -26ページ目

sola's note

日ごろのメモを書いていきます。何か新しいものを作るために。

引き続きGAE
今日はデータストアにデータを格納するところまでをローカルでやってみた。

しかしGAEとは少しそれて、
気になった事が…。

実はServletの基礎を理解していない。

Servletは何回か書いた事あるし、問題なく使える(多分)なんだけど、
いざ考えてみると、概要を理解していない気がした。

そこでまとめてみた。
まず対象となるよく見かけるコード。(Servletから一部抜粋)

ServletContext sc = getServletContext();
RequestDispatcher rd = sc.getRequestDispatcher("/ExForward2Servlet");
rd.forward(req, res);

上から順に①、②、③とでもしようか。
以下ざっくりなServletの処理順序。

1.サーブレットを用意したWebサーバを起動させる。
2.WebサーバがServletを初期化する。
 →ServletにServletConfigオブジェクトが提供される。
  ※このServletConfigオブジェクトにServletContextが含まれる!
   ⇒これを①で取る
   (ServletContextはサーブレットがサーブレットコンテナと通信する際に使用するメソッドをいくつか定義しています。)
3.RequestDispatcherの実装クラスを取得する。
 →RequestDispatcherはサーブレットがHTMLやJSPファイルを表示するためのインタフェース。
  ⇒②で転送するオブジェクトを用意します。
   (サーブレットコンテナによって作成されます。特定のパスに存在するサーバリソースのラッパーとして使用される。)
4.転送します。サーブレットからの要求を、②で設定したリソースに転送します。

とまあこんな感じ。

全くわからなかった人は高橋麻奈さんの本で流れを勉強すべし!

やさしいJava 活用編 第3版/高橋 麻奈
¥2,730
Amazon.co.jp


少し時間が出来たのでGAE(Google App Engine)について
詳細は以下URL参照なのだ
http://code.google.com/p/appengine-cl/

今回は以下の二つについて。

1.PersistenceManagerの呼び出し方法
2.データの永続化(登録)

細々しい事は書くと意味不明になるので割愛しようと思う。

まず
1.PersistenceManagerの呼び出し方法
について。

そもそも論から入ってしまうが、GAEではDBではなく、
データストアにエンティティを持たせるという形でデータの永続化を行う。
なので、データアクセスの仕方もEJBとかとは違って
PersistenceManager(以下PM)というものを使って行う。

そんで、今回はその呼び出し方。
PMはPersistenceManagerFactory(以下PMF)という
生成する用のクラス(ファクトリ)から作成されるのだけれど、
その仕組みは

PMFはシングルトンクラスとし、1つ以上インスタンス化ができないようにする。
 →PMFはfinalなPMF変数を持つ。(シングルトンだからね)
そのfinalなPMF変数はJDOHelperのメソッドにデータ永続化用の設定ファイル(jdoconfig.xml)
のパラメータ(transactions-optional)を引数として渡す事で用意されます。

ex.PMFクラスのフィールド
private static final PersistenceManagerFactory pmfInstance =
    JDOHelper.getPersistenceManagerFactory("transactions-optional");

ex.呼び出し方
PersistenceManager pm = PMF.get().getPersistenceManager();

これで生成したpmインスタンスを用いてデータストアとのやりとりを行う模様。

まあ簡単に書くと、
PMFクラスからpmfインスタンスを取得して使う。
その時に陰でJDOHelperのお世話になる。
という流れ。

次に
2.データの永続化(登録)
について。

個人的にはO/Rマッピングに近いのかという印象を受けたけど
エンティティというものを用いて、データストアに対してデータの永続化を行う。

この時のエンティティの書き方。

1.クラスにアノテーションを付ける
@PersistenceCapable(identityType = IdentityType.APPLICATION)
public class Hoge{
    //--
}

2.メンバ変数にLong型のidを定義して、アノテーションを2つ付ける。
@PrimaryKey
@Persistent(valueStrategy = IdGeneratorStrategy.IDENTITY)
private Long id;

3.永続化するメンバー変数にアノテーションを付ける。
@Persistent
private String hoge;

まあ、要はアノテーション付けろよって話みたいです。

4.エンティティが出来たらデータ保存!
PersistenceManager pm = PMF.get().getPersistenceManager();

Hoge hoge = new Hoge();
hoge.setHoge("hoge");

try {
    pm.makePersistent(e);
} finally {
    pm.close();
}

※保存が終わったらちゃんとクローズすること。

以上で保存までの流れ。
ちなみにまだ実践してない。
仕事でちょっと使っていた時のこと
文字列の日付を

String→Date→long→Date→String

と変えていく処理。
グレゴリオ暦で捉えて1970/01/01が底値(long型で0)だと思ったのだけれど

いざやってみると


-32400000


このマイナスはどこからくるのだ??
ミリ秒換算するとマイナス9時間


…時差?


そういえばデバックしてみた時はTIME_ZONEか何かがTokyoだったような。
時差0な場所に変更しなきゃダメ?

#parseメソッドの引数が二つにも出来たからやってたけど、
あれってエクセプション回避しかできないのな。
⇒parse(String source, ParsePosition pos)
(ParsePositionを指定するとParseExceptionが発生しない)