2008年9月4日木曜日

GWTとSpringの連携

GWTでサーバサイドロジックを呼び出すためには、用意されているRPC(Remote Procedure Call)の仕組みを利用する。

一方、近年のJavaによるWebアプリケーション開発では、ビジネスロジックのインスタンス管理は、何らかのDIコンテナに任せてしまうのが常套手段だ。個人的には長いことSpringを使っていることもあり、GWTのRPCをSpringのbeanに置き換えできないかを試してみることにした。
使用したのは下記のライブラリ。

GWT Server Library (GWT-SL)
http://gwt-widget.sourceforge.net/

GWTのRPCは特定のurlにマッピングされたServletとして動作するが、GWT-SLではurlとSpringのbeanをマッピングするモジュールを用意されており、それとSpringMVCのDispatcherServletと組み合わせてSpringのbeanを呼び出せるようになっている。
GWT-SLでRPCとして公開可能なbeanには、下記の3種類の戦略が用意されている。

  • 完全なるPOJO
  • GWT RPCのServiceインタフェースを実装したクラス
  • GWT RPCのServiceインタフェースを実装し、GWTSpringControllerを継承したクラス

POJOは公開されるRPCのインタフェースに関連がないクラスになるため、メソッドが増えると管理が難しそう。3番目の方法は古いバージョンのGWT-SLにおける手法(ただしパフォーマンスはよいとのこと)らしいので、2番目の方法を前提とした構築手順を下記に示す。

1. GWT-SLをダウンロードし、WEB-INF/lib配下に置く。
2. GWT-SLのServletを定義する。
下記の記述をweb.xmlに追記する。

<servlet>
<servlet-name>spring</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<servlet-mapping>
<servlet-name>spring</servlet-name>
<url-pattern>*.rpc</url-pattern>
</servlet-mapping>

※servlet-nameやurl-patternは特に限定されておらず、任意の値で設定できる。

3. Springの定義ファイルにマッピング情報を記述する。
Springの定義ファイルは、web.xmlで記述したServlet名によって変わり、WEB-INF/[サーブレット名]-servlet.xmlとなる。

<bean id="urlMapping" class="org.gwtwidgets.server.spring.GWTHandler">
<property name="mapping">
<map>
<entry key="/test.rpc" value-ref="testServiceImpl" />
</map>
</property>
</bean>

いちいちbean名とurlの記述を書かなければならないのがめんどくさいと思ったが、よくよく考えたら何でもかんでもRPCとして公開されたら大変なのでこれは仕方のないことだ。

4. GWTモジュールから呼び出す。

TestServiceAsync service = GWT.create(TestService.class);
ServiceDefTarget target = ((ServiceDefTarget) service);
target.setServiceEntryPoint(GWT.getModuleBaseURL() + "test.rpc");
service.hoge();

これでSpringのbean呼び出しが可能である。
ただこのままでは、GWTのhostedモードでRPCの呼び出しができない。モジュールをリコンパイルしてデプロイし直すのでは恐ろしく時間がかかりすぎるため、次回はhostedモードでSpring RPCを呼び出す方法を書く。

2008年9月1日月曜日

GWTでBigDecimal

一度エントリ投稿し始めたら、あとはそこそこ続くもの。

今回はGWTでBigDecimalを使う方法。
Google先生に軽く聞いた限りでは見つからなかったのだが、よくよく調べてみると見つかった。

まず、現時点でのGWT(v1.5.2)では、BigDecimalはサポートされていない。BigDecimalをGWTで利用するためには、gwt-mathという外部ライブラリを利用する必要がある。

gwt-math
http://code.google.com/p/gwt-math/

使い方は至って簡単。公式サイトにも書いてあるが、下記の通りだ。
  • 利用するモジュールのgwt.xmlに以下のinheritエレメントを追加する。
    • <inherits name="com.googlecode.gwt.math.Math"/>
  • gwt-math-[version].jarをダウンロードし、クラスパスに追加する。
  • もしRPCのパラメータやreturnでBigDecimalを利用する場合は、さらにgwt-math-server-[version].jarもダウンロードし、クラスパスに追加する。
これだけだ。
RPCのシリアライズ通信やjsコンパイラの仕組みがよくわかっていないので、どうやって拡張を実現しているのかわからないが、他に特にややこしい設定など必要とせず、これだけで問題ないようだ。
(jsに関しては、java.math.BigDecimalをエミュレーションするJavaScriptを用意しているように見える)

2008年8月31日日曜日

GWT

Google Web Toolkit。

前から気にはなっていたが、Ext JSとの統合が進んできて見た目もかなりよくなってきているようなので、GWTとExtの統合ウィジェットである「Ext GWT」を前提にまじめに取り組んでみることにした。
GWTとExtの統合環境は、他にも「GWT-Ext」というものがあるが、どちらがよいのかは正直よくわからない。前者のExt GWTはExt JSの開発元が作成しており、Ext JSの最新版にも対応するなど、Ext JSの開発と歩調が合っている。同じ開発元と言うことで、より安定度も高い気もするし。

一通り調査が終わったところで、サンプルプログラムを組んでみて開発環境のイメージをつかんでみた。

個人的にjspやhtmlが嫌いなこともあり、ほぼhtmlレスでこれほどリッチなUIが作れるのはとても魅力的だ。実装もSwingライクで、Javaを書ける人間ならすんなり入れるはずだ。
Eclipseでの開発も、Cypal Studio for GWTプラグイン (前はGooglipseという名前だったようだ) を導入すれば実に快適。ただ、GWTシェルのオプションがうまくコントロールできないので、そのあたりは多少難ありと言ったところ。

新しい技術に触れてこれほどワクワクしたのは久々だ。すぐにでも業務に適用してもよいのではないかと思ったくらい。JavaScriptに対する不安がないわけではないが、小規模アプリケーションの開発があったら、積極的に取り組んでみたいと思う。

2008年1月24日木曜日

神曲

年末ぐらいかな。
ニコニコ動画ですばらしい動画を見た。



なんだ、チョコボの不思議なダンジョンか、などと思うことなかれ。
なんとこの作品、FFの名曲ばかり集めたとんでもないやつなのだ。
子供のころの思い出がこみ上げてくる懐かしいメロディ。
しかも、そのアレンジたるや、これまたとんでもない出来。

で、速攻でAmazonでサントラ盤頼んじゃったわけだ。



今日届いたんだけど・・・

やっぱ(・∀・)イイ!!

植松クソとかいう人もいるけど、やっぱ神曲ばっかりよねー。
このラインナップは贅沢すぎる。
というわけで、これからの通勤時間は毎日これのループになりそう(´∀`)。

2008年1月11日金曜日

蔵前 元楽

今日は仕事で蔵前に行った。
ちょうど昼前だったので、ラーメン好きの上司が探し当てた、「元楽」というラーメン屋へ。
(あとで知ったのだが、5件あるチェーン店の本店だったらしい)

とりあえず何がオススメかもわからないので、豚めしつきの塩ラーメンをチョイス。
おいらはだいたい初めてのところだと、醤油よりも塩味を頼むのだ。

背脂たっぷり、豚骨ベースでこってりのスープだったんだけど、これが非常においしかった。
しっかりしたちぢれ麺がスープによく絡んでて、これもおいしい。
豚めしってのはなんだろうと思ったら、チャーシューの細切れの入ったご飯。
店内に張ってあるおいしい食べ方にしたがって、特製のタレとごま油をかけてまぜまぜしていただく。
んーうまい。
これもうまいなぁ。

惜しむらくは、時間に追われて10分程度でさくっと食べなければならなかったこと。
今度もうちょっとゆっくり食べてみたい。
今度は醤油ラーメンかな。

2008年1月10日木曜日

クエリ結果のクラスへのマッピング

T字形ER図で基本のテーブルを設計しちゃったシステムがあって、いつも使ってるHibernateを適用しづらくなってしまった。

てことで、クラスとテーブルをマッピングするソリューションについて、代替案をいろいろ探してみたんだが、DbUtilsかSpringのJdbcDaoSupportか、といったところで詰まった。

必須機能ではないんだけど、2つ以上のテーブルをjoinした結果を、各々のテーブルオブジェクトの二次元配列として返してくれるのがない。
クラスへのマッピングを諦めてMapで扱うのもいいんだけど、Stringで扱うとリファクタリングきかないし、個人的にはやめておきたいところ。
join結果を1クラスにする方法もあるけど、これだとjoinのパターンごとにわざわざクラスを作成しなきゃいけないのでこれも面倒。

じゃーってことで、自前でマッパを作ろうと思って意気込んでみたものの、OracleのjdbcドライバじゃResultSetMetaData#getTableName(int)でテーブル名が引っ張ってこれないという事実(゚д゚lll)

うーん困ったぞ。
Hibernateのnative queryみたいに、

select {a.*}, {b.*} from table_a a, table_b b where a.fk = b.id

のようなaliasは、SQL単品ではできないものか。
SQL嫌いだからあんまり勉強してなくてわかんないやヽ(´ー`)ノ

ふぅ

2008年1月1日火曜日

はじめてみた

また懲りずにブログを再開。
どうせすぐ飽きちゃうのにね。

とりあえず、Javaとかの情報を書いてみようかと。
つっても、たいしたことは書けないので、
なんともなりそうにないのがまた微妙。

ま、やってみるべ。