1
プロジェクト I/II (H グループ )
補足資料
はじめての Google App Engine for
Java (きしだ なおき著)の活用
日紫喜 光良
2011/11/25
2
内容
• サーブレットと JSP
– 動的なページ作成が目的
• CGI との比較→利点
• データストア
– 保存できるデータ
– DatastoreService 型のオブジェクトでデータを出し入れする
• 登録
• 取得 / 検索
– 1つ取ってくる/丸ごと取ってくる
– サーブレットでの使い方
• サンプルプログラムのアレンジパターン
• NetBeans に関しての注意
• Java, JSP に関しての注意
• テキストの間違いと考えられる箇所
3
CGI( Common Gateway Interface )
による動的なページの作成
HTTPサーバ プロセス HTTPのGET
リクエスト
HTML/XML
HTTPのGET/POST リクエスト
HTML/XML
リクエスト
が CGI に対
するもので
なかった場
合
リクエスト
が CGI に対
するもので
ある場合
外部プロセスが
起動される
CGIプログラム
標準入力
標準出力
環境変数 GET/POSTの 判断
パラメータの 読み取り 処理 出力 終了 ブラウザ
4
CGIの問題点(と言われている もの )
• プロセス起動のためパフォーマンスが悪い
• ステートレス(複数のリクエストにまたがってメ
モリ上でデータを維持できない)
5
サーブレットによる動的なページ作成
ブラウザ
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リ クエストを担 当
6
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頁
7
Datastore に保存できるオブジェクト
Entity 型・・・「プロパティと値」のペアの集合
Kind Xxx
Kind Yyy
Kind Zzz
Property_A←Value Property_B←Value Property_C←Value
各オブジェクトのKeyとIDは省略してある。
データ型は「はじめての・・・」99,100頁を見よ
92 頁も読むこと
8
DatastoreService 型オブジェクトで
Datastore へデータを登録 / 取得(1)
ds: DatastoreService 型のオブジェクト
ds
Entity 型オブジェクト
obj
Datastore
ds.put( obj );
Kind と ID
Entity 型オブジェクト
obj
ds.get( key );
KeyFactory クラスが Key クラス
のオブジェクト key を生成
IDとキーは登録時 に自動生成される
データの修正
→登録
データの
削除へ
データの登録
データの削除は
ds.delete( key );
データの取得
テキスト98頁も読むこと
9
DatastoreService 型オブジェクトで
Datastore からデータを取得( 2 )(検索)
ds: DatastoreService 型のオブジェクト
ds
Datastore
Kind
Entity型オブジェクト obj
Query クラス
のオブジェクト
q を生成
q にフィルター
を追加
PreparedQuery インターフェー スのオブジェク トpq
ds.prepare( q );
Entity型オブジェクト obj
Entity型オブジェクト obj
List<Entity> 型の
オブジェクト
検索とはいっても、 基本的には、1種 類のKindをまとめて とってくることしかで きないことに注意
結果をList 型で取得
テキスト98, 109~113頁も読むこと
10
Datastore の使い方(1)
DBに登録する場合
HttpServletクラスの 派生クラス
doGet/doPost メソッド request
response
パラメータの値の取得(囲み参照)
DatastoreService型オブジェクトdsの生成 登録するEntity型オブジェクトxxxの生成 xxxの各プロパティに値を設定
dsを介してxxxを登録
「はじめての・・・」95, 97~101頁など参照
リクエストからのパラメータ の値の取得方法
getParameterを用いる (POSTの場合)
getPathInfo()を用いる (GETの場合)
11
Datastore の使い方(2)
キーでデータを取得する場合
HttpServletクラスの 派生クラス
doGet/doPost メソッド request
response
パラメータ、とくにIDの取得(囲み参照) DatastoreService型オブジェクトdsの生成 Key型オブジェクトkeyの生成
dsを介してEntity型オブジェクトxxxを取得 「はじめての・・・」104 103,
~106頁など参照 リクエストからのパラメータ の値の取得方法
getParameterを用いる (POSTの場合)
getPathInfo()を用いる (GETの場合)
12
Datastore の使い方( 3 )
クエリーで取得(検索)する場合
HttpServletクラスの 派生クラス
doGet/doPost メソッド request
response
パラメータの値の取得(囲み参照)
DatastoreService型オブジェクトdsの生成 Query型オブジェクトqの生成
qにフィルターを設定
PreparedQuery型オブジェクトpqの生成 pqによるdsからのリスト型オブジェクトの 取得
「はじめての・・・」107~ 108頁, 109~111頁など 参照
リクエストからのパラメータ の値の取得方法
getParameterを用いる (POSTの場合)
getPathInfo()を用いる (GETの場合)
13
サンプルプログラムのアレンジに向けて(1)
収納するデータ構造を考える
→複雑なものは避ける
例(1)本来可変個数のプロパティを固定個数にする
ID key Restaurant Reviewer 1 Review 1 Reviewer 2 Review 2
14
サンプルプログラムのアレンジに向けて( 2 )
データの処理の種類を決める
→どのサンプルプログラムと似ているか?
(例2)登録(Register)、一覧表示(List)、選択表示(Select)、削除(Delete)、書込み (Record)のどれかで済まされないか?
Register a restaurant
Delete a restaurant
List all the restaurants
Select a restaurant
Record/Modify a review about a restaurant
95~96頁 132~133頁
107~108頁 131頁
127~128頁
15
サンプルプログラムのアレンジに向けて( 3 )
データの処理の流れを決める
→どの画面がどのプログラムの入力あるい
は出力か?その画面は動的か静的か?
(例3)
List all the
restaurants
Delete a
restaurant
Record/
Modify
Register a
restaurant
List of the restaurants
Empty
/Recorded review(s) of a restaurant
Select a
restaurant
動的な画面はサーブレットか ら直接出力するか、JSPを用い るかによって作る。
16
NetBeans についての注意
• マルチメディアスタジオ備え付けのノートPCのディスク
はシャットダウン時にクリーンアップされることに注意
• (初回のみ) Google App Engine SDK for Java をUSBメモ
リ上にダウンロードすること。
• 毎回の実習において、プラグインのインストール( 24 ~
28 頁)、サーバーの追加( 29 ~ 31 頁)を行うこと。
• (初回のみ)プロジェクトの作成( 32 頁)時に、保存場所
として USB メモリ上の /work を使うとよい
• プログラムやファイルの名前や URL マッピングを間違っ
たときは、 web.xml ファイルのGUIをもった設定画面か
ら訂正もしくは削除する( 89 頁参照)。
17
Java, JSP についての注意
• 関数やクラスを使うために必要なパッケージ
をインポートするのを忘れないこと
– 例: Date ・・・ java.util.Date
• 変数やメソッドの名前にはローマ字の日本語
ではなく英語を使うこと
18