JAXSON 業務アプリケーションフレームワーク
トップ

インストール

ドキュメント
チュートリアル
開発ガイド
トランザクション管理
データベース接続
データベースアクセス
バリデーション
セキュリティ
エクセルファイル出力
JavaScriptリファレンス
API doc

ダウンロード
jaxson-2.1.zip

開発ガイド

Actionクラス


レスポンダ
JsonResponder
処理結果オブジェクトをJSONとしてクライアントに返します。 クライアントは処理結果をJavaScriptのオブジェクトとして受け取ります。 処理結果はPOJO、List等のコレクション、Map、配列は問題ありませんが、 プリミティブ型、String、Date型はそのままではJSONに変換できませんので getValueというメソッドを持つホルダブジェクトに格納します。
*** Java ***
@Responder(JsonResponder.class) // デフォルトのため省略可
public class MessageSearchAction extends ServiceAction {

    public Object execute() {
        String message;
        // messageをセットする
        return message;
    }
    
}

*** JavaSctipt ***
// MessageSearchActionを呼び出して結果をidが"message"の要素内に表示する
function getMessage() {
    var param = ....
    doAction('MessageSearchAction', param, function(message) {
        // 結果オブジェクトには"value"属性に格納される
        $("message").innerHTML = message.value;
    });
}

// ライブラリ関数を使用してgetMessageと同じ処理を行う
function getMessage2() {
    var param = ....
    doAction('MessageSearchAction', param, function(message) {
        // setElementValueはオブジェクトに"value"属性がある場合は自動的に取り出す
        setElementValue($("message"), message);
    });
} 
"callback"というパラメータが渡された場合は その値をコールバック関数名として 処理結果オブジェクトを引数とした関数呼び出しのJavaSctiptを生成してクライアントに返します。 これはJSONPと呼ばれるもので、 Ajaxはドメインが異なるサーバからの呼び出しはできませんが、 JSONPの場合はクロスドメインアクセスが可能となります。
<script type="text/javascript">
    <!--
    function setMessage(message) {
        $("message").innerHTML = message.value;
    }
    //-->
</script>

<!-- MessageSearchActionの処理結果を引数としてsetMessageを実行します。 -->
<script type="text/javascript"
    src="http://hostname/action/MessageSearchAction?callback=setMessage">
</script> 

JavascriptResponder
処理結果の文字表現をJavaScriptのソースとして出力するレスポンダです。
*** Java ***
@Responder(JavascriptResponder.class)
public class MessageSearchAction extends ServiceAction {

    public Object execute() {
        String message;
        // messageをセットする
        return "alert('" + message + "')";
    }
    
}

*** JavaScript ***
// メッセージをアラートに表示する
function showMessage() {
    var param = ....
    doAction('MessageSearchAction', param);
} 

JsWarningResponder
処理結果の文字表現をアラートに表示するJavaScriptを返すレスポンダです。
*** Java ***
@Responder(JsWarningResponder.class)
public class MessageSearchAction extends ServiceAction {
    
    public Object execute() {
        String message;
        // messageをセットする
        // messageはアラートに表示する内容になります
        return message;
    }

}

*** JavaScript ***
// メッセージをアラートに表示する
function showMessage() {
    var param = ....
    doAction('MessageSearchAction', param);
} 

TextResponder
テキストを出力するレスポンダです。 文字セットはUTF-8となります。 JavaScript側では処理結果を文字列として受け取ります。
処理結果として扱えるJavaオブジェクトの型は String、File、URL、InputStream、Readerを受け付けますが、 これ以外のオブジェクトについてはObject#toString()が返す文字列を出力します。

HtmlResponder
HTMLテキストを出力するレスポンダです。
TextResponder と同様ですが、レスポンスのcontent-typeを"text/html"にセットします。

ByteStreamResponder
バイナリデータを出力します。
処理結果オブジェクトの型としてInputStream、URL、Fileを受け付けます。
*** Java ***
@Responder(ByteStreamResponder.class)
public class MusicDownloadAction extends ServiceAction {

    // クライアントから渡された"id"パラメータをセットします。
    @ContextParam
    String id;
    
    public Object execute() {
        Object result = new File(id + ".mp3");
        // ダウンロードできるようにレスポンスヘッダを設定します。
        response.setContentType("audio/mp3");
        response.setHeader("Content-disposition", "attachment;");
        return result;
    }
    
}

*** HTML ***
<a href="/application-path/action/MusicDownloadAction.mp3?id=0123">
クリックするとダウンロードを開始します。
</a>
                

JpegImageResponder
JPEGイメージを出力します。
ByteStreamResponder と同様ですが、レスポンスのcontent-typeを"image/jpeg"にセットします。

GifImageResponder
GIFイメージを出力します。
ByteStreamResponder と同様ですが、レスポンスのcontent-typeを"image/gif"にセットします。

ExcelResponder
Excelファイルを出力するレスポンダです。
処理結果オブジェクトの型としてInputStream、URL、Fileのほかに Jakarta POIのHSSFWorkbookも受け付けます。

DispatchResponder
処理結果を初期データとして画面遷移を行うレスポンダです。
ページの移動は通常JavaScript関数の forward を使用しますが、 リンク先として指定する場合やフォームをサブミットする必要がある場合に使用します。
アクションの実行結果をJSON文字列に変換し、 遷移先初期データとしてセッションに保存して遷移先に移動します。
遷移先のHTML内で相対パスを使用している場合に不具合が起きないように "アクション名.do"のパターンで呼び出すようにしてください。 遷移先は"nextPage"というパラメータでクライアントから指定するか、 Actionクラスで DispatchResponder#setNextPage(String) によりセットします。 nextPageの遷移先は絶対パスだけでなく相対パスの受け付けます。
*** Java ***
@Responder(DispatchResponder.class)
public class ForwardPageAction extends ServiceAction {
    ...
}

*** HTML ***
<a href="/application-path/ForwardPageAction.do?nextPage=NextPage.html&id=1234" >
    ページを移動します。
</a> 
アクションクラスで転送先を指定する場合はリクエスト属性に"nextPage"をセットします。
request.setAttribute("nextPage", "NextPage.html"); 


例外処理
アクションの実行で例外がスローされると、 アクションがAjaxリクエストとして呼び出された場合はクライアントの onActionError 関数が呼び出されます。
onActionErrorの引数のオブジェクトには以下のエラー情報が格納されます。 onActionError関数を定義しない場合はアラートにメッセージを表示します。


HTMLファイル
HTMLは文字エンコーディングがUTF-8であること、 XHTMLに準拠していることが必須となります。
外部ファイルの取込等の詳細は JavaScriptリファレンス を参照してください。


イベントハンドラ
jaxson.jsはイベントが発生した場合に呼ばれる定義済みの関数を用意しています。 必要に応じて実装してください。


アクションの呼出
アクションはアンカーやイメージソースで直接URLを指定して直接呼び出す他に、 jaxson.jsには以下のアクションをAjaxリクエストとして呼び出す関数を用意してあります。


Javaオブジェクトの取込
jaxson.jsの loadToDocument 関数を使用するとオブジェクトをドキュメントに読込むことができます。
*** Java ***

public class PageData {

    public String getMessage() {
        return xxx;
    }
    
    public String getName() {
        return xxx;
    }
    
    public int getCategory() {
        return xxx;
    }

    pubic List getCustomers() {
        return xxx;
    }
}

*** HTML ***

メッセージ : <span id="message"></span>
<form id="searchForm">
名前 <input type="text" id="name"/><br />
種別 <select id="category">
        <option value="1">Windows</option>
        <option value="2">Macintosh</option>
    </select>
</form>
<table id="customers">
    <thead>
        <tr>
            <td id="nameCol">名前</td>
            <td id="addressCol">住所</td>
        </tr>
    </thead>
    <tbody>
    <tbody>
</table>

*** JavaScript ***

// CreatePageDataはPageDataオブジェクトを出力するアクション
doAction("CreatePageData", param, function(pageData) {
    loadToDocument(pageData);  // アクション完了後に読込
}); 
このようにgetXXXとHTML要素のidが対応していればその要素にgetXXXの戻り値がセットされます。
アクションがMapオブジェクトを出力する場合はHTML要素のidをキーとして値をMapオブジェクトに格納します。
ひとつの要素に値を読込む場合は setElementValue 関数を使用します。 loadToDocumentはオブジェクトの属性それぞれについてこのsetElementValueを呼び出しています。 HTML要素に"valueFilter"という属性で関数がセットしてあると、 セットしようとする値を引数に渡して関数を実行してその戻り値を要素にセットします。
// 'category'というidの要素に値をセットするときに値をコード値に変換します。
$("category").valueFilter = function(value) {
    if (value == 'Windows') {
        return 1;
    } else {
        return 2;
    }
}); 


テーブルの読込
setElementValue でテーブルの値を設定する場合、関数内部から createTableRows を呼び出します。createTableRowsの詳細はJavaScriptガイドを参照してください。
テーブルにセットする値として アクションはPOJOもしくはMapオブジェクトの配列かコレクションを 結果として返すことを期待しています。
*** Java ***                

// 顧客情報検索アクション
public class CustomerSearchAction extends ServiceAction {

    /** 検索を実行します。 */
    public Object execute() {
        List<CustomerDTO> rows;
        ...
        return customerDAO.select(condition);
    }
    
}

// 顧客情報を保持するクラス
public class CustomerDTO implements Serializable {

    /** 顧客名を返します。 */
    public String getName() {
        return name;
    }
    
    /** アドレスを返します。 */
    public String getAddress() {
        return address;
    }
}

*** HTML ***

<table id="customerTable">
    <thead>
        <tr>
            <td id="name">顧客名</td>
            <td id="address">アドレス</td>
        </tr>
    </thead>
    <tbody>
    </tbody>
</table>

*** JavaScript ***

doAction("CustomerSearchAction", param, function(customerList) {
    setElementValue($("customerTable"), customerList);
}); 
上記の例のように配列もしくは集合の要素であるオブジェクトの属性名と テーブルヘッダの1行目のセルのidに対応して データがテーブル本体に読込まれます。 読込先として空のtbodyを用意しておいてください。
テーブルにrowInsertedという属性名で関数をセットしておくと 行が追加される毎にこの関数が実行されます。 またテーブルにcellInsertedという属性名で関数をセットしておくと セルが追加される毎にこの関数が実行されます。 これを使用して行・セルの設定やセットされる値の編集が可能となります。 詳細は createTableRows を参照してください。


データの保存
JavaScriptオブジェクトをサーバに保存しそれを取り出すために "PushAction"、"PopAction"というアクションを用意しています。 JavaScriptの関数 pushObjectpushFormpopObjectpopPageData はこれらのアクションを呼び出します。
JavaScriptオブジェクトはセッションにJSON文字列として保存されますので、 このデータをサーバ側で使用するにはJSONをJavaオブジェクトに変換する必要があります。 セッションが廃棄されると当然このデータは消失します。 PopActionはデータを取り出すとそれをセッションから削除します。
pushForm はmaneもしくはid属性を持つフォームの子要素の内容を保持するオブジェクトを作成してサーバに保存します。 formToObject を参照してください。
popPageData はサーバに保存されたデータを取得してそれを画面に読込みます。 つまりPopActionを呼び出して取得したオブジェクトを引数に loadToDocument を実行します。 この関数により取得したオブジェクトはdocument.initialdataにセットされます。
画面ロード時には常にそのページのパス名をキーとしてこのloadToDocumentが呼ばれます。 例えば"/application/SomePage.html"をキー名としてオブジェクトをセッションに保存しておくと 次に"/application/SomPage.html"へ遷移したときに保存されたオブジェクトが画面に読込まれることになります。


ページの移動
forward は初期データを渡して指定したページに移動します。 渡されたオブジェクトの内容は遷移先ページに読込まれ (loadToDocumentを参照)、 さらにdocument.initialdataにセットされます。
*** JavaScript ***
// SomActionを実行してその結果を初期データとしてNext.htmlに遷移する
doAction("SomeAction", param, function(data) {
    forward("NextPage.html", data);
});
doForm はフォームの内容をパラメータとしてアクションを実行し アクションの実行結果を初期データとして指定したページに遷移します。
*** HTML ***
<form>
    <input type="text" name="xxx">
    ....
    <input type="button" value="実行"
        onclick="doForm('SomeAction',this.parentNode,'NextPage.html')"/>
</form>
ファイルアップロードの場合はフォームをサブミットする必要があります。 サブミットする場合はアクションのレスポンダとして DispatchResponder を設定します。 フォームのactionには "/アプリケーションパス/アクション名.do" のパターンで指定します。
*** Java ***
@Responder(DispatchResponder.class)
public class UploadAction extends ServiceAction {
    ...
}

*** HTML ***
<form method="POST" enctype="multipart/form-data"
        action="/application-path/UploadAction.do">
    ファイル : <input type="file" name="uploadFile"/><br />
    <!-- 遷移先は "nextPage" で指定 -->
    <input type="hidden" name="nextPage" value="NextPage.html">
    <input type="submit" value="ファイルアップロード"/>
</form> 
アクションの処理結果は遷移先ページの初期データに設定しますので遷移先ページに読込まれます。