2009年5月28日木曜日

appengine-web.xmlのversionの使い方

本日始めて、Google App Engineを公開できるようになったのだけど、
最初「appengine-web.xml」のversionの記述ってUploadするために
ふやさないとだめなんだと思っていたのだけど、そうではないのですね。

こちらを帰ると、まったく別のところにUploadされ、2つのバージョンを
混在することが出来るための機能のようです。

このバージョンの切り替えは、管理画面より、Versionsというメニューから
切り替えが出来るようです。

やっぱり、よく出来てるなと感心する。

Google App Engineでデータの絞込み

本日は、下記を読みながらGoogle App EngineでIndexが作成される仕組みと
検索条件のつけ方(SQLで言うWhere節の指定の仕方について)読んで見た。

そんでもって、実際に使ってみた。

//最初は、検索対象をクラスで指定する。
Query query = pm.newQuery(Employee.class);
//ここで検索条件の指定。lastNameParamはSQLで言う
//バインドパラメータのようなもの。
query.setFilter("lastName == lastNameParam");
// order by の指定
query.setOrdering("hireDate desc");
//ここで、バインドパラメータの型を宣言する。
query.declareParameters("String lastNameParam");
//実際の検索処理。
List results = (List) query.execute("Smith");

こんな感じです。
インデックスがいつできるかと言うと、このWhere条件やソート条件を
指定したときにどうやら勝手に作成に走るようだ。

これらが、ソースコード上かかれると、裏側で
「datastore-indexes.xml」というファイルが作成され
それでインデックスが作成されるという流れのようです。

ちなみに本日より、ついにGoogleAppEngineForJavaも一般公開されたということで
私もいよいよUploadできるようになりました。

サンプルアプリケーションのゲストブックに今まで試す意味をこめて
データのUpdateをするボタンと自分が書き込みしたものすべてを削除するボタン
をつけてみたものです。

http://takes90.appspot.com/

2009年5月27日水曜日

Google App Engineでデータの更新・削除

本日は、Google App Engineでデータベースの更新・削除をしてみた。
簡単に出来るんですね。

http://code.google.com/intl/ja/appengine/docs/java/datastore/creatinggettinganddeletingdata.html#Keys

まずは、datastoreからデータを取得する。

PersistenceManager pm = PMF.get().getPersistenceManager();
Employee e = pm.getObjectById(Employee.class, user.getEmail());

そして、更新は、普通にオブジェクトを更新。

e.setTitle(newTitle);

そして、下記のメソッドを読んだ瞬間にデータが削除されるようです。

pm.close();

削除は、こんな感じ。

pm.deletePersistent(e);

一通りのデータ操作は、こんな感じだろうか。

2009年5月26日火曜日

GWTでGoogleMapAPIを使ってみる。

下記のページ当たりを参考に、GoogleWebToolkitでGoogleMapを使ってみる。


Google API Libraries for GWT> Maps> GettingStarted

とりあえず、下記の手順でサンプルプログラムが起動できるようになる。



project download pageにてgwt-maps-1.0.4.zipをダウンロードして解凍する。

その中にある「gwt-maps.jar」をクラスパスに追加

XXXXXX.gwt.xmlファイルに下記の2つの行を追加。


============================================
<script src="http://maps.google.com/maps?gwt=1&amp;file=api&amp;v=2" />
<inherits name="com.google.gwt.maps.GoogleMaps">
============================================



#とりあえず、localhostで実行している限りは、GooglmapAPIのkeyは不要のようです。
#公開するときには、おそらくKeyが必要になる。

APIのKEYに関しては、こちらを参照。
http://code.google.com/intl/ja/apis/maps/

とりあえず、これだけ準備して、あとは、下記ページの
http://code.google.com/docreader/#p=gwt-google-apis&s=gwt-google-apis&t=MapsGettingStarted
Add a map object to .java source

のソースをコピーしてあげると、上記リンク先のようなサンプルが実行されるようです。

とりあえず、あとはいろいろなAPIを調べてあげればいろいろ出来るんだろうか。

Google App Engineで保存に使える型

Google App Engineにてデータを保存する場合には、
datastoreという所に入れることになるのだけども、それの
制約などの仕様が書かれているドキュメントのメモ。

http://code.google.com/intl/ja/appengine/docs/java/datastore/dataclasses.html#Core_Value_Types

インデックスのある文字列は、500文字までなどの制約はあるが、
まぁ、普通に使用する分においては、なんら困らない仕様制限である

また、サポートしているCollectionクラスは、下記のリンク先の通りだそうです。
http://code.google.com/intl/ja/appengine/docs/java/datastore/dataclasses.html#Collections

これだけ利用できれば、何不自由なく出来そうである。

2009年5月23日土曜日

Google App EngineでJDOを使う

Google App EngineでJDOを使ってみる。
http://code.google.com/intl/ja/appengine/docs/java/gettingstarted/usingdatastore.html

GoogleAppEngineにおいて、データを保存するための方法の一つなんだと思う。
これも、JDOについて知らなくてもきちんと読めるようにドキュメントは配慮されている。

自分もまったく知らないで読んでみたんだけども、とりあえず、下記のような
ことがわかった。
・とりあえず、クラスを作り、それを保存する仕組み
  (ソースコード上に@Persistentなんかを書くことにより、あとは、このフレームワークが
   勝手にやってくれている)

というような感じで理解できた。

ここでは、大まかには、下記の手順で作成していくことになる。
1.jdoconfig.xml の設定(eclipseで作った場合には、勝手に設定してくれている)
2.保存するデータのGreetingクラスを作成。
3.PMFクラスの作成(javax.jdo.PersistenceManagerFactoryを呼び出すsingletonラッパー)
4.でこれらを利用して、ゲストブックで入力された内容を保存するクラス
   SignGuestbookServlet.javaを作成。

実際の保存するロジックはこんな感じのようです。

Greeting greeting = new Greeting(user, content, date);
PersistenceManager pm = PMF.get().getPersistenceManager();
try {
pm.makePersistent(greeting);
} finally {
pm.close();
}


で読み出すに相当する部分が下記あたり


//クエリの部分
PersistenceManager pm = PMF.get().getPersistenceManager();
String query = "select from " + Greeting.class.getName();
List greetings = (List) pm.newQuery(query).execute();

//データを取り出しの部分
for (Greeting g : greetings) {
       g.getAuthor().getNickname()
       g.getContent()


あとは、このQueryがどんな感じのことができるのかというのをいろいろ試してみたい。
まずは、次は、ここら辺を呼んでいくことにしたいと思う。
Queries and Indexes.

とりあえず、ここら辺までで、簡単なデータの保存と取出しまでは出来るようになった。

Google App EngineでJSPを使う

本日は、GoogleAppEngineにてJSPを使うという下記のページを
やってみる。

http://code.google.com/intl/ja/appengine/docs/java/gettingstarted/usingjsps.html

このページで図ることは、下記のようなもの
・JSPファイルとは何か
・JSPファイルでWebページの作り方
・Google App Engineでのログの出力の仕方
      logging.properties でログレベルなどの設定。

リンク先のように

war直下にguestbook.jsp というファイルを作って、
war/WEB-INF/web.xml にwelcome pageを設定してあげるという流れで完成。

ここまでで、前回は、javaソースで書いていたものをJSPに書き換えるという
部分が完成する。
今までは、JSPなんて書いたこともなかったので動作の仕組みを知らなかったのだけど、
裏側でJavaソースに書き換えコンパイルするというのが発生するのですね。
だから前回はjavacがないと怒られたのか。
(実際は、具estbook_jsp.javaというようなファイルができていてそれが
コンパイルされたものがありました。)

JSPを使うのが初めてという場合でも、きちんと説明が書かれているあたりは、
配慮があっていいです。

Googleのテクノロジに触れるというのはいろいろいい刺激にはなる。

そして、後半では、ゲストブックを作成するために、テキスト欄と送信ボタンを
jspファイルに埋め込んで、この送信ボタンのリクエストを処理する部分を
ログの表示のみ作ってこのページは、完了。

次のページでは、いよいよデータの保存の方法ですね。

2009年5月21日木曜日

Google App EngineでUsers Serviceを使ってみる。

次に、こちらを見ながらユーザサービスを使ってみる。

http://code.google.com/intl/ja/appengine/docs/java/gettingstarted/usingusers.html

これを利用することにより、Googleのアカウントでの認証などのロジックを書くことなく、
ユーザごとの管理ができるようになるみたい。

これも、下記のコードだけで
「ようこそ。XXXXさん」

ということが表示できるのですごいですね。

ちなみに下記のサンプル(上記のリンクのサンプルそのまま)はログインしていない場合には、
ログイン画面に飛ぶというようなロジックになっています。


UserService userService = UserServiceFactory.getUserService();
User user = userService.getCurrentUser();
if (user != null) {
resp.setContentType("text/plain");
resp.getWriter().println("Hello, " + user.getNickname());
} else {
resp.sendRedirect(userService.createLoginURL(req.getRequestURI()));
}

Google App Engine Java でプロジェクトの作成

Eclipseを使ってGoogle App Engine Java でプロジェクトの作成をしてみる。

http://code.google.com/intl/ja/appengine/docs/java/gettingstarted/creating.html

上記のページを見ていけば、Hello,worldという文字を返すサーブレットができる。

ポイントはこんな感じだろうか。

web.xml は普通の記述と同じ。
appengine-web.xml はGoogle App Engine のアプリケーションUploadするときに利用するようです。

これらのファイルは、プロジェクトを作成すると自動的に生成されています。

あとは、eclipseからWebApplicationを選択し、

http://localhost:8080/guestbook

をブラウザで起動すると、出来上がり。

よくできてますね。あまりの手軽さに感心します。

2009年5月19日火曜日

GAEのデモアプリguestbookを動かしてみる。

下記のページを参考に Google App Engineのデモプログラム
である「GuestBook」を動かしてみる。
http://code.google.com/intl/ja/appengine/docs/java/gettingstarted/installing.html

指示通りに下記のコマンドを売ってみると

D:\eclipse\plugins\com.google.appengine.eclipse.sdkbundle_1.2.0.v200904062334>D:\eclipse\plugins\com.google.appengine.eclipse.sdkbundle_1.2.0.v200904062334\appengine-java-sdk-1.2.0\bin\dev_appserver.cmd appengine-java-sdk-1.2.0\demos\guestbook\war


下記のようなエラーになってしまった。


HTTP ERROR: 500Error running javac.exe compiler
RequestURI=/
Caused by:Error running javac.exe compiler
at org.apache.tools.ant.taskdefs.compilers.DefaultCompilerAdapter.executeExternalCompile(DefaultCompilerAdapter.java:473)
at org.apache.tools.ant.taskdefs.compilers.JavacExternal.execute(JavacExternal.java:47)
at org.apache.tools.ant.taskdefs.Javac.compile(Javac.java:931)
at org.apache.tools.ant.taskdefs.Javac.execute(Javac.java:757)
at org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:382)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:472)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:451)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:439)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:511)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:295)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
at com.google.appengine.tools.development.PrivilegedJspServlet.access$101(PrivilegedJspServlet.java:23)
at com.google.appengine.tools.development.PrivilegedJspServlet$2.run(PrivilegedJspServlet.java:59)
at java.security.AccessController.doPrivileged(Native Method)
at com.google.appengine.tools.development.PrivilegedJspServlet.service(PrivilegedJspServlet.java:57)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:54)
at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:268)
at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:126)
at com.google.appengine.tools.development.LocalResourceFileServlet.serveWelcomeFileAsForward(LocalResourceFileServlet.java:324)
at com.google.appengine.tools.development.LocalResourceFileServlet.maybeServeWelcomeFile(LocalResourceFileServlet.java:260)
at com.google.appengine.tools.development.LocalResourceFileServlet.doGet(LocalResourceFileServlet.java:118)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:693)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:54)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:306)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
at org.mortbay.jetty.Server.handle(Server.java:313)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:830)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:514)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:396)
at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442)
Caused by: java.io.IOException: Cannot run program "javac.exe": CreateProcess error=2, Žw’?‚?ƒtƒ@ƒ
at java.lang.ProcessBuilder.start(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.tools.ant.taskdefs.Execute$Java13CommandLauncher.exec(Execute.java:834)
at org.apache.tools.ant.taskdefs.Execute.launch(Execute.java:435)
at org.apache.tools.ant.taskdefs.Execute.execute(Execute.java:449)
at org.apache.tools.ant.taskdefs.compilers.DefaultCompilerAdapter.executeExternalCompile(DefaultCompilerAdapter.java:470)
... 51 more
Caused by: java.io.IOException: CreateProcess error=2, Žw’?‚?ƒtƒ@ƒ
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.(Unknown Source)
at java.lang.ProcessImpl.start(Unknown Source)
... 61 more
--- Nested Exception ---
java.io.IOException: Cannot run program "javac.exe": CreateProcess error=2, Žw’?‚?ƒtƒ@ƒ
at java.lang.ProcessBuilder.start(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.tools.ant.taskdefs.Execute$Java13CommandLauncher.exec(Execute.java:834)
at org.apache.tools.ant.taskdefs.Execute.launch(Execute.java:435)
at org.apache.tools.ant.taskdefs.Execute.execute(Execute.java:449)
at org.apache.tools.ant.taskdefs.compilers.DefaultCompilerAdapter.executeExternalCompile(DefaultCompilerAdapter.java:470)
at org.apache.tools.ant.taskdefs.compilers.JavacExternal.execute(JavacExternal.java:47)
at org.apache.tools.ant.taskdefs.Javac.compile(Javac.java:931)
at org.apache.tools.ant.taskdefs.Javac.execute(Javac.java:757)
at org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:382)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:472)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:451)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:439)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:511)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:295)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
at com.google.appengine.tools.development.PrivilegedJspServlet.access$101(PrivilegedJspServlet.java:23)
at com.google.appengine.tools.development.PrivilegedJspServlet$2.run(PrivilegedJspServlet.java:59)
at java.security.AccessController.doPrivileged(Native Method)
at com.google.appengine.tools.development.PrivilegedJspServlet.service(PrivilegedJspServlet.java:57)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:54)
at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:268)
at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:126)
at com.google.appengine.tools.development.LocalResourceFileServlet.serveWelcomeFileAsForward(LocalResourceFileServlet.java:324)
at com.google.appengine.tools.development.LocalResourceFileServlet.maybeServeWelcomeFile(LocalResourceFileServlet.java:260)
at com.google.appengine.tools.development.LocalResourceFileServlet.doGet(LocalResourceFileServlet.java:118)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:693)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:54)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:306)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
at org.mortbay.jetty.Server.handle(Server.java:313)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:830)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:514)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:396)
at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442)
Caused by: java.io.IOException: CreateProcess error=2, Žw’?‚?ƒtƒ@ƒ
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.(Unknown Source)
at java.lang.ProcessImpl.start(Unknown Source)
... 61 more
Caused by:java.io.IOException: Cannot run program "javac.exe": CreateProcess error=2, Žw’?‚?ƒtƒ@ƒ
at java.lang.ProcessBuilder.start(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.tools.ant.taskdefs.Execute$Java13CommandLauncher.exec(Execute.java:834)
at org.apache.tools.ant.taskdefs.Execute.launch(Execute.java:435)
at org.apache.tools.ant.taskdefs.Execute.execute(Execute.java:449)
at org.apache.tools.ant.taskdefs.compilers.DefaultCompilerAdapter.executeExternalCompile(DefaultCompilerAdapter.java:470)
at org.apache.tools.ant.taskdefs.compilers.JavacExternal.execute(JavacExternal.java:47)
at org.apache.tools.ant.taskdefs.Javac.compile(Javac.java:931)
at org.apache.tools.ant.taskdefs.Javac.execute(Javac.java:757)
at org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:382)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:472)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:451)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:439)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:511)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:295)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
at com.google.appengine.tools.development.PrivilegedJspServlet.access$101(PrivilegedJspServlet.java:23)
at com.google.appengine.tools.development.PrivilegedJspServlet$2.run(PrivilegedJspServlet.java:59)
at java.security.AccessController.doPrivileged(Native Method)
at com.google.appengine.tools.development.PrivilegedJspServlet.service(PrivilegedJspServlet.java:57)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:54)
at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:268)
at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:126)
at com.google.appengine.tools.development.LocalResourceFileServlet.serveWelcomeFileAsForward(LocalResourceFileServlet.java:324)
at com.google.appengine.tools.development.LocalResourceFileServlet.maybeServeWelcomeFile(LocalResourceFileServlet.java:260)
at com.google.appengine.tools.development.LocalResourceFileServlet.doGet(LocalResourceFileServlet.java:118)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:693)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:54)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:306)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
at org.mortbay.jetty.Server.handle(Server.java:313)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:830)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:514)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:396)
at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442)
Caused by: java.io.IOException: CreateProcess error=2, Žw’?‚?ƒtƒ@ƒ
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.(Unknown Source)
at java.lang.ProcessImpl.start(Unknown Source)
... 61 more
Caused by:java.io.IOException: CreateProcess error=2, Žw’?‚?ƒtƒ@ƒ
at java.lang.ProcessImpl.create(Native Method)
at java.lang.ProcessImpl.(Unknown Source)
at java.lang.ProcessImpl.start(Unknown Source)
at java.lang.ProcessBuilder.start(Unknown Source)
at java.lang.Runtime.exec(Unknown Source)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
at java.lang.reflect.Method.invoke(Unknown Source)
at org.apache.tools.ant.taskdefs.Execute$Java13CommandLauncher.exec(Execute.java:834)
at org.apache.tools.ant.taskdefs.Execute.launch(Execute.java:435)
at org.apache.tools.ant.taskdefs.Execute.execute(Execute.java:449)
at org.apache.tools.ant.taskdefs.compilers.DefaultCompilerAdapter.executeExternalCompile(DefaultCompilerAdapter.java:470)
at org.apache.tools.ant.taskdefs.compilers.JavacExternal.execute(JavacExternal.java:47)
at org.apache.tools.ant.taskdefs.Javac.compile(Javac.java:931)
at org.apache.tools.ant.taskdefs.Javac.execute(Javac.java:757)
at org.apache.jasper.compiler.Compiler.generateClass(Compiler.java:382)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:472)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:451)
at org.apache.jasper.compiler.Compiler.compile(Compiler.java:439)
at org.apache.jasper.JspCompilationContext.compile(JspCompilationContext.java:511)
at org.apache.jasper.servlet.JspServletWrapper.service(JspServletWrapper.java:295)
at org.apache.jasper.servlet.JspServlet.serviceJspFile(JspServlet.java:292)
at org.apache.jasper.servlet.JspServlet.service(JspServlet.java:236)
at com.google.appengine.tools.development.PrivilegedJspServlet.access$101(PrivilegedJspServlet.java:23)
at com.google.appengine.tools.development.PrivilegedJspServlet$2.run(PrivilegedJspServlet.java:59)
at java.security.AccessController.doPrivileged(Native Method)
at com.google.appengine.tools.development.PrivilegedJspServlet.service(PrivilegedJspServlet.java:57)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:362)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:54)
at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:268)
at org.mortbay.jetty.servlet.Dispatcher.forward(Dispatcher.java:126)
at com.google.appengine.tools.development.LocalResourceFileServlet.serveWelcomeFileAsForward(LocalResourceFileServlet.java:324)
at com.google.appengine.tools.development.LocalResourceFileServlet.maybeServeWelcomeFile(LocalResourceFileServlet.java:260)
at com.google.appengine.tools.development.LocalResourceFileServlet.doGet(LocalResourceFileServlet.java:118)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:693)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:806)
at org.mortbay.jetty.servlet.ServletHolder.handle(ServletHolder.java:487)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1093)
at com.google.apphosting.utils.servlet.TransactionCleanupFilter.doFilter(TransactionCleanupFilter.java:43)
at org.mortbay.jetty.servlet.ServletHandler$CachedChain.doFilter(ServletHandler.java:1084)
at org.mortbay.jetty.servlet.ServletHandler.handle(ServletHandler.java:360)
at org.mortbay.jetty.security.SecurityHandler.handle(SecurityHandler.java:216)
at org.mortbay.jetty.servlet.SessionHandler.handle(SessionHandler.java:181)
at org.mortbay.jetty.handler.ContextHandler.handle(ContextHandler.java:712)
at org.mortbay.jetty.webapp.WebAppContext.handle(WebAppContext.java:405)
at com.google.apphosting.utils.jetty.DevAppEngineWebAppContext.handle(DevAppEngineWebAppContext.java:54)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
at com.google.appengine.tools.development.JettyContainerService$ApiProxyHandler.handle(JettyContainerService.java:306)
at org.mortbay.jetty.handler.HandlerWrapper.handle(HandlerWrapper.java:139)
at org.mortbay.jetty.Server.handle(Server.java:313)
at org.mortbay.jetty.HttpConnection.handleRequest(HttpConnection.java:506)
at org.mortbay.jetty.HttpConnection$RequestHandler.headerComplete(HttpConnection.java:830)
at org.mortbay.jetty.HttpParser.parseNext(HttpParser.java:514)
at org.mortbay.jetty.HttpParser.parseAvailable(HttpParser.java:211)
at org.mortbay.jetty.HttpConnection.handle(HttpConnection.java:381)
at org.mortbay.io.nio.SelectChannelEndPoint.run(SelectChannelEndPoint.java:396)
at org.mortbay.thread.BoundedThreadPool$PoolThread.run(BoundedThreadPool.java:442)
Powered by Jetty://


エラーメッセージよりjavacがみつからなかったっぽいので、javacへのパスが張られているか
確認してみると張られていなかった。ので、改めて環境変数PATHをセット後、再実行するとうまく
実行できた。

結構りっぱなアプリケーションができそうな感じですね。

実行してみた結果は、こんな感じでした。

GWT RPCを試してみる

本日は、下記のページを参考にしながら、GWT RPCを試してみる。
http://code.google.com/intl/ja/webtoolkit/tutorials/1.6/RPC.html

こちらで、GWT(クライアント側)から簡単にサーバ側のモジュールを
呼び出すことができる。
また、エラー発生時の処理についても詳しく書かれている。

詳細は、上記のページの通りだけど大まかには、下記のような感じで
作成する。

1.StockPriceService interfaceというインターフェースを作成
2.StockPriceServiceImpl classの作成
3.StockPriceServiceAsyncクラスの作成
  (呼び出しの正常終了、異常終了時に呼び出されるイベント)

実際に呼び出すときはこんな感じのコードになる。


//RPC呼び出し用のクラスの作成。
if (stockPriceSvc == null) {
stockPriceSvc = GWT.create(StockPriceService.class);
}

// 非同期呼び出しのためにCallBack用オブジェクトが必要
AsyncCallback callback = new AsyncCallback() {
public void onFailure(Throwable caught) {
// 異常時の処理はここに記述する。
}

public void onSuccess(StockPrice[] result) {
//正常終了時はこれが呼ばれる
     updateTable(result);
}
};

// サーバ側の関数の呼び出し。
stockPriceSvc.getPrices(stocks.toArray(new String[0]), callback);



非常にシンプルで簡単で、きれいな仕組みですね。

異常時のサンプルコードもリンク先にあるので、興味があれば、
リンク先のサイトを読むといいと思います。