Full Ajax その後

http://d.hatena.ne.jp/shin/20080511/p2
の続き。コンポーネントをpageへ追加していくというJavaらしいコードへ変更。

定義ファイル「s2container.xml

<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE components PUBLIC "-//SEASAR//DTD S2Container 2.4//EN" 
    "http://www.seasar.org/dtd/components24.dtd">
<components>

    <component class="org.seasar.framework.container.autoregister.FileSystemComponentAutoRegister" >
        
        <initMethod name="addClassPattern">
            <arg>"fullajax.page"</arg>
            <arg>"[^$]*"</arg>
        </initMethod>
    </component>
</components>

前回との違いはインナークラスを除外するように。以前のままだとエラーが出てしまうため。アノテーションをつけていないものは自動的に除外してくれるだけでいいんだけど。インナークラスでもコンポーネントを使いたい場合もあると思うし。

htmlソース。変更なし。

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
    <head>
        <title></title>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        
        <script src='dwr/interface/FullAjax.js'></script>
        <script src='dwr/engine.js'></script>
        <script src='dwr/util.js'></script>
        <script src='prototype.js'></script>
    </head>
    
    <body onload="FullAjax.init();">
        <form id="form1" >
            <input id="text1" type="text" value="うわがきしてくれ">
            <input id="button1" type="button" value="送信">
            <div id="label1" >うわがきされたい</div>
        </form>
        <hr>
    </body>
</html>

Javaコード。アノテーションで関連付けしていたのと違ってコードでの関連付けは、やはりフレームワーク側のコードが非常にシンプルになってよいこと尽くめだった。Swingとか好きだしアノテーションによるSwingFrameworkのイベント方法は待ちがっとると思う人種だし。

package fullajax.page;

import fullajax.annotation.Init;
import fullajax.component.Button;
import fullajax.component.Label;
import fullajax.component.Page;
import fullajax.component.TextField;
import org.seasar.framework.container.annotation.tiger.Component;
import org.seasar.framework.container.annotation.tiger.InstanceType;

@Component(name="/index.html" ,instance=InstanceType.PROTOTYPE)
public class Index {

    public TextField textField = new TextField("text1");
    
    public Label label = new Label("label1");
    
    public Button button = new Button("button1");
    
    //画面開いたときの初期設定
    @Init
    public void init(Page page){
        textField.setText( "初期値" );
        page.add(textField);
        
        label.setText( "ここに表示されます" );
        page.add(label);
        
        button.addActionListener(new Runnable() {
            public void run() {
                label.setText( "はろー" + textField.getText());
            }
        });
        page.add(button);
    }
    
}

結果は前回と変わりませんのでそちらを参考に。

特徴としてはhtmlにイベントの設定やカスタムタグ類は一切なし。wicket:idのような特殊なタグもなく、DreamWeaverと相性もいいはず。これは「FullAjax.init()」でリバースAjaxで動的にイベントの追加等をしているということ。開発者はidをあわせることだけに専念することができる。


最近のフレームワーク比較によくAjax対応度というのが書かれているのだが、Ajaxのときだけ特殊なことをする時点でそれはないんじゃないかなぁ〜という思いで作ってみたのであった。つまりすべてAjaxのみで完結する。通常のWebアプリみたいなことをしないといけないのはファイルアップロードのみという逆転の発想で。