1
プロジェクト I/II (H グループ )
補足資料
はじめての Google App Engine for
Java (きしだ なおき著)の活
用
日紫喜 光良
2011/11/25
2012/09/21 改訂
2
内容
• サーブレットと JSP (スライド4~7)
– 動的なページ作成が目的
• CGI との比較→利点
• データストア(スライド8~16)
– 保存できるオブジェクト: Entity 型
– DatastoreService インターフェースの使い方
• 登録 / 削除
• 取得 / 検索
– 1つ取ってくる / 同じ型のデータを丸ごと取ってくる
– サーブレットでの使い方
• サンプルプログラムの応用(スライド 17 ~ 19 )
• NetBeans に関しての注意
• Java, JSP に関しての注意
• テキストの間違いと考えられる箇所
3
目標
• 入力に応じた動的なページ生成(データベー
ス不使用)
– 教科書~89頁
– スライド6~9枚目
• 入力に応じた動的なページ生成(データベー
ス使用) – 教科書90~133頁
– スライド10~16枚目
• 習得した技術に応じた仕様立案と実装。仕様
の図示。 – スライド17~19枚目
4
CGI( Common Gateway
Interface )による動的なページ
の作成
HTTP サーバプロセス HTTP の
GET リクエ スト
HTML/XML
HTTP の
GET/POST リク エスト
HTML/XML
リクエス トが CGI
に対する ものでな
かった場 合
リクエス トが CGI
に対する ものであ
る場合
外部プロセス
が起動される
CGIプログラム
標準入力
標準出力
環境変数 GET/POST の判断
パラメータ の読み取り 処理
出力 終了 ブラウザ
5
CGIの問題点(と言われている
もの )
• プロセス起動のためパフォーマンスが悪
い
• ステートレス(複数のリクエストにまた
がってメモリ上でデータを維持できない
)
6
サーブレットによる動的なページ
作成
ブラウザ
HTTP サー バプロセス
サーブレット・エンジンのプロ セスから起動される
派生クラスのインスタンスのス レッド
Servlet クラ スと派生ク ラス(常駐)
派生クラスの インスタンス doGet/doPost メソッド
リダイレクト 呼出し HTTP の
GET/POST リクエスト
HTML/XML
起動
参考:(1)「はじめての Google App Engine for Java 」 79~81, 101~106, 118~119 頁 http://www.atmarkit.co.jp/fjava/keyword/jkey/jkey01.html
(2) Java を紐解くための重点キーワード Java Servlet ( サーブレット ) それぞれGET/POST リ クエストを 担当
7
JSP も用いた動的なページ作成
ブラウザ
HTTP サー バプロセス
Servlet クラ スと派生ク ラス(常駐)
派生クラスのインスタン ス doGet/doPost メソッ
ド リダイレクト
呼出し GET/POST
リクエスト
HTML/XML
起動 JSP: JavaServer Page
JSP ファイ ル
RequestDispatcher 型のオブジェク ト
レスポンス処理を委 譲する( forward )
JSP エンジ
ン 実行時に処理
(b) JSP を呼び出す サーブレット
生成
(a)
(a) の例:「はじめて の・・・」 160 頁 (b) の例:「はじめて
の・・・」 39, 82~83 ( 39 頁の 解説)
JSP ファイルの書き方:「は じめての・・・」 35~36, 81~86 頁
(a) :ページを直接生成
8
Datastore に保存できるオブジェ
Entity 型・・・「プロパティと値」のペアの集合 クト
Kind Xxx
Kind Yyy
Kind Zzz
Property_A←Value_A Property_B←Value_B Property_C←Value_C
各オブジェクトの Key と ID は省略してある。
その他のデータ型は「はじめての・・・」 99,100 頁を見よ
92 頁も読むこと
同じ属性セットをも つ Entity を Kind と いう( 92 頁参照)
。
9
Entity 型オブジェクトの生成方
法
• 1.プログラムの中で必要になるたびに Kind を定義
– 例: Entity member = new Entity("Member");
• 2. Class の定義と継承
– 例:
98 頁など参照
EntityBase.java package db;
...
public class EntityBase { protected Entity entity;
public EntityBase(Entity entity){ ...
}
public Entity getEntity(){ ...
} ... }
Member.java package db;
...
public class Member extends EntityBase { public Member(Entity entity){
super(entity); }
... }
134 頁~参照
MemberListServelet.java ...Entity m;
db.Member member = new db.Member(m);
10
Datastore へのオブジェクトの登録
1. DatastoreService 型
のオブジェクトを生成 2. Entity 型のオブジェ
クトを生成
3. ds を通じてオブ
ジェクトを登録
ds
Datastore
Entity 型オブジェ
クト member
ds.put(member);
DatastoreService ds = DatastoreS
erviceFactory.getDatastoreServic
e();
Entity member = new Entity("Member");
member.setProperty...
ds: DatastoreService 型
のオブジェクト
98 頁参照 Datastore でのオブジェクト
の ID とキーは登録時に自動 生成される
11
Datastore からのオブジェクトの
取得 / 削除: ID が既知の場合
ds
Datastore
Kind と ID
Entity 型オブジェクト
member
Entity member = ds.get(key);
データの削除は
ds.delete(key);
3.データの取得
1. DatastoreService 型オブジェクトを生成(前スライ
ド参照)
2.取得するオブジェクトのキーを取
得 KeyFactory イン
ターフェース Key オブジェクト k 型
Key key = KeyFactory.createKey("Member",id); ey
103 頁参照
Datastore からのオブジェクトの取得:
プロパティによる検索の場合
1. DatastoreService 型オブジェクト ds を生成
2. Query 型オブジェクトを生成(取得 Entity の Kind
を指定)
Query q = new Query(“Member”);3. Query 型オブジェクトへのフィルターを定義する
。 キーの値による並べ替えフィルター
プロパティの値による抽出フィルター
4.以上のクエリーを、 ds を通じて実行し、結果を
PreparedQuery 型オブジェクトに収納する。
q.addSort(Entity.KEY_RESERVED_PROPERTY, Query.SortDirection.ASCENDING);
q.addFilter(“screenName”,Query.FilterOperator.EQUAL,screenName); 110 頁参照
119 頁参照
PreparedQuery pq = ds.prepare(q);
13
Datastore からのオブジェクトの取得:
検索結果のリスト化と利用
Entity 型オブジェクト member
Entity 型オブジェクト member
Entity 型オブジェクト member
List<Entity> 型の
オブジェクト
members
1.リスト化
List<Entity> members =
pq.asList(FetchOptions.Builder.withLimit(20));
2.リストの処理
for (Entity m : members) { ….
m.getKey().getId();
m.getProperty(“xxx”).toString(); ……
}
108 頁等参照
110 頁参照
14
Datastore の使い方(1)
DBに登録する場合
HttpServlet クラスの
派生クラスのオブジェク ト doGet/doPost メソッ
ド request
response
パラメータの値の取得(囲み参照) DatastoreService 型オブジェクト ds の 生成登録する Entity 型オブジェクト xxx の 生成xxx の各プロパティに値を設定
ds を介して xxx を登録
「はじめて
の・・・」 95, 97~101 頁など参照
リクエストからのパラ メータの値の取得方法 getParameter を用いる (POST の場合 )
getPathInfo() を用いる (GET の場合 )
104 頁等
15
Datastore の使い方(2)
キーでデータを取得する場合
HttpServlet クラスの
派生クラスのオブジェク ト doGet/doPost メソッ
ド request
response
パラメータ、とくに ID の取得(囲み参照) DatastoreService 型オブジェクト ds の
生成
Key 型オブジェクト key の生成
ds を介して Entity 型オブジェクト xxx を取得
「はじめて
の・・・」 103, 104
~ 106 頁など参照 リクエストからのパラ メータの値の取得方法 getParameter を用いる (POST の場合 )
getPathInfo() を用いる (GET の場合 )
104 頁等
16
Datastore の使い方( 3 )
クエリーで取得(検索)する場
合
HttpServlet クラスの
派生クラスのオブジェク ト doGet/doPost メソッ
ド request
response
パラメータの値の取得(囲み参照) DatastoreService 型オブジェクト ds の 生成
Query 型オブジェクト q の生成 q にフィルターを設定
PreparedQuery 型オブジェクト pq の生 成pq による ds からのリスト型オブジェ クトの取得
「はじめて
の・・・」 107 ~ 108 頁 , 109 ~ 111 頁など参 照
リクエストからのパラ メータの値の取得方法 getParameter を用いる (POST の場合 )
getPathInfo() を用いる (GET の場合 )
104 頁等
17
サンプルプログラムのアレンジに向けて
収納するデータ構造を考える (1)
→ 複雑なものは避ける
ID key Restaurant Reviewer Review
18
サンプルプログラムのアレンジに向けて
( 2 )
データの処理の種類を決める
→ どのサンプルプログラムと似ている
か?
(例2)Register a restaurant
Delete a restaurant
List all the restaurants
Search for restaurants
Edit a review about a restaurant
95 ~ 96 頁 132 ~ 133 頁
107 ~ 108 頁 , 131 頁 109~120 頁
124 ~ 131 頁 登録
削除 一覧表示
検索 変更
19
サンプルプログラムのアレンジに向けて
( 3 )
データの処理の流れを決める
→ どの画面がどのプログラムの入力あ
るいは出力か?その画面は動的か静的
か?
(例3)
List all the
restaurants
Delete a
restaurant
Edit a review
Register a
restaurant
List of the restaurants
Review(s) of a restaurant
Select a
restaurant
動的な画面はサーブレット から直接出力するか、 JSP を用いるかによって作る。
Start
20
NetBeans についての注意(1)
• 配布 USB には ver. 6.9.x と 7.1.x が入ってい
ますが ver. 6.9.x のほうを使ってください
。
• 起動するために USB の中にショートカッ
トを用意しました。
• 起動にはかなり時間がかかります。
21
NetBeans についての注意(2)
• マルチメディアスタジオ備え付けのノートPCのディ
スクはシャットダウン時にクリーンアップされること
に注意
• (初回のみ) Google App Engine SDK for Java をUSBメ
モリ上にダウンロードすること( 28 頁)。
– まずデスクトップに落としてから USB にコピーするとよい。
• 毎回の実習において、プラグインのインストール( 24
~ 28 頁)、サーバーの追加( 29 ~ 31 頁)を行うこと
。
• (初回のみ)プロジェクトの作成( 32 頁)時に、保存
場所として USB メモリ上の /work を使うとよい。
• プログラムやファイルの名前や URL マッピングを間違
ったときは、 web.xml ファイルのGUIをもった設定
画面から訂正もしくは削除する( 89 頁参照)。
22
Java, JSP についての注意
• 関数やクラスを使うために必要なパッケ
ージをインポートするのを忘れないこと
– 例: Date クラスを使うには java.util.Date を。
• 変数やメソッドの名前にはローマ字の日
本語ではなく英語を使うことが望ましい
。
23
テキストのコードで変えたほうがいいとこ
ろ
• 36 頁 <c:out value=" → <c:out valu
e='
– 閉じるほうも同様に。
• 102 頁本文 クラス名「 MemberIdSerlve
t 」→クラス名「 MemberIdServlet 」
• 131 頁 > 削除 </a></td>“, → > 削除 </
a></td></tr>",
スケジュール
• 最終回( 11/2 )は最終発表会のみ
• 中間( 10/12 または 10/19 )に、制作物の
仕様発表会をおこなう。
– 何を作るのか(ユースケースの図示)
– どのように作るのか
• プログラムの構成の図示
– どのようなクラスが含まれるか(図に含める)
– 必要なメソッドの概要
• プログラムの動作の図示
24