ひがやすを技術ブログ

電通国際情報サービスのプログラマ

Seasar Message Format

SMF(Seasar Message Format)とはリッチクライアントとSeasarが通信するための軽量フォーマットになります。HTTPで文字列でやり取りできるクライアントなら簡単に通信することが可能です。いまのところターゲットとしているクライアントは、AjaxCurlになります。
やり取りするときのフォーマットは次のようになります。

基本型

  • 文字列型
    • ダブルコーテーション(")で囲む。
    • ",\,b,n,r,t,uは\でエスケープする。
  • 数値型
    • 整数.小数
  • 論理型
    • true,false
  • 日付型
    • Date(year, month, day, hours, minutes, seconds, ms)
    • hours以下は省略可能
  • null
    • null

参照型

  • オブジェクト(JavaのMap)
    • {プロパティ名:値, ...}
    • _classNameというプロパティにクラス名を入れておくとMapでなく、指定したクラスにマッピングされる。
  • 配列
    • [値, ...]
  • 他の参照型の参照
    • Ref(参照型が登場した番号)

request

response

という非常にライトなフォーマットで、JSONFlash Remotingをあわせたようなフォーマットです。
例えば、足し算をする場合
/s2jsf-example/smf?name=addLogic&method=add&args=[1,2]
のようなリクエストを送れば、3がレスポンスで返ってくることになります。
S2JSFから使う場合はどうするのでしょうか。それにはremoteObjectタグを使います。


<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>

remoteObjectタグのid属性でつけた名前で、簡単にJavaScriptの中から呼び出せます。戻り値は、メソッド名_resultというメソッドを定義しておけば、引数を受け取れます。例外が起きた場合は、メソッド名_errorで例外オブジェクトを受け取れます。Flexそのまんまといった感じ(笑)
これで、コンポーネントがそのまま呼び出せるようになると、セキュリティがめちゃめちゃになるので、diconファイルでSMFで呼び出せるメソッドをmetaタグで記述します。

<component name="addLogic" ...
<meta name="smf-allowed-methods">calculate, hoge.*</meta>
</component>
smf-allowed-methodsは、呼び出せるメソッドを,で区切って記述していきますが、正規表現も使えます。