処理結果オブジェクトを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>
処理結果の文字表現を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);
}
処理結果の文字表現をアラートに表示する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);
}
テキストを出力するレスポンダです。
文字セットはUTF-8となります。
JavaScript側では処理結果を文字列として受け取ります。
処理結果として扱えるJavaオブジェクトの型は
String、File、URL、InputStream、Readerを受け付けますが、
これ以外のオブジェクトについてはObject#toString()が返す文字列を出力します。
HTMLテキストを出力するレスポンダです。
TextResponder
と同様ですが、レスポンスのcontent-typeを"text/html"にセットします。
バイナリデータを出力します。
処理結果オブジェクトの型として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>
JPEGイメージを出力します。
ByteStreamResponder
と同様ですが、レスポンスのcontent-typeを"image/jpeg"にセットします。
GIFイメージを出力します。
ByteStreamResponder
と同様ですが、レスポンスのcontent-typeを"image/gif"にセットします。
Excelファイルを出力するレスポンダです。
処理結果オブジェクトの型としてInputStream、URL、Fileのほかに
Jakarta POIのHSSFWorkbookも受け付けます。
処理結果を初期データとして画面遷移を行うレスポンダです。
ページの移動は通常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の引数のオブジェクトには以下のエラー情報が格納されます。
- REQUEST_URL 呼び出したアクションのURL
- REFERER アクションを呼び出した画面のURL
- ERROR スローされた例外の以下の情報
- message エラーメッセージ
- className スローされた例外のクラス名
- その他スローされた例外の getXXX で取得できる情報
- アクションに渡したパラメータ
onActionError関数を定義しない場合はアラートにメッセージを表示します。
HTMLは文字エンコーディングがUTF-8であること、
XHTMLに準拠していることが必須となります。
外部ファイルの取込等の詳細は
JavaScriptリファレンス
を参照してください。
jaxson.jsはイベントが発生した場合に呼ばれる定義済みの関数を用意しています。
必要に応じて実装してください。
-
init()
ドキュメントのロードが終了した時に実行されます。
ロードが完了していますので、すべてのDOM要素を参照することができます。
このメソッドで初期設定を行います。
-
destroy()
他のページに遷移するなどによりページがアンロードされようとする時に実行されます。
必要な情報を保存したりユーザへの警告を出すといった処理を行います。
-
onActionError()
アクションが例外をスローした場合に実行されます。
デフォルトではアラートにメッセージを表示するようになっていますが、
この関数を定義することによりエラー時の動作をカスタマイズします。
-
errorHandler()
Ajaxリクエストで障害が発生した場合に実行されます。
エラーページに遷移する等を実装します。
アクションはアンカーやイメージソースで直接URLを指定して直接呼び出す他に、
jaxson.jsには以下のアクションをAjaxリクエストとして呼び出す関数を用意してあります。
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の関数
pushObject、
pushForm、
popObject、
popPageData
はこれらのアクションを呼び出します。
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>
アクションの処理結果は遷移先ページの初期データに設定しますので遷移先ページに読込まれます。