Seasar Message Format
SMF(Seasar Message Format)とはリッチクライアントとSeasarが通信するための軽量フォーマットになります。HTTPで文字列でやり取りできるクライアントなら簡単に通信することが可能です。いまのところターゲットとしているクライアントは、AjaxとCurlになります。
やり取りするときのフォーマットは次のようになります。
基本型
- 文字列型
- ダブルコーテーション(")で囲む。
- ",\,b,n,r,t,uは\でエスケープする。
- 数値型
- 整数.小数
- 論理型
- true,false
- 日付型
- Date(year, month, day, hours, minutes, seconds, ms)
- hours以下は省略可能
- null
- null
参照型
- オブジェクト(JavaのMap)
- {プロパティ名:値, ...}
- _classNameというプロパティにクラス名を入れておくとMapでなく、指定したクラスにマッピングされる。
- 配列
- [値, ...]
- 他の参照型の参照
- Ref(参照型が登場した番号)
request
- name
- コンポーネントの名前
- method
- メソッド名
- args
- 引数の配列
response
- 値
という非常にライトなフォーマットで、JSONとFlash Remotingをあわせたようなフォーマットです。
例えば、足し算をする場合
/s2jsf-example/smf?name=addLogic&method=add&args=[1,2]
のようなリクエストを送れば、3がレスポンスで返ってくることになります。
S2JSFから使う場合はどうするのでしょうか。それにはremoteObjectタグを使います。
remoteObjectタグのid属性でつけた名前で、簡単にJavaScriptの中から呼び出せます。戻り値は、メソッド名_resultというメソッドを定義しておけば、引数を受け取れます。例外が起きた場合は、メソッド名_errorで例外オブジェクトを受け取れます。Flexそのまんまといった感じ(笑)
<span m:inject="s:remoteObject" id="addLogic"/><script type="text/javascript">
function calculate() {
var arg1 = document.getElementById('arg1').value;
var arg2 = document.getElementById('arg2').value;
addLogic.calculate(arg1, arg2);
}
function calculate_result(data) {
var result = document.getElementById('result');
result.innerHTML = data;
}
function calculate_error(exception) {
alert(exception.description);
}
</script>
これで、コンポーネントがそのまま呼び出せるようになると、セキュリティがめちゃめちゃになるので、diconファイルでSMFで呼び出せるメソッドをmetaタグで記述します。
smf-allowed-methodsは、呼び出せるメソッドを,で区切って記述していきますが、正規表現も使えます。
<component name="addLogic" ...
<meta name="smf-allowed-methods">calculate, hoge.*</meta>
</component>