Curl API では、ブラウザで実行される単一のアプレットや独立型アプレットよりも複雑な構造を持つアプリケーションを作成することが可能です。「
HTML ページ内でのアプレットの埋め込み」で述べられているように、Curl のアプレットを HTML ページ内に埋め込むことができます。HTML ページ内の JavaScript から Curl のサブアプレットの関数を呼び出すことや、サブアプレットから JavaScript の関数を呼び出すことができます。
この方法で、HTML を使用してユーザー インターフェイスを作成し、埋め込まれた Curl のアプレットを使用してHTML にはない機能を実装する Web ページを作ることができます。この方法により、Curl のアプレットが JavaScript API を使用してデータソースへアクセスすることもできます。また、一部分を Curl アプレットで一部分を Web ブラウザで表示するコンテンツで構成される Web ページを作成することも可能です。例えば、サーバー上で動画ファイルを一覧化し、ユーザーが選択した動画ファイルを表示する動画ビューワと HTML ページを共有するアプレットなどがそれに当たります。
さらに、Curl アプレットは
AppletData クラスを使用して、サブアプレットをプログラムによって作成し、管理することができます。この場合、サブアプレットはその親の関数を呼び出し、親はサブアプレットの関数を呼び出します。Web ブラウザ内でトップレベルのページとしてロードされた Curl アプレットには親がありません。この方法により、UI を持たず計算だけを行う子アプレットを読み込み、連携する親アプレットと子アプレットを作成することができます。
IDE のドキュメントでは、Curl および HTML の親を持つ Curl のサブアプレットについて説明するサンプルファイルを提供しています。このサンプルファイルの使用についての詳細は、「
内容の充実したサンプル ファイル」をご覧ください。
サンプルは次のパスにあります。
d:\automated-build-temp\build\win32-atom\docs\default\examples\dguide\subapplets.zip
このアーカイブ ファイルには、シェイプにプロパティを設定する簡単な例を含む shape と呼ばれるディレクトリがあります。このセクションに含まれているコードはこのサンプルをもとにしています。google-map には、Google マップとCurl のレコード グリッド間の相互作用連携の高度なサンプルがあります。Google マップのサンプルを実行するためには、Google のアカウントが必要で、google-map.html で指定された URL にキーを挿入しなければなりません。key=
を検索して [insert key here]
をキーに置換します。http://www.google.com/apis/maps/signup.html を参照してください。
アプレットは次のコードで親からの呼び出し用のハンドラを登録します。
{{get-the-applet}.register-applet-invoke-handler
{Applet.applet-invoke-handler-for-object shape},
|| Allow ANY page to host this applet and send it commands.
verifier = {proc {}:bool {return true}}
}
- アプレットが呼び出すハンドラを登録する。この例では Applet.applet-invoke-handler-for-object を使用して、このアプレットで定義された RectangleShape サブクラスの shape オブジェクトであるMyShape インスタンスのハンドラを作成します。このハンドラにより、親は shape のどのパブリック メソッドも呼び出すことができます。メソッド名と引数自体をチェックするアプレットのためのカスタムハンドラを作成することもできます。
- 親がアプレットに呼び出しを行えるかどうかをチェックする検証プロシージャを登録する。この例ではすべての場合において単に true を返す検証プロシージャを使用しています。これにより任意のページがこのアプレットを操作し、コマンドを送ることができます。多くの実在するアプリケーションはよりセキュアな検証プロシージャを使用することとなります。詳細は、「セキュリティの問題」を参照してください。
Shape の例では、次のコードのように applet-invoke-ready-callback を設定します。
set ad.applet-invoke-ready-callback =
{proc {}:void
{send-command ad, "set-random-color-list",
{new {Array-of any}, "lightgreen", "skyblue", "orchid"},
"random-color-change"
}
{send-command ad, "change-color", color-list.value asa String}
{send-command ad, "change-size", size-list.value asa String}
}
set-random-color-list、change-color および change-size 文字列はサブアプレット内の MyShape 上のメソッドを参照します。send-command プロシージャは、applet-invoke-async を使用して、次のサブアプレット内のメソッドを呼び出します。
{define-proc public {send-command
ad:AppletData,
command:String, ...:any
}:void
{ad.applet-invoke-async
finish-proc =
{proc {ex:#Exception, result:any}:void
{popup-message
title = "Finishing applet-invoke-async",
{if-non-null ex then
"Command: " & command & " Error: " & ex
else
"Command: " & command & " Result: " & result
}
}
},
command,
{splice ...}
}
}
従って、アプレットが準備できると、親はサブアプレットに色のリストをセットアップし、長方形の色とサイズを変更するように指示します。
color-list と size-list 上のイベント ハンドラもまた send-command を通じて applet-invoke-async を使用し、親アプレット上でのユーザーの選択に呼応してサブアプレット内の長方形のサイズと色を変更します。
shape ディレクトリには shape-parent.html と呼ばれるファイルもあり、これは OBJECT タグを使用して shape.curl アプレットを埋め込みます。HTML 内のドロップダウン リストでシェイプのサイズと色を選択することができます。
Curl のサブアプレットがその親と交信する方法は、親からサブアプレットに交信する方法と似ています。親アプレットは
AppletData.parent-invoke-handler プロパティをプロシージャに設定することによりサブアプレットからの呼び出しを受け入れる準備をします。親はサブアプレットがするようにこのハンドラを登録することはしません。
この例では、サブアプレットが
RectangleShape の色を 10 秒間隔で無作為に選んだ色に変更し、親に知らせます。親はこの情報を使用して
color-list の値を更新します。
Shape の例では、次のコードのように parent-invoke-handler へセットされます。
set ad.parent-invoke-handler =
{proc {method-name:String, ...:any}:any
{switch method-name
case "random-color-change" do
let color-name:#String
{for a in ... do
set color-name = a asa String
{break}
}
let i:int = 0
{for li in color-list.list-items do
{if li.value == color-name then
{color-list.select-index i}
{return null}
}
{inc i}
}
{return null}
else
{error "Unknown parent-invoke method name."}
}
}
applet-invoke 呼び出しについては慎重に考慮しなくてはなりません。いくつかのアプレットは、単に情報を表示するだけのアプレットのようにどのような親によっても安全に操作することができます。アプレットが親が使用可能なデータを作成する場合、あるいはパスワードについての情報にアクセスできる場合は、アプレットは親の識別を慎重に確認する必要があります。
多数のアプレットによって指定された applet-invoke メソッドはセキュリティの問題について不安がないかもしれません。しかし、アプレットが起こす動作のセキュリティチェックはアプレットの URL に基づいており、アプレットがある Web サーバーから操作され、親は別の Web サーバーからホストされる場合、本来許されない許可を親に与えてしまうということを忘れないでください。
Parent-invoke 呼び出しは親が HTML ページであれば常に許可されます。Curl の親アプレットは、
AppletData.parent-invoke-handler をインストールしないか、あるいは特定の子からの特定の呼び出しだけを許可するハンドラを指定することにより、parent-invoke 呼び出しを制限することができます。
IDE ドキュメントは Web サイトから JSON フォーマットを操作する方法のサンプルを提供します。サンプル ファイルの使用についての詳細は
内容の充実したサンプル ファイル をご覧ください。
サンプルは次のファイルにあります。
d:\automated-build-temp\build\win32-atom\docs\default\examples\dguide\JSON.zip
このアーカイブ ファイルには、JSON 形式のデータのソースとしてソーシャルブックマークの Web サイト http://del.icio.us を使用する JSON-feed.curl と呼ばれるアプレット ファイルがあります。この Web サイトでは、関連するテキスト タグとともにインターネットのサイトにブックマークを保存することができます。
アプレットはサイトに載せたブックマークを含む JSON 形式のオブジェクトを取得し、ブックマークをタグとともに Curl のテーブルに URL として表示します。このデータ ソースについての詳細は、「
JSON Post Feeds」を参照してください。
また、アプレットは、定義したすべてのタグをそれぞれ使用した回数とともに含む、別のオブジェクトも取得します。タグフィードについての詳細は、「
JSON Tag Feeds」を参照してください。
この例を実行するためには、http://del.icio.us にユーザー アカウントを作成し、アプレット内の [your-user-name] にユーザー名を入れなければなりません。
JsonValue-parse プロシージャは、
http://del.icio.usによって指定された JSON オブジェクトを Curl で操作可能な構造に変換します。
JsonValue-parse は
JsonValue を返します。
JsonValue は
any のシノニムなので、この情報は結果として得られたオブジェクトを扱うには十分ではありません。
JsonValue-parse によって戻り値オブジェクトの正確な構造はデータソースに依存します。この場合、
http://del.icio.us サイトは明確に JavaScript に適したこれらのデータ構造について説明しており、データ構造についての便利な情報を与えてくれます。また、Curl のデバッガを使用して、返されたオブジェクトの構造を調べることができます。
||--Get the tags
{let post-tags:JsonValue =
{JsonValue-parse
{url "http://del.icio.us/feeds/json/tags/[your-user-name]"}
}
}
戻り値のオブジェクトは
JsonObject で、これは
HashTable-of String, JsonValue のサブクラスです。文字列キーはタグで、関連づけられた値はそれぞれのタグを使用した回数です。
||--Get the posts
{let posts:JsonValue =
{JsonValue-parse
{url "http://del.icio.us/feeds/json/[your-user-name]"}
}
}
この場合に返された
JsonValue は、より複雑です。これは
Array-of JsonValue で、配列の各要素が
JsonObject です。それぞれの
HashTable のキーは
に記述された文字で関連付けられた値の型を識別します。
- キーが "u" の場合、要素は URL です。
- キーが "d" の場合、要素は説明文です。
- キーが "t" の場合、要素はタグの配列です。
- キーが "n" の場合、要素は注記です。
JSON 形式のデータを Curl で扱う際には、多くの場合ハッシュ テーブルを扱うことを意味します。従ってそれらについて述べているセクションを参照したい場合は、「
ハッシュ テーブル」をご覧ください。
Copyright © 1998-2019 SCSK Corporation.
All rights reserved.
Curl, the Curl logo, Surge, and the Surge logo are trademarks of SCSK Corporation.
that are registered in the United States. Surge
Lab, the Surge Lab logo, and the Surge Lab Visual Layout Editor (VLE)
logo are trademarks of SCSK Corporation.