maskat

maskatっていうAjaxフレームワークを最近見つけて
いじくりまわしている。(といっても2日くらいだけど)
http://maskat.sourceforge.jp/

画面作成はめちゃ簡単にできる。
IDEもweb版eclipse版があり使い勝手もまあまあ(web版しか使ったことないけど。)

でだ、このmaskat。サーバ処理にはJavaPHPRubyが使える。

もちろん(?)Javaを使うことにした。
・・・めちゃくちゃ面倒やんけ!
受信電文のパースと送信電文の組み立てはほとんど自動化されておらず、
なんか知らんがパッケージが分れまくってて見にくいことこの上ない。特にeclipseで見ると。

ということで、ざっくりとフレームワークを作ってみた。
Struts風を目指したのだが、まだ微妙。
機会があればこれからバージョンアップしていこうと思う。

まずは↓をダウンロードしてほしい。
http://pluswing.net/download/maskat-J2EE-support.20070112.zip

maskatのチュートリアルで足し算の画面を作っているのだが、
それを私が作ったフレームワーク(・・・と呼んでいいものか。)で置き換えてみた。

このフレームワークを使う上での規約(注意点)をざっと説明する。

まず、イベントxmlだ。
contents/add/add_e.xml
を見てほしい。


<eventDef>
<header name="maskat_layoutID" value="sample.demo" />
<component id="local_equal">
<event id="onclick" type="local" finish="add" />
</component>
<component id="remote_equal">
<event id="onclick" remoteUrl="../../MaskatActionServlet">
<param rootNode="addParam">
<source obj="remote_arg1" node="arg1"/>
<source obj="remote_arg2" node="arg2"/>
</param>
<result rootNode="maskat">
<target out="remote_ans" in="result"/>
</result>
</event>
</component>
</eventDef>

めんどいので全文載せたが、
重要なのは4箇所だ。
?<header name="maskat_layoutID" value="sample.demo" />
 valueの値が処理クラスのパッケージ名となる。
?<component id="remote_equal">
 idの値が処理クラス名となる。
?<event id="onclick" remoteUrl="../../MaskatActionServlet">
 idの値が呼び出されるメソッド名となる。
 remoteUrlはStrutsと似ていてこれ一つだけ。
 web.xmlに定義が必要だ。(後述)
?<result rootNode="maskat">
 rootNameはmaskat固定としてある。

つまり、この例ではsample.demo.remote_equal#onclick
にサーバ処理を書くことになる。
画面で変更すべき箇所はイベント定義のみだ。htmlとレイアウトに変更はない。

では、web.xml。これはダウンロードしたファイルを見てほしい。
org.maskat.core.MaskatActionServlet
が唯一のServletクラスになるので、こいつを定義すればよろしい。

では、唯一のServletクラスだ。
これはコードが(というかそれだけだけど。)同梱されているので詳細はそっちを見てほしい。

では、sample.demo.remote_equalクラスを見てみよう。

public void onclick(Map params, MaskatResponseBuilder builder) {
int arg1 = Integer.parseInt((String) params.get("arg1"));
int arg2 = Integer.parseInt((String) params.get("arg2"));
builder.addNode("result", "" + (arg1 + arg2));
}

これが処理メソッドになる。
まず引数の説明だ。
引数は見ての通り2つ。
MapとMaskatResponseBuilderだ。
Mapには、イベントXMLで定義してあるパラメータが入る。

<param rootNode="addParam">
<source obj="remote_arg1" node="arg1"/>
<source obj="remote_arg2" node="arg2"/>
</param>

この場合、
"arg1"=remote_arg1に入力された値
"arg2"=remote_arg2に入力された値
とnodeの値がキーとなった形で格納されている。
作り終えてわかったのだが、
<rows><row><col>なんとか</col></row></rows>
という電文もあるようで、これにはさっぱり対応していない。

2番目の引数はMaskatResponseBuilderだ。
これもフレームワークのクラスで、レスポンス構築をサポートする。
builder.addNode("result", "500");
とすることで、
<?xml version=¥"1.0¥" encoding=¥"UTF-8¥"?><maskat><result>500</result></maskat>
という電文を作成できる。
ほかにも
newRowメソッドとaddColメソッドがあり、
<rows><row><col>なんとか</col></row></rows>
のような電文作成も可能となっている。

これを拡張してゆけば、サーバ処理も簡単に書けるようになりそうだ。

SeasarRailsでお盛んな
「設定よりも規約」CoC:(Convention over Configuration)
をもっと取り入れるとウマーなことになりそうなのだが・・・