2008-06-28

Jaxer.clientData を使ってサーバサイドの状態をクライアントサイドに引き渡す

非 Ajax の一般的な WEB アプリケーションは、リンクのパスや QUERY_STRING、フォームの値を使って、サーバサイドの状態をクライアントサイドに引き渡しています。

リンクやフォームを使って状態を引き渡すという仕組みは、あたり前になり過ぎていて、その意味や必要性をよく考えなくなってしまう傾向があるのですが、Ajax アプリケーションを開発すると、その意味や必要性と対面せざるを得ません。

みなさんの Ajax アプリケーションは、どのような仕組みを使って、サーバサイドの状態をクライアントサイドに引き渡していますか。いろいろな方法がありますよね。

そのひとつとして Aptana Jaxer は、Jaxer.clientData を介して、サーバサイドのオブジェクトをクライアントサイドに引き渡すという固有の仕組みを提供しています。

次のコードがその実例です。サーバサイドで Jaxer.clientData.foo の値を指定すると、クライアントサイドでは、その値を同じ Jaxer.clientData.foo から取得できます。
<script type="text/javascript" src="jquery.js" runat="both"></script>
<script type="text/javascript" runat="server">
//<![CDATA[
jQuery(function($) {
Jaxer.clientData.foo = 'bar';
});
//]]>
</script>
<script type="text/javascript">
//<![CDATA[
jQuery(function($) {
$('#r').text(Jaxer.clientData.foo);
});
//]]>
</script>
<div id="r">foo</div>

この仕掛けは、そても単純なものでした。Jaxer がクライアントサイドのページをレンダリングするとき、次のように script 要素を使って Jaxer.clientData を生成するだけです。Jaxer.clientData の値は、サーバサイドの Jaxer.clientData を JSON stringify したものです。

<script>
Jaxer.clientData = Jaxer.Serialization
.fromJSONString('{\"foo\":\"bar\"}');
</script>

私も Ajax アプリケーションを書くとき、同じようなことをよくやってました。そのときは、サーバサイドは JavaScript じゃないので、JSON stringify する(している)という変換の意識がどっかにあるのですが、

サーバーサイドもクライアントサイドも Jaxer.clientData で操作できると知ったとき、えっ!? どんな特別な仕掛けを使っているんだろうと勘ぐってしまいました。結果としては、同じことをしているだけだったのです。Jaxer の直感的なインタフェースに惑わされました。

1 件のコメント:

aquilegia さんのコメント...

JSON文字列を介して渡しているということは関数は受け渡せないのかな。

関数内で全てが閉じているものは、関数も受け渡せると便利ですよね。スクリプトらしいです。