本日始めて、Google App Engineを公開できるようになったのだけど、
最初「appengine-web.xml」のversionの記述ってUploadするために
ふやさないとだめなんだと思っていたのだけど、そうではないのですね。
こちらを帰ると、まったく別のところにUploadされ、2つのバージョンを
混在することが出来るための機能のようです。
このバージョンの切り替えは、管理画面より、Versionsというメニューから
切り替えが出来るようです。
やっぱり、よく出来てるなと感心する。
2009年5月28日木曜日
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/
検索条件のつけ方(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
こんな感じです。
インデックスがいつできるかと言うと、この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);
一通りのデータ操作は、こんな感じだろうか。
簡単に出来るんですね。
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&file=api&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
これだけ利用できれば、何不自由なく出来そうである。
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を作成。
実際の保存するロジックはこんな感じのようです。
で読み出すに相当する部分が下記あたり
あとは、このQueryがどんな感じのことができるのかというのをいろいろ試してみたい。
まずは、次は、ここら辺を呼んでいくことにしたいと思う。
Queries and Indexes.
とりあえず、ここら辺までで、簡単なデータの保存と取出しまでは出来るようになった。
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();
Listgreetings = (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ファイルに埋め込んで、この送信ボタンのリクエストを処理する部分を
ログの表示のみ作ってこのページは、完了。
次のページでは、いよいよデータの保存の方法ですね。
やってみる。
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さん」
ということが表示できるのですごいですね。
ちなみに下記のサンプル(上記のリンクのサンプルそのまま)はログインしていない場合には、
ログイン画面に飛ぶというようなロジックになっています。
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
をブラウザで起動すると、出来上がり。
よくできてますね。あまりの手軽さに感心します。
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
下記のようなエラーになってしまった。
エラーメッセージよりjavacがみつからなかったっぽいので、javacへのパスが張られているか
確認してみると張られていなかった。ので、改めて環境変数PATHをセット後、再実行するとうまく
実行できた。
結構りっぱなアプリケーションができそうな感じですね。
実行してみた結果は、こんな感じでした。
である「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クラスの作成
(呼び出しの正常終了、異常終了時に呼び出されるイベント)
実際に呼び出すときはこんな感じのコードになる。
非常にシンプルで簡単で、きれいな仕組みですね。
異常時のサンプルコードもリンク先にあるので、興味があれば、
リンク先のサイトを読むといいと思います。
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用オブジェクトが必要
AsyncCallbackcallback = new AsyncCallback () {
public void onFailure(Throwable caught) {
// 異常時の処理はここに記述する。
}
public void onSuccess(StockPrice[] result) {
//正常終了時はこれが呼ばれる
updateTable(result);
}
};
// サーバ側の関数の呼び出し。
stockPriceSvc.getPrices(stocks.toArray(new String[0]), callback);
非常にシンプルで簡単で、きれいな仕組みですね。
異常時のサンプルコードもリンク先にあるので、興味があれば、
リンク先のサイトを読むといいと思います。
登録:
投稿 (Atom)
-
AutoItでコンポーネントをクリックする命令を送る方法 仕様リンク: http://www.autoitscript.com/autoit3/docs/functions/ControlClick.htm AutitV3 WindowInfoのControlのAdv...
-
DBUnitを使ってみた。最初は、日本語のページを参照したのだけど、 最新のバージョンでは、なんか古くなりつつある感じだったので、 下記のページを元にやってみた。 http://www.dbunit.org/howto.html 最初のつまずきは、ClassNotFo...
-
AutoItとは、何かというと、人の入力なしにどんどんアプリケーションを 進めていくための仕組みといったところでしょうか。 といっても、かなり高度で、ほとんど開発言語と言ってもいいように思う。 今回は、AutoItで画面操作を記録する方法について書いて見ます。 AutoItのダウ...