2011年8月6日土曜日

「ウェブ・インテント」の第一印象。「JavaScriptによるクライアントサイドのサーブレット・JSPみたいなモノか?」

昨日、Tech Crunchで「ウェブ・インテント(Web Intents)」についての記事があった。気になってはいたのだけど、すぐに理解するのは難しそうなので後回しにした。

琴線探査: 「ウェブ・インテント」はWEBアプリの将来にすごく重要な技術と思う | Google、Androidの「インテント」に似た「ウェブ・インテント」をChromeに導入 - Tech Crunch Japan

でも気になって、もう少し詳しく見てみることにした。とりあえず「Share Intent Example」というサンプルをもう少し詳しく見てみる。ソースはここで見られる。

ひと通り荒く見てみた第一印象としては「JavaScriptによるクライアントサイドでのサーブレット・JSPのようなモノか?」と思った。

まずindex.htmlから読み込む。index.htmlはregister.htmlとaction.htmlをiframeで読み込む。これらはページ右側に表示される。

register.htmlで重要なのはwebintents.debug.jsとintentタグの存在だろう。headタグに書かれている。

<script src="/lib/webintents.debug.js"></script>
<intent 
      action="http://webintents.org/share" 
      type="text/uri-list" 
      href="sharelink.html" 
      title="Kinlan's Link Share" />

これでインテントを登録するということらしい。

次にaction.html。これがサービスのクライアントらしい。headタグではwebintents.debug.js、events.jsが読み込まれattachEventListener()がいくつか定義されている。「Share Link」関連を見ていく。

「share link」ボタンをクリックするとattachEventListener()で定義した処理が呼ばれる。Intentオブジェクトをnewしてdataフィールドに「url」テキストフィールドの内容をセットし「window.navigator.startActivity(intent);」で実行。

このIntentオブジェクトの送り先はintentタグで指定してあったsharelink.htmlだ。Javaの世界で言うとこれがサーバーサイド、つまりサーブレットやJSPにあたるだろう。

headタグにはaction.htmlでも読み込まれていたwebintents.debug.js、events.js、さらにcommon.jsの読み込みが書かれている。そしてページ読み込みと同時にattachEventListener()で実際の処理内容を定義している。

その処理内容はaction.htmlから送られてきたIntentオブジェクトのdataフィールド(url)を読み込み、bodyタグ内にある<div id="output"></div>にsetText()するというもの。

この一連の流れの中でどのようにしてIntentオブジェクトがやり取りされてるのかはよく分からないけれど、確かにIntentオブジェクトにラップされてデータが送信されているようだ。

この感覚はさながら、FlashアプリからAMFオブジェクトをBlazeDS仕様のサーバーに投げて処理するのにも似ている。

ただ、サーバーサイドのプログラムが要らないというところが決定的に違う。もちろん、Apacheのような何らかのHTTPサーバーは必要だろうけれど。言うなれば、サーブレットやJSPに相当する部分をクライアントサイドのJavaScriptで処理している感じだ。モデルとしてはサーバー・クライアントモデルなんだけど、実際はクライアント・クライアントという・・・非常に興味深い。

Flash/Flexによってかなりの処理をクライアントサイドのみで処理することが可能になったけれど、今後は単なるHTML/JavaScriptもクライアントサイドのみで様々な処理をするようになるのかもしれない。

「単にサーバーの処理能力を強化することも重要だけど、ほぼ無限とも言えるクライアントサイドの処理能力を上手く利用することもサーバー処理能力の強化と同じ効果があるはず」とずっと考えてきたが、さらにこの考えを強くした。