ちょっとAjaxの本を読んでみました

kwakui2006-05-23

ASTERIAはサーバサイドのプロダクトなのでAjaxとは直接関係ありませんけどサーバサイドの仕組みは必要なはずですから、今回は簡単な例で雰囲気だけでもお伝えしましょう。


参考にした書籍は「入門Ajax(高橋登史朗さん著)」です。
個人的にはすごい読みやすかったし解説も丁寧だったのでお勧めの本です。
この本のサポートサイトが以下となっています。
http://jsgt.org/js/ajax


こちらのサイトで本に載ってるサンプルの動作が確認できますので、
「サンプル」「入出力エフェクト」「半透明DIVへの出力」を動かしてみてください。


このサンプルはマウスポインターを乗せると現れるサブメニューの中身をサーバに問い合わせて入手し表示するものなんですけど、このサブメニューの中身を渡す部分をASTERIAで作ります。肝のAjax部分はほとんどそのままサンプルを利用させてもらいます。
出来れば書籍を読んでみてください。よく判ると思いますよ。Ajax部分の解説はこのサイトの範疇外ですので・・・。
フロー自体は楽勝ですね。


サンプルではメニューが二つあってそれぞれ違う内容のサブメニューが表示されるようになってますので、フロー側も条件によって2つのパターンでデータを返さなければなりません。Branchでもいいですけど今回はMapper内でChoiceさせてしまいましょう。


作るフローはこんな感じ。

サブメニューデータ生成フロー


配置するコンポーネントは以下の通りです。
「Start」→「Mapper」→「EndResponse」

GETパラメーターで何番目のメニューのデータを返せばいいのか判断しますので、「arg00/Integer」をArgumentタブに追加します

OutputStreamFormatはHTMLにしておきます。
Choice関数を使って与えられた値によって出力する内容を振り分けます。
Mapper内ではこんなマッピングをします。

[arg00]---1---|-->[Choice]-->[OutputStream]
[CONST1]--2---|
[CONST2]--3---|
[CONST3]--4---|
※線の途中の数字はChoice関数に引き込む順番です。

CONST1は何も設定しません。
CONST2はこんな内容です。

<a href="http://www.yahoo.co.jp">Yahoo</a>

CONST3はこんな内容です。

<a href="http://www.yahoo.co.jp">Yahoo</a>
<a href="http://www.google.co.jp">Google</a>


Choice関数のプロパティBaseは0に設定します。
これにより

  • 1番目に引き込まれた値が0ならCONST1の内容
  • 2番目に引き込まれた値が0ならCONST2の内容
  • 3番目に引き込まれた値が0ならCONST3の内容

を出力するようになります

  • EndResponse

特に設定なし


例によってコンパイル&実行設定しておきましょう。


あとはAjax側(クライアントサイド)の用意ですね。


HTML置き場が必要なのでユーザーGuestのホームディレクトリ(「ASTERIAインストールディレクトリ/home/guest」)にディレクトリ「htdocs」を作ってその中にHTMLを入れることにしましょう。
ユーザーGuestはデフォルト設定でコンテキストパスは「/guest」でドキュメントルートが「htdocs」になっているはずですので上記ディレクトリを作ってそこにHTMLを置けばhttp://ホスト名:21380/guest/○○○.htmlでアクセスできるようになります。


置き場が用意できたらあとは中身ですね。
著者も本の中で述べてますが、JavaScriptなのでソースは見放題というか勉強し放題です。
ありがたく参考にさせていただきましょう。


冒頭で説明したAjaxサンプルよりCSSおよびJacaScriptを含んだソースが入手できます。あとはその中のURL情報をASTERIAのフローにしてあげればOKですね。


修正箇所はソース内の「sendRequest」の部分です。
HTTPメソッドをGETにしてURLを書き換えます。
こんな感じ
'http://localhost:21380/guest/Project1/Ajax_sample?arg00='+num


「jslb_ajax.js」
あとこのサンプルソースは外部のスクリプトjslb_ajax.jsを更に呼び出します。
クロスブラウザ対策のスクリプトで著者が提供してます。DLして同じくhtdocsに収めておきましょう。
http://jsgt.org/mt/archives/01/000409.html
ファイル名を変更するかソースの方を書き換えるかする必要があります。


あとは本当ならJPG画像も読み込んでるので用意した方がいいんですけど、それはまぁお好きなようにw


準備できたらブラウザーから叩いてみましょう〜
http://ホスト名:21380/guest/○○○.html
私の場合は
http://localhost:21380/guest/sample2.html
となりました。


実行結果を貼っておきます。
またまた小さいですけどこんな感じです!ってゆうのは伝わったかな?


入門 Ajax

入門 Ajax

ASTERIA 実践ガイド ?マウスで楽々プログラミング

ASTERIA 実践ガイド ?マウスで楽々プログラミング

RDB(GET)コンポーネント

kwakui2006-05-22

RDBMSからのSELECT結果をストリームとして読み込みます。

主要プロパティ

名前データ型/候補値マッピング説明
Connectionconnection
接続先のRDBを指定します。
ASTERIA Server Management Consoleにて作成されたRDB接続名を選択します。
ModechoiceSQL入力&出力


SQLの入力方法を選択します。

SQL−SQLBuilderによって自動的にSQLを作成する場合に指定します。

SQL(Manual)−SQLを手入力する場合に指定します。

SQL(Manual)
SQLstring入力&出力


SQLを指定します。実際にRDBMSに対して発行されるSQLです。
「Mode」プロパティがSQLの場合、SQLBuilderによって自動的に作成されます。その場合、このプロパティを開くことによって作成されたSQL文を確認することができます。

「Mode」プロパティの指定に関わらずSQLはMapperによって値を差し込むことができます。

LoopProcessboolean


結果セットをまとめて出力するか1レコードずつループして出力するか選択します。

True−ループの起点となって1レコード(行)ずつストリームに出力されます。

False−すべてのレコード(行)がまとめてストリームに出力されます。

CountZeroExceptionboolean


結果セットのレコード件数が0件だった場合にExceptionとするかどうかを選択します。

True−Exceptionとなります。

False−空のストリームを出力します。

RecordCountinteger   出力


「LoopProcess」プロパティがFalseの場合、RDBから取得したレコード件数が取得できます。

「LoopProcess」プロパティがTrueの場合、常にnullになります。

QueryTimeoutinteger   出力


RDBMSに対してSELECT文を発行してから結果が返ってくるまでの待ち時間を秒単位で指定します。

指定時間を経過しても実行が終わらない場合はExceptionとなります。

0の場合はタイムアウトすることはありません。

RecordFilterboolean


SELECTした結果セットに対してStartRowプロパティとGetCountプロパティでフィルタリングを行うかどうかを指定します。

true - 結果セットをStartRowプロパティとGetCountプロパティでフィルタリングします。

false - 結果セットのフィルタリングは行われません。

StartRowint入力&出力


RecordFilter=Trueの場合に出力するレコードの開始行を指定します。

行のインデックスは1ベースのインデックスです。

StartRowが結果セットの件数よりも大きい場合はRecordNotFoundExceptionが発生します。(CountZeroExceptionがfalseの場合は空の結果セットが出力されます。)

GetCountint入力&出力


RecordFilter=Trueの場合に出力するレコードの行数を指定します。

例えば「StartRow=11」、「GetCount=10」の場合は入力レコードセットの11行目から10行が出力されます。

GetCountに達する前に入力レコードが最終行に達した場合はそこまでのレコードが出力されます。

GetCountが0の場合は、StartRow以降の全ての行が出力されます。

SQLParametercategory入力&出力


SQL中にパラメータ書式を埋め込むことにより、SQLParameterの値をパラメータ、または置換文字列として使用することができます。

詳細については下記トピックを参照してください。

コメント
RDBを使わないシステムなんて滅多にありませんから、これも最重要コンポーネントと言っていいでしょうね。
SQLを書き慣れている人は直接コテコテと書いちゃった方が早い!という場合もあるかと思います。そのときはマニュアルモードでどうぞ。

ASTERIA 実践ガイド ?マウスで楽々プログラミング

ASTERIA 実践ガイド ?マウスで楽々プログラミング

FileSystem(Put)コンポーネント

kwakui2006-05-16

ファイルシステムにストリームをファイルとして書き出します。

名前データ型/候補値マッピング説明
HomeDirectorychoiceProjectOwner
「FilePath」プロパティが相対パス指定の場合にベースディレクトリとして何を使うかを指定します。

ProjectOwner−プロジェクトオーナーのホームディレクトリを使用します。

ExecuteUser−実行ユーザーのホームディレクトリを使用します。
ExecuteUser
FilePathString入力&出力
書き込むファイルのパスを指定します。区切り文字「\」と「/」は区別されません。

相対パスの場合は「HomeDirectory」プロパティの指定に基づいて解釈されます。


例:

directory/file.txt

C:\directory\file.txt

\\server\share\file.txt

AppendModechoiceNew
「FilePath」プロパティで指定されたファイルが既に存在していた場合の書き込みを選択します。

New−上書きします。

Append−追加書き込みします。

Append

コメント
こちらはストリームの中身をファイルに書き出すコンポーネントです。


ASTERIA 実践ガイド ?マウスで楽々プログラミング

ASTERIA 実践ガイド ?マウスで楽々プログラミング

FileSystem(Get)コンポーネント

kwakui2006-05-14

ファイルシステムからファイルをストリームとして読み込みます。

名前データ型/候補値マッピング説明
HomeDirectorychoiceProjectOwner


「FilePath」プロパティが相対パス指定の場合にベースディレクトリとして何を使うかを指定します。

ProjectOwner−プロジェクトオーナーのホームディレクトリを使用します。

ExecuteUser−実行ユーザーのホームディレクトリを使用します。

ExecuteUser
FilePathstring入力&出力


読み込むファイルのパスを指定します。区切り文字「\」と「/」は区別されません。

相対パスの場合は「HomeDirectory」プロパティの指定に基づいて解釈されます。

「**」と「*」と「?」の3つのワイルドカードが使用できます。「**」は0個以上の任意のパスセグメントに、「*」は0個以上の任意の文字に、「?」は任意の1文字にマッチします。


例:

directory/file.txt

C:\directory\file.txt

\\server\share\file.txt

/*.txt - HomeDirectory以下の全ての「*.txt」ファイル

C:\directory\*.txt - C:\directory直下の「*.txt」ファイル

FileDeleteboolean


コミット時に読み込んだファイルを削除するかどうか選択します。

True−削除します。

False−削除しません。

LoopProcessboolean


「FilePath」プロパティにワイルドカードが指定され、複数のファイルが指定にマッチする場合にファイルをまとめて出力するか1ファイルずつループして出力するか選択します。

True−ループの起点となって1ファイルずつストリームに出力されます。

False−すべてのファイルがコンテナ化されてまとめてストリームに出力されます。

FileEncodingstring入力&出力


読み込むファイルのストリームフォーマットがText、HTML、CSVの場合にそのエンコーディングを指定します。

「(AutoDetect)」が指定された場合は可能な限りエンコーディングを自動検出します。

ここでの指定がStreamPropertyのエンコーディングと異なっていても構いません。

コメント
かなり多用するコンポーネントです。ファイルからのデータ読み込みですから基本的な機能ですね。


ASTERIA 実践ガイド ?マウスで楽々プログラミング

ASTERIA 実践ガイド ?マウスで楽々プログラミング

Logコンポーネント

kwakui2006-05-13

ログを出力します。

名前データ型/候補値マッピング説明
Messagestring入力&出力


ログに出力するメッセージを指定します。

LogLevelchoicefatal入力&出力


ログ出力レベルを指定します。

debugInfoを指定するとフローがデバッグモードで実行されている場合のみログ出力されます。

error
warn
info
debugInfo
debug

コメント
ASTERIAは自動である程度のログはシステムが取得していますが、より詳しくピンポイントでログが欲しいときはこのコンポーネントを利用します。


ASTERIA 実践ガイド ?マウスで楽々プログラミング

ASTERIA 実践ガイド ?マウスで楽々プログラミング

Mutexコンポーネント

kwakui2006-05-12

指定されたIDに対してロックを作成し、ロックが解除されるまで他のスレッド(フロー)のそのIDへのロックをブロックします。
ロックの期間はUnLockが実行された時、またはフローの終了までとなり、フローをまたがるロックは生成できません。
ロックが解除された時に複数のスレッドが、そのIDに対して待機状態であった場合、次にロックを獲得するスレッドがどれになるかは不定です。

名前データ型/候補値マッピング説明
IDstring入力&出力


生成するロックのIDです。

IDが指定されない場合はフロー名(オーナー名 + プロジェクト名 + フロー名)がIDとなります。

Timeoutinteger


ロック獲得までに待機する時間を秒単位で指定します。

指定時間を経過してもロックが獲得できなかった場合はExceptionとなります。

0を指定した場合はタイムアウトは発生しません。

ActionchoiceLock


動作を指定します。

Lock−ロックします。

UnLock−ロックを解除します。他のスレッドのかけたロックを強制的に解除することもできるので使い方には注意が必要です。

UnLock

コメント
ちょっと並列処理の項でも取り上げたMutexロックを行うコンポーネントです。
基本的にはこのコンポーネントは2つ対で利用します。ロックと解除ということですね。

性能向上のためにもロックする区間は短ければ短いほどいいです。


ASTERIA 実践ガイド ?マウスで楽々プログラミング

ASTERIA 実践ガイド ?マウスで楽々プログラミング

Abortコンポーネント

kwakui2006-05-11

フローの終了コンポーネントです。
Abortコンポーネントはフロー終了後に出力ストリームを返します。
EndやEndResponseと異なり、Abortではパラレル化した処理やループ処理が残っていてもこのコンポーネントが実行された時点で直ちにフローが終了します

名前データ型/候補値マッピング説明
RollbackTransactionboolean
トランザクションが有効な場合にRollbackを実行するかどうかを指定します。
トランザクションが無効な場合は無視されます。

True−Rollbackを実行します。

False−Rollbackを実行しません。

ReturnValuestring入力&出力
フローの返り値です。

フローがHTTPから起動された場合はHTTPのStatusコードとなります。その場合、「NNN XXXXX」のように「数字3桁 文字列」の形式で指定します。

このプロパティが空の場合HTTPのStatusコードは「500 Internal Server Error」になります。

フローがHTTPから起動されたのでない場合は、任意の文字列を設定できます。
CloseSessionboolean
フローの終了時にセッションを終了するかどうかを指定します。

True−フローの終了時にセッションを終了します。

False−フローの終了時にセッションを終了せず、タイムアウトするまで有効にします。
Locationstring入力&出力
HTTP起動のフローでReturnValueに「302」を指定した場合にリダイレクトするURL(Locationヘッダ)を指定します。

ReturnValueが「302」以外の場合はこのプロパティは無視されます。

コメント
あんまり使わないコンポーネントなんですよね。
強引にフローを終了してしまいますので、なるべくこのコンポーネントが使われないようにフローを組みたいものですが・・・。


ASTERIA 実践ガイド ?マウスで楽々プログラミング

ASTERIA 実践ガイド ?マウスで楽々プログラミング