
Google App Engineで手軽に試すJavaクラウド(2)
BigtableデータをApp EngineのJSPで日本語表示
有限会社サイバースペース
清野克行
2009/5/26
■ データ書き込み用サーブレット
サーブレットは、先ほどのリスト2をリスト6のように変えます。
リスト6 SignGuestbookServlet.javapackage guestbook;
import java.io.IOException;
import java.util.Date;
import javax.jdo.PersistenceManager; // 【1】
import javax.servlet.http.*;
import com.google.appengine.api.users.User;
import com.google.appengine.api.users.UserService;
import com.google.appengine.api.users.UserServiceFactory;
import guestbook.Greeting; // 【2】
import guestbook.PMF; // 【2】
public class SignGuestbookServlet extends HttpServlet {
public void doPost(HttpServletRequest req, HttpServletResponse resp)
throws IOException {
UserService userService = UserServiceFactory.getUserService();
User user = userService.getCurrentUser();
String content = req.getParameter("content");
Date date = new Date();
// 【3】始まり
Greeting greeting = new Greeting(user, content, date);
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
pm.makePersistent(greeting);
} finally {
pm.close();
}
// 【3】終わり
resp.sendRedirect("/guestbook.jsp");
}
}
リスト6でデータストアへのアクセスに直接関係するコード記述は、【1】〜【3】がすべてです。
【1】でPersistenceManagerクラスをインポートし、次に【2】で、ここで作成したGreetingとPMFクラスをインポートします。
【3】では、最初に作成したGreetingクラスのインスタンスgreetingを生成します。前に見たように、コンストラクタ呼び出しによって、登録するデータ項目の値が永続化指定のメンバ変数にセットされます。次の行では、これも作成済みのPMクラスのgetメソッドからPersistenceManagerのインスタンスpmを生成し、最後にpmインスタンスのメソッドmakePersistentを、引数にgrettingを指定して実行すると、データストアへの登録が行われます。
【3】での登録(永続化)処理終了後、「resp.sendRedirect("/guestbook.jsp");」のリダイレクトでJSPの表示に切り替わります。この中では、直前に登録したばかりのデータをJSPで検索・表示することになります。
BigtableデータをSQLライクに参照できるJDOQLとは?
以上がデータストアへの登録処理でしたが、次にJSPでのデータの参照について見ていきます。リスト1をリスト7のようにデータストア・エンティティの参照表示ができるように変えます。
リスト7 guestbook.jsp<%@ page contentType="text/html;charset=UTF-8" language="java" %>
<%@ page import="java.util.List" %>
<%@ page import="javax.jdo.PersistenceManager" %>
<%@ page import="com.google.appengine.api.users.User" %>
<%@ page import="com.google.appengine.api.users.UserService" %>
<%@ page import="com.google.appengine.api.users.UserServiceFactory" %>
<%@ page import="guestbook.Greeting" %>
<%@ page import="guestbook.PMF" %>
<html>
<body>
<%
UserService userService = UserServiceFactory.getUserService();
User user = userService.getCurrentUser();
if (user != null) {
%>
<p>今日は <%= user.getNickname() %>! (ここから<a href="<%= userService.createLogoutURL(request.getRequestURI()) %>">サインアウト</a>できます。)</p>
<%
} else {
%>
<p>今日は!<a href="<%= userService.createLoginURL(request.getRequestURI()) %>">サインイン</a>すると送信メッセージがサインイン名付で表示されます。</p>
<%
}
%>
<%
PersistenceManager pm = PMF.get().getPersistenceManager(); // 【1】
String query = "select from " + Greeting.class.getName()+ " order by date"; // 【1】
List<Greeting> greetings = (List<Greeting>) pm.newQuery(query).execute(); // 【1】
if (greetings.isEmpty()) {
%>
<p>The guestbook has no messages.</p>
<%
} else {
for (Greeting g : greetings) {
if (g.getAuthor() == null) {
%>
<p>匿名ユーザの書き込み</p>
<%
} else {
%>
<p><b><%= g.getAuthor().getNickname() %></b>の書き込み:</p>
<%
}
%>
<blockquote><%= g.getContent() %></blockquote>
<%
}
}
pm.close();
%>
<form action="/sign" method="post">
<div><textarea name="content" rows="3" cols="60"></textarea></div>
<div><input type="submit" value="メッセージ送信" /></div>
</form>
</body>
</html>
リスト6で赤太字の部分がデータストアアクセスに関係する部分ですが、その中でも【1】がポイントになります。
【1】の最初の行では、作成したPMクラスを使用してインスタンスpmを生成しています。これは、前の登録処理でも行われていたもので、データストアアクセスで必須の定型的な処理です。
次の行で文字列queryにセットされる「select……」の記述は、RDBのSQL文に似た書式ですが、JDOにアクセスする文なので「JDOQL」と呼ばれます。
ここでのJDOQLは、サーブレットで登録した内容を全件・検索して日付け昇順に表示する処理内容となっています。fromの後の「Greeting.class.getName()」の部分は、GAEサイトのサンプル記述によるものです。これを「guestbook.Greeting」に変え、JDOQLを次のように書き換えても問題ありません。
String query = "select from guestbook.Greeting order by date";つまり、アクセス対象となるデータストアオブジェクトは「パッケージ名.データクラス名」になっているのです。
3行目では、2行目で設定したqueryを引数にデーストア検索を実行します。返される値はコレクションとなり、List型で受け取ります。後は、リストから順にデータを取り出して処理します。「(if (g.getAuthor() == null))」で、サインインユーザーか否かで表示内容を切り分けながら、1件ずつ書き込み内容である「g.getContent()」を表示していきます。
次回は、jQueryでAppEngineアプリをAjax化!
今回はJSPでのUI表示とBigtableへのアクセスを中心に見てきましたが、次回はjQueryと組み合わせてみたいと思います。
ご存じだとは思いますが、AjaxはGoogleマップによって世に広められ、Googleドキュメントなどにも使われています。GAEjのUIにもAjax(jQuery)を適用してリッチクライアントにしていきましょう。またBigtableについても、もっと理解を深めていきたいところです。次回は、このような内容について解説していく予定です。
■ @IT関連記事
| Javaはクラウドのプラットフォームになり得るのか 小山博史のJavaを楽しむ(11) 最近よく聞く「クラウドコンピューティング」の視点からJavaを見直すと、Amazon EC2などレンタルサーバとの関係性やイロイロ見えてきます 「Java
Solution」フォーラム 2008/10/30 |
| Aptanaなら開発環境とクラウドの連携が超お手軽! ユカイ、ツーカイ、カイハツ環境!(4) Aptana Cloudを使うとEclipseベースの開発環境で作ったPHPやRails、Javaアプリを手軽にクラウドで活用できSubversion連携も簡単だ 「Java Solution」フォーラム 2009/3/26 |
| Java/GrailsのWebアプリを無料クラウド環境で動かす Ruby on Railsも動かせる「Morph AppSpace」とは? 最近よく聞く「クラウド」って何なの? 開発に役立つの? という人にこそ見てほしい無料クラウド環境紹介記事です 「Java Solution」フォーラム 2008/9/18 |
| Google App Engineは20%プロジェクトから生まれた Google Developer Day 2008特集(2) プロダクトマネージャーに聞く、App Engineの成り立ちと現状、ビジネス、Amazon EC2との違い、そして日本人への期待 「リッチクライアント & 帳票」フ ォーラム 2008/6/24 |
||
| Google App Engineで作るライフログ これ、俺ならこう使う(4) 気になる旬の技術の使い方を紹介する人気コラム。グーグルのWebアプリ・ホスティング「Google App Engine」で次世代ツール「logme」を作りました 「リッチクライアント & 帳票」フォーラム 2008/10/15 |
||
| Google App EngineはAjaxへのハードルを下げるか? Ajax うきうき Watch(32) Ajaxに挑戦するなら、自由にプログラミングできるサーバ環境が必須。Google App Engineは、そんなハードルを取り払ってくれるはずです…… 「リッチクライアント & 帳票」フ ォーラム 2008/4/24 |
||
| Index | ||||||||||
|
||||||||||
Google App Engineで手軽に試すJavaクラウド バックナンバー 連載インデックスへ»
- 第1回 EclipseでJava版App Engineを始めるための基礎知識
- 第2回 BigtableデータをApp EngineのJSPで日本語表示
- 第3回 App EngineをjQueryでAjax化しBigtableをCRUD操作
- 最終回 コレクションフィールドとDWRで、GAEjを業務用に進化
| Java Solution全記事一覧 |
TechTargetジャパン
- Scalaのパッケージ、アクセス修飾子、オブジェクト継承 (2012/5/22)
インポート、パッケージオブジェクト、抽象クラス/抽象メソッド、オーバーライド、final、シールドクラスなども - 基幹系システムでCloud SQLは使えるか試してみた (2012/5/17)
サンプルとしてMRPシステムを作成して動かし、「再帰呼び出し」などのパフォーマンスを測定して検証してみます - アジャイル管理ツール9選+Pivotal Tracker入門 (2012/5/14)
群雄割拠のアジャイルプロジェクト管理ツールを9つ紹介し、特に注目を集めているPivotal Trackerの基本的な使い方を解説します - サーバサイドJSやJavaでWebアプリが作れるXPages (2012/5/11)
Notes/Dominoの資産をサーバサイドJavaScriptやJavaで操作し、HTMLやJavaScript、CSSをUIにできる技術を紹介
|
|
キャリアアップ
スポンサーからのお知らせ
- - PR -
イベントカレンダー
- - PR -
