Skip to main content

This is documentation for Caché & Ensemble. See the InterSystems IRIS version of this content.Opens in a new tab

For information on migrating to InterSystems IRISOpens in a new tab, see Why Migrate to InterSystems IRIS?

データベース・アプリケーションの構築

CSP により、組み込みのオブジェクト・データベースと直接対話ができる、動的な Web ページの作成が便利になりました。これにより、構築されたデータベース・アプリケーションには、以下のような利点があります。

  • オブジェクトに対するリレーショナル・データのマッピングが単純です。

  • 複雑なミドルウェアは不要です。

  • 拡張性が高く、シングル・サーバから多階層、複数のサーバ構成まで、実行時に再構成が可能です。

Caché SQL ゲートウェイを使用すると、サード・パーティ製のリレーショナル・データベースのデータにアクセスすることができる、オブジェクト指向の CSP アプリケーションを構築することができます。Caché はこれをアプリケーション・トランスペアレントな方法で実行します。この章で説明するすべてのテクニックは、組み込みの Caché データベース、またはサード・パーティ製のデータベースのどちらにデータを格納するかにかかわらず機能します。

CSP は柔軟性に優れており、データベース・アプリケーションをさまざまなテクニックで構築できます。その方法には、HTML 形式でデータを自動的に結合するという、高度なレベルのタグを使用したものから、オブジェクトを使用してデータに直接アクセスするサーバ側のスクリプトを記述するものまであります。この技術について、以下に説明します。

ページでのオブジェクトの使用

Caché により、アプリケーションのデータを表す永続オブジェクトのデータベースを、簡単に構築することができます。これらの永続オブジェクトは、Web アプリケーションにおいてさまざまな方法で使用できます。

ページにオブジェクト・データを表示するには、オブジェクトを開き、サーバ側のスクリプトを使用してその内容を書き出す方法が最も簡単です。

以下の例は、Caché SAMPLES データベース内の Sample.PersonOpens in a new tab クラスを使用します。これらの例は、CSP ページを使用していますが、記述されたテクニックは %CSP.PageOpens in a new tab クラスをサブクラスにして構築されたアプリケーションにも適用されます。

テーブルにオブジェクト・データを表示

以下の CSP ページの例では、永続オブジェクトのインスタンスを開き、プロパティの一部を HTML テーブルに表示し、その後そのオブジェクトを閉じます。

<html>
<body>
<script language="Cache" runat="SERVER">
 // open an instance of Sample.Person
 Set id = 1
 Set person = ##class(Sample.Person).%OpenId(1)
</script>
<table border="1">
<tr><td>Name:</td><td>#(person.Name)#</td></tr>
<tr><td>SSN:</td><td>#(person.SSN)#</td></tr>
<tr><td>City:</td><td>#(person.Home.City)#</td></tr>
<tr><td>State:</td><td>#(person.Home.State)#</td></tr>
<tr><td>Zip:</td><td>#(person.Home.Zip)#</td></tr>
</table>
<script language="Cache" runat="SERVER">
 // close the object
Set person = ""
</script>
</body>
</html>

以上を試すには、上記のコードをテキスト・ファイルにコピーし、mytable.csp という名前を付けて、使用しているマシンの /cachesys/csp/samples ディレクトリに保存します (cachesys は、Caché のインストール・ディレクトリです)。その後、ブラウザで以下のアドレスを開きます。

http://localhost:57772/csp/samples/mytable.csp

単純な HTML テーブルにデータが表示されます。

Note:

絶対に、実際の作業を /csp/samples ディレクトリで実行しないように注意してください。Caché をアップグレードすると、サンプルは再度インストールされ、そのディレクトリ内で作業した内容は消去されます。

フォームでのオブジェクト・データの表示

上記のようなコードを使用して、HTML フォームにデータを表示できます。この例では、永続的オブジェクトのインスタンスを開き、そのプロパティの一部を HTML フォームで表示し、その後オブジェクトを閉じます。

<html>
<body>
<script language="Cache" runat="SERVER">
 // open an instance of Sample.Person
 Set id = 1
 Set person = ##class(Sample.Person).%OpenId(1)
 If ($Data(%request.Data("SAVE",1))) {
    // If "SUBMIT" is defined, then this is a submit
    // Write the posted data into the object and save it
    Set person.Name = $Get(%request.Data("Name",1))
    Set person.SSN = $Get(%request.Data("SSN",1))
    Set person.Home.City = $Get(%request.Data("City",1))
    Do person.%Save()
 }
</script>
<form method="POST">
<br>Name:
<input type="TEXT" name="Name" value="#(..EscapeHTML(person.Name))#">
<br>SSN:
<input type="TEXT" name="SSN" value="#(..EscapeHTML(person.SSN))#">
<br>City:
<input type="TEXT" name="City" value="#(..EscapeHTML(person.Home.City))#">
<br>
<input type="SUBMIT" name="SAVE" value="SAVE">
</form>
<script language="Cache" runat="SERVER">
 // close the object
Set person = ""
</script>
</body>
</html>

データがキャッシュでのローカル変数の制限に満たない場合、%request.Data ("txt",1) は文字列値になります。 データが制限より大きい場合、そのデータをコンテンツとするストリームが CSP 内部に作成されます。 長い文字列が無効の場合、Cach の変数の制限は 32K です。長い文字列が有効の場合、この制限値は、はるかに大きくなります。

32K を超えるデータの保持が可能なフィールドを持つフォームを作成する場合は、以下のようなコードとします。

Set value=%request.Data("fieldname",1)
If $isobject(value) {
    ; Treat this as a stream
} Else {
    ; Treat this as a regular string
}   

フォームの送信要求処理

上記の例は、オブジェクトのコンテンツをフォームに表示することに加え、ユーザが [保存] ボタンを押してフォームを送信したときに、オブジェクトの変更を保存します。これは、以下のように実行されます。

フォームが送信されるとき、コントロールの値は (その送信を行ったボタンも含めて) サーバへ返信されます。この場合、フォームは最初にページを提供した CSP ページに送信されます。フォームの ACTION 属性の値を設定することにより、異なるページに送信することもできます。

CSP サーバは、送信された値を %request オブジェクトの Data プロパティに配置します。ページの先頭にあるサーバ側のスクリプトは、要求パラメータ Save (送信ボタンの名前) が定義されているかどうかにより、このページが送信要求に応答して処理されるかどうかを判断します。これは送信要求の結果としてのみ定義されるものです。これが送信要求である場合、スクリプトはフォームから送信された値を、オブジェクトの適切なプロパティにコピーして、オブジェクトを呼び出します。

 If ($Data(%request.Data("SAVE",1))) {
    // If "SUBMIT" is defined, then this is a submit
    // Write the posted data into the object and save it
    Set person.Name = $Get(%request.Data("Name",1))
    Set person.SSN = $Get(%request.Data("SSN",1))
    Set person.Home.City = $Get(%request.Data("City",1))
    Do person.%Save()
 }

<csp:object> タグ

上記の例に示した動作の中には、<csp:object> タグによって自動的に実行されるものもあります。<csp:object> タグは、CSP ページ上で使用するオブジェクト・インスタンスを生成する操作、開く操作、および閉じる操作に必要なサーバ側コードを生成します。

例えば、ある人に関するページを作るには、以下のコードを使用します。

<csp:object NAME="person" CLASSNAME="Sample.Person" OBJID="1">
<!-- Now use the object -->
Name: #(person.Name)# <br>
Home Address: #(person.Home.Street)#, #(person.Home.City)# <br>

この場合、<csp:object> タグによって、クラス CLASSNAME のオブジェクトでオブジェクト ID 1 を持つものが開き、それが変数 person に割り当てられます。実際のアプリケーションでは、オブジェクト ID は %request オブジェクトから得られます。

<csp:object NAME="person" CLASSNAME="Sample.Person"
OBJID='#($Get(%request.Data("PersonID",1)))#'>
Name: #(person.Name)# <br>
Home Address: #(person.Home.Street)#, #(person.Home.City)# <br>

以下の式を考えます。

$Get(%request.Data("PersonID",1))

この式は、URL パラメータ PersonID を参照しています。

OBJID 属性が NULL の場合、<csp:object> タグは、以下のように指定されたクラスの新規オブジェクトを生成します。

<csp:object NAME="person" CLASSNAME="Sample.Person" ObjID="">

<csp:object> タグの使用は、明示的にオブジェクト・インスタンスを生成するサーバ側のスクリプトを指定することと同じです。<csp:object> タグの利用例は、CSP ページのサンプル "object.cspOpens in a new tab" を参照してください。

フォームへのデータの結合

CSP には、あるオブジェクトのデータを HTML フォームに結合するための機能があります。この結合には、標準の HTML フォームやそのフォームを定義する入力コントロール・タグを使用します。 これにより、任意の HTML エディタやデザイン・ツールを使用して、オブジェクトに結合されたフォームを簡単にデザインできます。<csp:object> タグはオブジェクト・インスタンスを指定し、フォームや入力コントロール・タグに属性 cspbind を追加して、それらがどのように結合されるかを示します。

CSP コンパイラは、cspbind 属性を含むフォームを認識し、自動的に以下のようなコードを生成します。

  • 適切な入力コントロールに、指定されたオブジェクト・プロパティの値を表示します。

  • 簡単な検証 (入力が必須のフィールドにデータが入力されているかどうかの確認など) を実行するため、クライアント側の JavaScript 関数を生成します。

  • クライアント側の JavaScript 関数を生成して、結合されたオブジェクトを保存するための生成済みサーバ側メソッドを呼び出します。

  • フォームに入力されたデータを検証して保存する、サーバ側のメソッドを生成します。これらのメソッドは、CSP イベント・ブローカを使用してページから直接呼び出せます。または、フォーム送信操作の結果として呼び出すこともできます。

  • フォームの非表示フィールド、OBJID を生成します。これには、結合されたフォームのオブジェクト ID 値が含まれます。

以下は、Sample.PersonOpens in a new tab クラスのインスタンスに結合するフォームの例です。

<html>
<head>
</head>
<body>
<csp:object NAME="person" CLASSNAME="Sample.Person" OBJID="1">
<form NAME="MyForm" cspbind="person">
<br>Name:
<input type="TEXT" name="Name" cspbind="Name" csprequired>
<br>SSN:
<input type="TEXT" name="SSN" cspbind="SSN">
<br>City:
<input type="TEXT" name="City" cspbind="Home.City">
<br>
<input type="BUTTON" name="SAVE" value="SAVE" OnClick="MyForm_save();">
</form>
</body>
</html>

この例では、<csp:object> タグを使用して、Sample.PersonOpens in a new tab クラスのインスタンスを開きます (ここではオブジェクト ID 1 を指定します)。このオブジェクト・インスタンスには person という名前が付けられます。そして、HTML フォームの form タグに cspbind という属性を追加し、その値を person と指定することにより、このオブジェクト・インスタンスをその HTML フォームに結合します。

このフォームには、3 つのテキスト入力コントロール、NameSSN (社会保障番号)、City があります。これらは、各 input タグに cspbind という属性を追加することにより、オブジェクト・プロパティである NameSSNHome.City と結合しています。その属性の値は、コントロールが結合しているオブジェクト・プロパティの名前です。

結合されたフォームで使用されるコントロールの名前は、有効な JavaScript 識別子である必要があります。

Name コントロールには CSPREQUIRED という属性も指定されています。これは、入力が必須のフィールドであることを示しています (このフィールドには値を指定する必要があります)。CSP コンパイラは、このフィールドに値が入力されているかどうかを調べるために、クライアント側の JavaScript を生成します。

フォーム上の最後のコントロールはボタンです。これをクリックするとクライアント側の JavaScript 関数である MyForm_save 関数を呼び出すように定義されています。MyForm_save 関数は、CSP コンパイラによって自動的に生成されます。この関数は、フォーム内のコントロールの値を集め、(同じく CSP コンパイラによって自動的に生成された) サーバ側のメソッドに送信します。そして、オブジェクト・インスタンスを再び開き、プロパティへの変更を適用し、オブジェクトをデータベースに保存します。保存された変更を反映させるためにフォームの値を更新する JavaScript をクライアントに送信します。

このドキュメントには HEAD セクションが定義されています。このセクションは、クライアント側の JavaScript の場所を示すために使用されるので、結合されたフォームを使用するときに必須です。この JavaScript は、結合されたフォームを処理をするときに、CSP コンパイラによって生成されます。

規定上は、結合されたフォームで使用するオブジェクトのオブジェクト ID は、URL パラメータ OBJID で指定します。これによって、CSP 検索機能のように、結合されたフォームが組み込みページと対話できるようになります。URL パラメータの値をオブジェクト ID として使用するには、以下のように、それを参照する式を csp:object タグで使用します。

<csp:object NAME="person"
CLASSNAME="Sample.Person" OBJID=#($G(%request.Data("OBJID",1)))#>

プロパティへの結合

特定の HTML 入力コントロールをオブジェクト・プロパティに結合するには、以下を実行します。

  • csp:object タグを使用して、オブジェクト・インスタンスを参照するサーバ側変数を定義します。

  • form タグを使用して、HTML フォームを作成します。その form タグに cspbind 属性を追加することにより、フォームをオブジェクト・インスタンスに結合します。cspbind 属性の値を、csp:object タグの名前にします。

  • フォーム内で HTML 入力コントロールを作成し、それに cspbind 属性を追加します。この cspbind 属性の値を、結合するオブジェクト・プロパティの名前にします。

cspbind 属性を使用することで、さまざまなタイプのオブジェクト・プロパティに結合できます。詳細は、以下のテーブルを参照してください。

cspbind 属性の効果
プロパティ 結果
リテラル cspbind=“Name” コントロールをリテラル・プロパティに結合します。プロパティの DISPLAY 値を表示します。
埋め込みオブジェクトのプロパティ cspbind=“Home.City” コントロールを埋め込みオブジェクトのプロパティに結合します。埋め込みオブジェクトのプロパティの DISPLAY 値を表示します。
参照されたオブジェクト cspbind=“Company” コントロールを参照プロパティのオブジェクト ID 値に結合します。参照プロパティの object ID 値を表示します。
参照されたオブジェクトのプロパティ cspbind=“Company.Name” コントロールを参照オブジェクトのプロパティに結合します。参照オブジェクトのプロパティの DISPLAY 値を表示します。
インスタンス・メソッド cspbind=“%Id()” インスタンス・メソッドの値を返すために、コントロールを結合します。読み取り専用のフィールドとして、メソッドの返り値を表示します。

結合機能は、ほとんどの HTML 入力コントロールでサポートされています。詳細は、以下のテーブルを参照してください。

cspbind がサポートする HTML 入力要素
コントロール 結果
INPUT TYPE=“TEXT” テキスト・コントロールにプロパティの値を表示します。
INPUT TYPE=“PASSWORD” テキスト・コントロールにプロパティの値を表示します。
INPUT TYPE=“CHECKBOX” チェック・ボックス・コントロールにプロパティの値 (ブーリアン値) を表示します。
INPUT TYPE=“RADIO” ラジオ・ボタンを選択することで、プロパティの値を表示します。このラジオ・ボタンの値はプロパティ値に対応します。
INPUT TYPE=“HIDDEN” 非表示コントロール内でプロパティの値を表示します。
SELECT プロパティ値に対応する値を持つ SELECT リストから、項目を選択してプロパティの値を表示します。クラス・クエリの CLASSNAME 属性、QUERY 属性、およびオプションで FIELD 属性を指定して、SELECT リストの選択肢を作成できます。例として、CSP サンプル・ページ form.csp を参照してください。
IMAGE IMAGE タグ内のバイナリ・ストリーム・プロパティを表示します。
TEXTAREA TEXTAREA コントロールのプロパティ値をテキストとして表示します。

<csp:search> タグを持つ CSP 検索ページ

csp:search タグで、一般的な検索ページを作成できます。結合したフォームとこのページを組み合わせて使用して、検索処理を実行できます。

アプリケーション・ユーザは、結合されたフォームを含むページから CSP 検索ページにアクセスし、これを使用して、データベースから基準に当てはまるオブジェクトを見つけます。次にこれらのオブジェクトの 1 つを選択して、編集できます。

csp:search タグは、検索ページを表示するクライアント側の JavaScript 関数を生成します。検索ページは、%CSP.PageLookupOpens in a new tab クラスによって表示されます。

csp:search タグには、検索ページの動作を管理するための属性を指定します。これには、以下のものがあります。

<csp:search> タグの属性
属性 説明
CAPTION オプション。標準の検索ページに表示される説明文字列。
CLASSNAME 必須項目。検索を実行するクラス名。
FEATURES オプション。ポップアップ型の検索ウィンドウが使用されるとき、JavaScript の window.open メソッドに渡される features 引数を含む文字列。これにより、ポップアップ・ウィンドウの表示方法など、詳細な管理ができるようになります。
MAXROWS オプション。検索結果テーブルに表示する最大行数を指定。既定値は 100 です。
NAME 必須項目。検索ページを呼び出す、生成されたクライアント側の JavaScript 関数の名前。
OBJID 検索ページを呼び出したときに表示されているオブジェクトの、オブジェクト ID 値。ユーザが検索をキャンセルした際に、前のページを再表示するために使用します。
ONSELECT オプション。ポップアップ型の検索ページで、ユーザが特定の検索結果を選択するときに呼び出す JavaScript 関数の名前。この関数は、選択されたオブジェクトのオブジェクト ID 値で呼び出されます。
OPTIONS オプション。検索ページのオプションを、コンマで区切って並べたリスト。オプションには、ポップアップ検索ウィンドウを作成する popup や、検索述語のドロップ・ダウン・リストを表示する predicates があります。
ORDER オプション。検索結果を並べ替えるフィールドの名前。
SELECT オプション。検索結果テーブルで表示に使用するフィールドのコンマで区切られたリスト。何も指定がないときは、WHERE リストが SELECT リストとして使用されます。
STARTVALUES オプション。検索ページを呼び出すフォーム内の、コントロールの名前をコンマで区切って並べたリスト。そのコントロールの内容が検索ページ中で seed の値として使用されます。リスト内の名前の順番は、検索ページ内の (WHERE 属性によって指定された) 条件フィールドに対応します。
TARGET オプション。ポップアップ検索ページでない場合に、検索結果ウィンドウでリンクが参照するページの名前を指定します。これは、ユーザが選択した際に表示するページです。既定は、検索を呼び出すページです。
WHERE 必須項目。検索ページの条件として使用されるフィールドをコンマで区切って並べたリスト。これらのフィールドは、SELECT 属性が指定されない限り、検索結果テーブルにも表示されます。

例えば、以下は JavaScript 関数、MySearch を定義します。この関数は、ポップアップ検索ウィンドウを表示し、名前で Sample.PersonOpens in a new tab オブジェクトを検索します。

<csp:search NAME="MySearch" WHERE="Name" CLASSNAME="Sample.Person"
 OPTIONS="popup" STARTVALUES="Name" ONSELECT="MySearchSelect">

この検索ページで使用する ONSELECT コールバック関数は以下のとおりです。

<script language="JavaScript">
function MySearchSelect(id)
{
    #server(..MyFormLoad(id))#;
    return true;
}
</script>

この関数は、CSP の #server()# 指示文を使用して、サーバ側のメソッド MyFormLoad を呼び出します。MyFormLoad メソッドは、cspbind を使用して HTML フォーム MyForm をオブジェクトに結合した結果として自動的に生成されます。このメソッドは、オブジェクト ID が id であるオブジェクトのプロパティ値を使用して、そのフォームのコンテンツを生成します。

その他の例は、CSP サンプル・ページの "form.cspOpens in a new tab" と "popform.cspOpens in a new tab" を参照してください。

ISCLOG でのログの有効化

CSP に関する問題のトラブルシューティングを行うには、ターミナルで以下のコマンドを入力することによって、Caché のログを有効にします。

 Set ^%ISCLOG = 2

ログ情報は ^ISCLOG グローバルで表示できます。このグローバルは、Caché でのイベントを記録してデバッグに備えます。参照として、以下にログのレベルを示します。

  • 0 — Caché はログを記録しません。

  • 1 — Caché は、例外的なイベント (エラー・メッセージなど) のみをログに記録します。

  • 2 — Caché は、method ABC invoked with parameters X,Y,Z and returned 1234 などの詳細な情報をログに記録します。

  • 3 — Caché は、HTTP 要求から受け取ったデータなどの未処理のデータをログに記録します。

以下のいずれかのコマンドで Caché のログをオフにできます。

 Set ^%ISCLOG = 0

または

 Kill ^%ISCLOG

ISCLOG では、以下に示すように、一部のエントリは、イベント・ログのヘッダ・フィールドに一致します。

ISCLOG イベント・ログ
Job Cache-PID
SessionId Session-ID
Tag Request-ID

以下のテーブルは、ISCLOG のフィールドと定義を示しています。

ISCLOG のフィールド
フィールド 定義
%category

CSPServercspServercspServer2%request%response からのログが記録されます。

 

CSPSession%session からのログ、および cspServercspServer2 のうちセッションを処理する部分からのログが記録されます。これにより、セッションのライフサイクルを監視できます。

 

CSPLicensecspServercspServer2 のうちライセンスを処理する部分からのログが記録されます。

 

Gateway RequestGatewayMgrGatewayRegistry、ゲートウェイ要求ハンドラからのログ、および cspServer2 のうちゲートウェイ要求を処理する部分からのログが記録されます。

%level

1= 例外とエラー。

 

2=CSPSession に関する情報。CSPLicense に関する情報。 cspServer からの情報 : %response%session、および %request の設定後の要求処理の一部。これには、認証、ライセンス処理、リダイレクト、および CSPpage の呼び出しが含まれます。

 

3= cspServer2 からの情報 : 要求処理のうち、%response%session%request、および CSP ゲートウェイとのハンドシェイク/データ転送を設定する部分。

%job ISCLOG 要求の生成時の $job の値。イベント・ログのヘッダの Cache-PID フィールドに一致します。
%sessionid

使用可能な場合に入力されます。ISCLOG 要求の生成時のsessionid の値。イベント・ログのヘッダの Session-ID フィールドに一致します。

%tag CSP サーバの場合、タグには、ゲートウェイからの要求 ID が含まれます (使用可能な場合)。これは、イベント・ログのヘッダの Request-ID フィールドに一致します。他のログ記録機能によって、この値を任意の値に設定することができます。

ISCLOG エントリの作成者が使用できます。CSP ゲートウェイから送信されてきた要求の ID を格納します。ISCLOG エントリを生成する場合のフィルタとして使用できます。 Set ^%ISCLOG("Tag","mytagvalue1")=1 Set ^%ISCLOG("Tag","mytagvalue2")=1

タグが付いていない ISCLOG 要求、または "mytagvalue1" タグか "mytagvalue2" タグが付いている ISCLOG 要求のみが記録されます。

%routine 現在実行されているルーチンの名前。
%message 後述の "メッセージ形式" のセクションを参照してください。

メッセージ形式

メッセージの先頭には、タグ・ラベルの名前、または現在実行されているメソッドの名前が出力されます。この名前は角括弧で囲まれています。[MyMethod] 以降のメッセージ部分

CSPSession カテゴリのメッセージの場合は、メソッド名の後に CSPSession-Id=sessid も付きます。これは、セッションの作成前または破棄後、つまり ISCLOG エントリの SessionId フィールドが空の場合に、セッション・イベントのログを記録するために必要です。

[MyMethod] CSPSession-Id: 12ty34ui22

GatewayRegistry カテゴリのメッセージの場合は、メソッド名の後に CSPID=cspid も付きます (使用可能な場合)。これによって、ゲートウェイ要求ハンドラを介して、API 呼び出しからの個々のゲートウェイ要求を追跡できるようになります。

 [MyMethod]CSPID:334r43345 rest of message
FeedbackOpens in a new tab