Caché Server Pages (CSP) の 使用法 Version 2012.2 2012 年 09 月 12 日 InterSystems Corporation 1 Memorial Drive Cambridge MA 02142 www.intersystems.com Caché Server Pages (CSP) の使用法 Caché Version 2012.2 2012 年 09 月 12 日 Copyright © 2012 InterSystems Corporation All rights reserved. このドキュメントは、 Sun Microsystems、RenderX Inc.、 アドビ システムズ および ワールドワイド・ウェブ・コンソーシアム(www.w3c.org)のツールと 情報を使用して、 Adobe Portable Document Format (PDF)で作成およびフォーマットされました。主要ドキュメント開発ツールは、InterSystemsが構 築したCacheéと Javaを使用した特別目的のXML処理アプリケーションです。 , , Caché WEBLINK, Distributed Cache Protocol, M/SQL, M/NET および M/PACT は InterSystems Corporation の登録商標です。 , , and , InterSystems TrakCare, InterSystems Jalapeño Technology, Enterprise Cache Protocol, ECP および InterSystems Zen は InterSystems Corporation の 登録商標です。 ここで使われている他の全てのブランドまたは製品名は、各社および各組織の商標または登録商標です。 このドキュメントは、インターシステムズ社(住所:One Memorial Drive, Cambridge, MA 02142)あるいはその子会社が所有する企業秘密および秘密 情報を含んでおり、インターシステムズ社の製品を稼動および維持するためにのみ提供される。この発行物のいかなる部分も他の目的のために使 用してはならない。また、インターシステムズ社の書面による事前の同意がない限り、本発行物を、いかなる形式、いかなる手段で、その全てまたは 一部を、再発行、複製、開示、送付、検索可能なシステムへの保存、あるいは人またはコンピュータ言語への翻訳はしてはならない。 かかるプログラムと関連ドキュメントについて書かれているインターシステムズ社の標準ライセンス契約に記載されている範囲を除き、ここに記載さ れた本ドキュメントとソフトウェアプログラムの複製、使用、廃棄は禁じられている。インターシステムズ社は、ソフトウェアライセンス契約に記載され ている事項以外にかかるソフトウェアプログラムに関する説明と保証をするものではない。さらに、かかるソフトウェアに関する、あるいはかかるソフ トウェアの使用から起こるいかなる損失、損害に対するインターシステムズ社の責任は、ソフトウェアライセンス契約にある事項に制限される。 前述は、そのコンピュータソフトウェアの使用およびそれによって起こるインターシステムズ社の責任の範囲、制限に関する一般的な概略である。完 全な参照情報は、インターシステムズ社の標準ライセンス契約に記され、そのコピーは要望によって入手することができる。 インターシステムズ社は、本ドキュメントにある誤りに対する責任を放棄する。また、インターシステムズ社は、独自の裁量にて事前通知なしに、本ド キュメントに記載された製品および実行に対する代替と変更を行う権利を有する。 インターシステムズ社の製品に関するサポートやご質問は、以下にお問い合わせください: Tel: Fax: Email: InterSystems Worldwide Customer Support +1 617 621-0700 +1 617 374-9391 [email protected] 目次 このドキュメントについて ................................................................................................... 1 1 Caché Server Pages 入門 ............................................................................................... 3 1.1 CSP および Zen ................................................................................................... 4 1.2 はじめに ............................................................................................................. 4 1.2.1 プロダクション Web サーバおよび Caché 付属のプライベート Web サーバ ............ 4 1.2.2 Web サーバと CSP ゲートウェイの構成 ............................................................ 4 1.2.3 必要な事前知識 .......................................................................................... 5 1.2.4 CSP サンプル ............................................................................................. 5 1.2.5 CSP ドキュメント ........................................................................................... 5 1.3 初めての CSP ページの生成 ................................................................................. 6 1.3.1 クラス・ベースの CSP ページの作成 ................................................................ 6 1.3.2 HTML タグを使用した CSP ページの作成 ....................................................... 7 2 CSP アーキテクチャ ...................................................................................................... 9 2.1 CSP コンポーネント : Web サーバ、CSP ゲートウェイ、CSP サーバ .............................. 9 2.1.1 各コンポーネントの機能 .............................................................................. 10 2.1.2 情報フロー ............................................................................................... 10 2.1.3 静的ファイル ............................................................................................. 11 2.2 URL の Web サーバ構成 ..................................................................................... 11 2.2.1 Microsoft IIS Web サーバでの新規 URL の構成 ............................................ 12 2.3 CSP ゲートウェイ構成 .......................................................................................... 13 2.3.1 CSP ゲートウェイ・マネージャ ....................................................................... 13 2.3.2 サーバ・アクセスの定義 ............................................................................... 14 2.3.3 アプリケーション・アクセスの定義 ................................................................. 14 2.3.4 CSP ゲートウェイ・パラメータ ........................................................................ 15 2.4 CSP アプリケーションの設定 ................................................................................. 15 2.4.1 Web アプリケーションの設定の編集 .............................................................. 15 2.4.2 新規アプリケーションの定義 ....................................................................... 19 3 CSP での HTTP 要求 .................................................................................................. 21 3.1 CSP 実行時環境 ................................................................................................ 21 3.2 HTTP 要求の処理 .............................................................................................. 22 3.2.1 Web サーバと CSP ゲートウェイ .................................................................... 23 3.2.2 CSP サーバ .............................................................................................. 23 3.2.3 CSP サーバのイベント・フロー ...................................................................... 23 3.2.4 CSP サーバの URL とクラス名の解決 ............................................................ 23 3.3 %CSP.Page クラス ................................................................................................ 25 3.3.1 Page メソッド .............................................................................................. 25 3.3.2 %CSP.Page クラス・パラメータ ........................................................................ 25 3.3.3 CSP エラーの処理 ..................................................................................... 26 3.4 %CSP.Request オブジェクト ................................................................................... 27 3.4.1 URL プロパティ ......................................................................................... 27 3.4.2 Data プロパティおよび URL パラメータ .......................................................... 27 3.4.3 CgiEnvs プロパティおよび CGI 環境変数 ...................................................... 28 3.4.4 Cookies プロパティ ..................................................................................... 28 3.4.5 MIME データ・プロパティ ............................................................................. 28 3.5 %CSP.Response オブジェクトおよび OnPreHTTP メソッド ........................................... 28 3.5.1 SetCookie メソッドによる Cookie の送信 ......................................................... 29 Caché Server Pages (CSP) の使用法 iii 3.5.2 さまざまなコンテンツ・タイプの提供 .............................................................. 30 4 CSP セッション管理 ..................................................................................................... 31 4.1 CSP.Session を持つセッション ............................................................................... 31 4.1.1 セッションの生成 ........................................................................................ 31 4.1.2 セッション ID ............................................................................................. 32 4.1.3 セッションの終了とクリーンアップ .................................................................. 32 4.1.4 CSP の予約パラメータ ................................................................................ 32 4.2 %CSP.Session オブジェクト .................................................................................... 35 4.2.1 ユーザ・セッション・データ — Data プロパティ .................................................. 35 4.2.2 ユーザ・セッション・データの設定 — Set コマンド ............................................. 35 4.2.3 ユーザ・セッション・データの取得 — Write コマンド .......................................... 36 4.2.4 ユーザ・セッション・データの削除 — Kill コマンド ............................................. 36 4.2.5 セッション・タイムアウト ................................................................................ 36 4.2.6 タイムアウト通知 — OnTimeout メソッド ........................................................... 36 4.3 ステート管理 ...................................................................................................... 36 4.3.1 要求間のデータの追跡 ............................................................................... 37 4.3.2 ページへのデータの格納 ............................................................................ 37 4.3.3 Cookie へのデータの格納 ........................................................................... 37 4.3.4 セッションへのデータの格納 — Data プロパティ .............................................. 38 4.3.5 データベースへのデータの格納 ................................................................... 38 4.3.6 サーバ・コンテキストの保存 — Preserve プロパティ ........................................... 38 4.4 認証と暗号化 .................................................................................................... 38 4.4.1 セッション・キー .......................................................................................... 38 4.4.2 暗号化された URL と CSPToken .................................................................. 39 4.4.3 プライベート・ページ ................................................................................... 39 4.4.4 コード化された URL パラメータ .................................................................... 40 4.5 認証共有の方法 ................................................................................................ 41 4.5.1 認証方法 ................................................................................................. 42 4.5.2 認証アーキテクチャ .................................................................................... 44 4.5.3 方法を選択するときの考慮事項 .................................................................... 46 5 CSP におけるタグを使用した開発 .................................................................................. 49 5.1 CSP コンパイラ ................................................................................................... 49 5.1.1 自動および手動によるページ・コンパイル ...................................................... 50 5.2 CSP マークアップ言語 ......................................................................................... 50 5.2.1 CSP ページ言語 ........................................................................................ 51 5.2.2 テキスト .................................................................................................... 51 5.2.3 コンパイル時の式とコード ............................................................................ 51 5.2.4 実行時式 ................................................................................................. 52 5.2.5 実行時コード ............................................................................................. 53 5.2.6 実行時コード ObjectScript 単一行 ............................................................... 53 5.2.7 サーバ側メソッド ........................................................................................ 53 5.2.8 SQL <script> タグ ...................................................................................... 54 5.2.9 生成されたクラスの管理 .............................................................................. 54 5.3 コントロール・フロー ............................................................................................ 55 5.3.1 <csp:if> タグ .............................................................................................. 55 5.3.2 <csp:while> タグ ......................................................................................... 55 5.3.3 <csp:loop> タグ : 番号を割り当てたリストの例 ................................................. 56 5.4 HTTP 出力のエスケープと引用 ............................................................................ 56 5.4.1 EscapeHTML による HTML のエスケープ ...................................................... 56 5.4.2 EscapeURL による URL パラメータのエスケープ ............................................. 57 iv Caché Server Pages (CSP) の使用法 5.4.3 QuoteJS による JavaScript のエスケープ ........................................................ 57 5.5 サーバ側のメソッド .............................................................................................. 58 5.5.1 Caché と AJAX .......................................................................................... 58 5.5.2 HTTP 送信を経由したサーバ側メソッドの呼び出し .......................................... 58 5.5.3 ハイパーイベント #server および #call を使用したサーバ側メソッドの呼び出し ..... 59 5.5.4 サーバ側メソッドを使用するヒント .................................................................. 62 6 データベース・アプリケーションの構築 ............................................................................ 65 6.1 ページでのオブジェクトの使用 .............................................................................. 65 6.1.1 テーブルにオブジェクト・データを表示 ........................................................... 65 6.1.2 フォームでのオブジェクト・データの表示 ........................................................ 66 6.1.3 フォームの送信要求処理 ............................................................................ 67 6.1.4 <csp:object> タグ ....................................................................................... 67 6.2 フォームへのデータの結合 .................................................................................. 68 6.2.1 プロパティへの結合 .................................................................................... 69 6.3 <csp:search> タグを持つ CSP 検索ページ .............................................................. 70 6.4 ISCLOG でのログの有効化 .................................................................................. 72 6.4.1 メッセージ形式 .......................................................................................... 73 7 CSP アプリケーションにおけるテキストのローカライズ ........................................................ 75 7.1 メッセージ・ディクショナリ ...................................................................................... 76 7.1.1 メッセージ・ディクショナリの格納 .................................................................. 76 7.1.2 メッセージ・ディクショナリへのエントリの追加 ................................................... 77 7.2 XML メッセージ・ファイル ..................................................................................... 77 7.2.1 <MsgFile> 要素 ......................................................................................... 78 7.2.2 <MsgDomain> 要素 .................................................................................... 78 7.2.3 <Message> 要素 ........................................................................................ 78 7.3 タグを使用したファイルのローカライズ .................................................................... 79 7.3.1 実行時のローカライズ・タグ .......................................................................... 79 7.3.2 コンパイル時のローカライズ・タグ .................................................................. 80 7.4 クラス・コードからのローカライズ ............................................................................ 81 7.4.1 実行時のメッセージの取得 .......................................................................... 81 7.4.2 コンパイル時および実行時の $$$Text マクロ ................................................. 83 7.5 メッセージ・ディクショナリの翻訳 ............................................................................ 84 7.6 メッセージ・ディクショナリの管理 ............................................................................ 85 7.6.1 XML メッセージ・ファイルのインポート ............................................................ 85 7.6.2 XML メッセージ・ファイルのエクスポート ......................................................... 86 7.6.3 メッセージの削除 ....................................................................................... 87 7.6.4 メッセージのリスト ....................................................................................... 88 7.6.5 一致言語の検索 ........................................................................................ 88 8 カスタム・タグの開発 .................................................................................................... 89 8.1 ルールとアクション .............................................................................................. 89 8.2 タグ・マッチング — match 属性 .............................................................................. 91 8.3 ルール・アクション内のサーバ側の式とコード .......................................................... 91 8.3.1 アクションの実行時式 ................................................................................. 91 8.3.2 コンパイル時の式とアクション ....................................................................... 92 8.3.3 アクション内の <script> タグ ......................................................................... 92 8.4 サーバ・ドキュメント・オブジェクト・モデル ................................................................ 92 8.4.1 ルール属性値へのアクセス ......................................................................... 93 8.5 アクション内での <csr> タグの使用 ........................................................................ 94 8.5.1 <csr:default> タグ ....................................................................................... 94 Caché Server Pages (CSP) の使用法 v 8.5.2 <csr:children> タグ ..................................................................................... 94 8.5.3 <csr:section> タグ ...................................................................................... 94 8.6 アクション外での <csr> タグの使用 ........................................................................ 95 8.6.1 <csr:class> タグ ......................................................................................... 95 8.6.2 <csr:property> タグ .................................................................................... 95 8.6.3 <csr:description> タグ ................................................................................. 96 8.6.4 <csr:attribute> タグ .................................................................................... 96 8.7 ルール・クラスの使用 .......................................................................................... 97 8.7.1 生成されたルール・クラスの構造 ................................................................... 97 8.7.2 RenderStartTag メソッド ............................................................................... 98 8.7.3 CompilerMethod[n]() メソッド ........................................................................ 99 8.7.4 RenderEndTag メソッド ................................................................................ 99 8.8 %CSP.Rule メソッドの使用 ................................................................................... 100 8.8.1 GetAttribute メソッド ................................................................................. 100 8.8.2 QuoteAttribute メソッド .............................................................................. 100 8.8.3 GetAttributesOrdered メソッド .................................................................... 101 8.8.4 IsDefined メソッド ...................................................................................... 101 8.8.5 InnerText メソッド ..................................................................................... 101 8.8.6 AddChildElement メソッド ........................................................................... 101 8.8.7 SetAttribute メソッド .................................................................................. 101 8.8.8 OnMatch メソッド ...................................................................................... 102 8.9 <csr> %CSP.AbstractAtom Write メソッドの使用 ..................................................... 102 8.9.1 WriteText メソッド ..................................................................................... 103 8.9.2 WriteCSPText メソッド ............................................................................... 103 8.9.3 WriteExpressionText メソッド ...................................................................... 103 8.9.4 WriteServer メソッド .................................................................................. 103 8.9.5 WriteCSPServer メソッド ............................................................................ 104 8.10 <csr> %cspQuote メソッドの使用 ......................................................................... 104 8.10.1 Quote メソッド ........................................................................................ 104 8.10.2 QuoteCSP メソッド ................................................................................... 104 8.11 テーブルを表示する <grid> タグの作成 ............................................................. 105 8.11.1 Grid ルール定義 .................................................................................... 105 8.11.2 生成された Grid クラス ............................................................................ 105 8.11.3 グリッド・ルールの使用 ............................................................................. 106 8.11.4 グリッド・ルール表示ページ ...................................................................... 107 付録A:CSP エラーの注釈 .............................................................................................. 109 付録B:CSP に関するよくある質問 ................................................................................... 115 vi Caché Server Pages (CSP) の使用法 図一覧 図 2–1: CSP コンポーネント .............................................................................................. 9 図 3–1: CSP アーキテクチャ ............................................................................................ 21 図 3–2: HTTP イベント・フロー ......................................................................................... 22 Caché Server Pages (CSP) の使用法 vii テーブル一覧 テーブル テーブル テーブル テーブル テーブル テーブル テーブル テーブル テーブル 2–1: Web アプリケーションの設定の編集 — [一般] タブ .......................................... 16 3–1: URL の構成要素 ...................................................................................... 24 4–1: CSP の予約パラメータ ................................................................................ 33 6–1: cspbind 属性の効果 .................................................................................. 69 6–2: cspbind がサポートする HTML 入力要素 ...................................................... 70 6–3: <csp:search> タグの属性 ............................................................................ 70 6–4: ISCLOG のフィールド ................................................................................ 72 8–1: タグ・マッチングの例 .................................................................................. 91 I–1: CSP エラー・コード、エラー・メッセージ、およびエラー発生条件 ....................... 109 viii Caché Server Pages (CSP) の使用法 このドキュメントについて このドキュメントは、Web アプリケーション開発者を対象としています。 このドキュメントでは、Caché Server Pages (CSP) の作成方法について説明します。 以下の章で構成されています。 • Caché Server Pages の概要 • CSP アーキテクチャ • HTTP 要求 • CSP セッション管理 • CSP におけるタグを使用した開発 • データベース・アプリケーションの構築 • CSP アプリケーションにおけるテキストのローカライズ • カスタム・タグの開発 付録は、以下のとおりです。 • CSP エラーの注釈 • CSP に関するよくある質問 詳細な目次があります。 Caché Server Pages (CSP) の使用法 1 1 Caché Server Pages 入門 Caché Server Pages (CSP) は、インタラクティブな CSP アプリケーションを作成するために使用するアーキテクチャおよ びツールセットです。CSP テクノロジは、高性能で拡張性の高い Web アプリケーションの構築、展開を実現します。CSP では、通常 Caché データベースのデータを使用して、Web ページの動的な生成が可能です。“動的” とは、同じペー ジであっても、最近変更されたデータ・ソースから要求があるたびに異なるコンテンツが表示されることを意味します。 CSP は、さまざまな用途に使用できます。以下の機能があります。 • 常に変化する在庫データを表示します。 • 何千ものアクティブ・ユーザがいる Web コミュニティをサポートします。 • Caché データベースに保存されたユーザ情報を基にページをパーソナライズします。 • それぞれのユーザの要求やそのセキュリティ許可に応じて、個々のユーザ・データを基にページをカスタマイズしま す。 • HTML、XML、画像などのバイナリ・データやテキスト・データを提供します。 • 高性能な Caché データベースと連携しているため、高速処理を実現します。 CSP は、データベース・アプリケーションに最適です。組み込みの Caché データベースへの高速アクセスに加え、以下 に示す、Web ベースのデータベース・アプリケーションに必要なさまざまな機能を提供します。 • セッション管理 • ページ認証 • Web ページからのインタラクティブなデータベース処理の実行 CSP は、2 種類の Web 開発方法をサポートします。 • クラスを使用してアプリケーションを開発するために、CSP には、オブジェクト・フレームワークが用意されています。 • HTML ファイルを使用してアプリケーションを開発します。CSP に用意されている HTML ベースのマークアップ言 語を使用して Web ページにオブジェクトやサーバ側のスクリプトを記述できます。アプリケーションでこれらのテク ニックを組み合わせて使用すると、その柔軟性を最大限に活用した開発を行うことができます。 Caché Server Pages (CSP) の使用法 3 Caché Server Pages 入門 1.1 CSP および Zen Zen は、Caché および Ensemble に含まれている、データが豊富な Web アプリケーションを迅速に作成するためのアプ リケーション・フレームワークです。新しい Web ベース・アプリケーションを構築する場合、または既存の CSP ベース・ア プリケーションを強化する場合は、"Zen の使用法" の "Zen フレームワーク" を参照してください。 注釈 Zen をベースとしたアプリケーションを実行するには、[静的ファイルの提供] オプションを有効にし、Web サー バを適切に構成することが必要です。詳細は、このドキュメントの "静的ファイル" のセクションを参照してくださ い。 1.2 はじめに このドキュメントでは、Web サーバと Caché がインストールされていることを前提にしています。このセクションでは、CSP アプリケーションの作成に着手するために必要な点について説明します。 1.2.1 プロダクション Web サーバおよび Caché 付属のプライベート Web サーバ Caché には、管理ポータルを実行する最小限の構成の Web サーバが付属しており、プライベート Web サーバと呼ば れます。プライベート Web サーバでは、付属の CSP サンプルを表示したり、CSP ページを実行したりできます。プロダ クション環境では、このサーバを使用して本格的な CSP アプリケーションを実行することはできません。この目的のため には、サポート対象の Web サーバをインストールして、独立した完全なサーバ環境を構築する必要があります。このよう なサーバとして、Apache Web サーバ、Microsoft IIS Web サーバ、Sun Web サーバなどがあります。 プライベート Web サーバは、Apache Web サーバの最小ビルドをベースにしています。また、非標準の TCP ポートで待 ち受けるように構成されています。このポートは既定では 57772 です (一般的には、既知の HTTP サーバ・ポート 80 が 使用されますが、このサーバの場合は異なります)。同じホストで動作する他の Web サーバ・インストール環境に、プライ ベート Web サーバが影響を及ぼすことはありません。 プライベート Web サーバは、OpenVMS には提供されていません。 プライベート Web サーバは、OpenVMS には提供されていません。Caché の OpenVMS インスタンスの CSP ページに アクセスするには、外部 Web サーバを構成する必要があります。Web サーバの構成に (そのオプションを選択すること によって) Caché インストーラを使用しない場合は、外部 Web サーバを手動で構成する必要があります。詳細は、"CSP ゲートウェイ構成ガイド" の “OpenVMS でのインストール (すべての接続オプション)” のセクションの手順 5 を参照して ください。 OpenVMS システムの管理ポータルにアクセスするために、別のオペレーティング・システム上の Web サーバを使用し ている場合、この外部 Web サーバは、CSP ゲートウェイを経由して静的ファイルを処理するように構成する必要がありま す。詳細は、"CSP ゲートウェイ構成ガイド" を参照し、関連するオペレーティング・システムおよびオプションについて “CSP へのファイルの種類の追加登録” というセクションを探してください。 1.2.2 Web サーバと CSP ゲートウェイの構成 Caché インストールには、一般的な Web サーバとオペレーティング・システムに対応する Web サーバ構成および CSP ゲートウェイ構成を実行するスクリプトが含まれています。 ほとんどの場合、Caché の手順に従って Caché をインストールし、サポート対象の Web サーバの通常の構成をインス トールすれば、CSP ゲートウェイで稼動するシステムが実現します。 4 Caché Server Pages (CSP) の使用法 はじめに ただし、Web サーバ・アーキテクチャが非標準の場合や、現在の環境でのさらなるパフォーマンス向上を望む上級ユー ザの場合は、"CSP ゲートウェイ構成ガイド" を参照してください。ここでは、Caché に接続するための、Web サーバと CSP ゲートウェイの構成手順について詳しく説明します。 Web サーバと CSP ゲートウェイを設定して、リモート Caché サーバにインストールされた CSP アプリケーションにアクセ スするには、"CSP ゲートウェイ構成ガイド" の “リモート Web サーバでの Caché Server Pages の使用” の章を参照し てください。 注釈 実行時エラーを回避するために、CSP 上で実行している高可用性構成では、スティッキー・セッションのサポー トを有効にしたハードウェア・ロード・バランサを使用することをお勧めします。詳細は、"Caché 高可用性ガイド" の “CSP ゲートウェイの考慮事項” のセクションを参照してください。 1.2.3 必要な事前知識 CSP を効率よく使用するためには、以下の知識が必要です。 • Caché オブジェクトおよび Caché ObjectScript • HTML • JavaScript • SQL HTML や JavaScript については、以下の文献等を参照してください。 • HTML v4.0.1 仕様 • HTML & XHTML: The Definitive Guide (O’Reilly 刊) • JavaScript: The Definitive Guide (O’Reilly 刊) 1.2.4 CSP サンプル Caché には、CSP ページのサンプルが用意されています。以下の手順で、これらのサンプルを表示できます。 1. Caché を起動します。 2. CSP サンプルを表示するには、使用しているマシン上で Web サーバが稼動していることを確認します。 3. ブラウザを起動し、プライベート Web サーバ (http://localhost:57772/csp/samples/menu.csp) または外部 Web サーバ (http://localhost/csp/samples/menu.csp) を使用して CSP の [サンプル] メニューに移動します。 4. 通常のまたはロックされたセキュリティ機能で Caché をインストールした場合、ログイン・ページが表示される場合が あります。その場合はログインします。 5. Caché は、それぞれの短い説明と共にサンプル CSP ページのリストを表示します。目的のページをクリックします。 1.2.5 CSP ドキュメント CSP に関するドキュメントは、以下のとおりです。 • "Caché Server Pages の使用法" では、CSP ページの作成方法について説明します。 • ZEN の使用法では、事前に作成したページ・オブジェクトを使用して、さらに迅速な Web アプリケーション開発を行 うために CSP の上位で動作するパッケージである Zen の使用法について説明します。Zen のドキュメントには、Zen コンポーネントの使用法、Zen アプリケーションの開発、および Zen レポートの使用法があります。 • CSP HTML タグ・リファレンス は、すべての CSP タグのリファレンスです。 Caché Server Pages (CSP) の使用法 5 Caché Server Pages 入門 • CSP の [サンプル] メニューには、CSP ページのサンプルが数多く示されています。 • "Caché Server Pages クイックスタート・チュートリアル" は、CSP の入門チュートリアルです。 • CSP Web アプリケーション・チュートリアル は詳細なチュートリアルです。 • 以下のクラスのクラス・リファレンス情報 : — %CSP.Page — %CSP.Session CSP をセットアップまたは構成するには、以下を参照してください。 • CSP ゲートウェイの構成に関するオンライン・ヘルプである CSP Web ゲートウェイのドキュメント は、管理ポータル から CSP ウェブゲートウェイ管理ページで利用できます。 [システム] > [構成] ページに移動し、[CSP ゲートウェイ管理]→[進む]→[ヘルプ] の順にクリックします。既定では、 この操作でプライベート Web サーバにアクセスできます。使用しているプロダクション Web サーバの CSP ウェブ ゲートウェイ管理ページを表示するには、例えば、以下の URL で localhost または localhost:<port_no> を localhost:57772 に置き換えます。 http://localhost/csp/bin/Systems/Module.cxw • CSP ゲートウェイ構成ガイド:Caché をインストールすると、CSP ゲートウェイが自動的にインストールされ、ほとんど のサイトで動作します。CSP ゲートウェイを手動で構成する必要がある場合は、詳細構成ガイドを使用します。 1.3 初めての CSP ページの生成 このセクションでは、2 とおりの異なる方法で Hello, World という CSP ページを生成する方法を説明します。 • Web ページ・オブジェクトによるクラス・ベースの CSP ページの作成 • マークアップ HTML ファイルを使用した HTML ベースの CSP ページの作成 1.3.1 クラス・ベースの CSP ページの作成 %CSP.Page のサブクラスを生成して、その OnPage メソッドをオーバーライドすることで、CSP ページを生成します。この メソッドによって主デバイスに出力された内容はすべて、自動的に Web ブラウザに送信され、Web ページとして表示さ れます。 プログラミングで Hello World CSP ページを生成するには、以下の手順を実行します。 1. Caché スタジオを起動します。 2. [ファイル]→[プロジェクトの新規作成] を選択して、ローカル・データベースの USER ネームスペースに新規プロジェ クトを作成します。 3. [ファイル]→[新規作成]→[Caché クラス定義] を選択します。 4. ウィザードの最初のページで、パッケージ名に「Test」、クラス名に「Hello」と入力します。 5. 次のページで、クラス・タイプに CSP を選択します。 6. [完了] をクリックします。スタジオのクラス・エディタに CSP の新しいクラス定義が表示されます。 6 Caché Server Pages (CSP) の使用法 初めての CSP ページの生成 Class Test.Hello Extends %CSP.Page [ ProcedureBlock ] { ClassMethod OnPage() As %Status { &html<<html> <head> </head> <body>> ;To do... &html<</body> </html>> Quit $$$OK } } 7. OnPage メソッドで以下のようにコメントを置き換えます。 ; To do... Write 文を使用して、以下のように記述します。 Write "<b>Hello, World</b>",! 8. [ビルド]→[コンパイル] を使用して、新しいクラスを保存しコンパイルします。 9. [ビュー]→[ブラウザで表示] を選択します。 ブラウザに Hello, World と表示されます。 この CSP ページは、CSP アプリケーションでもあり、以下のように動作します。 1. ブラウザは、指定されたネームスペースのローカル Web サーバに Test.Hello.cls という要求を送信します。 2. Web サーバはこの要求を CSP ゲートウェイに渡し、CSP ゲートウェイはこの要求を Caché CSP サーバに渡します。 この例では、ブラウザ、Web サーバ、Caché アプリケーション・サーバは、すべて同じマシン上で動作していますが、 実際の環境では、異なるマシンで動作していることもあります。 3. CSP サーバでは Test.Hello というクラスを探し出し、その OnPage メソッドを呼び出します。 4. OnPage メソッドが Write コマンドを使用して主デバイスに書き込む出力は、すべて CSP ゲートウェイと Web サー バ経由でブラウザに返送されます。 以上が、CSP の基本的な動作です。他の機能は、これらの動作に基づいて構築されます。 以下は、コードの追加例です。以下の行を、Hello, World の行の後に挿入します。 Write "<ul>",! For i = 1:1:10 { Write "<LI> This is item ", i,! } Write "</ul>",! これにより、このページには、10 項目の箇条書きのリストが生成されます。このコンテキストでは、Caché は感嘆符 (!) 文 字を使用して、主デバイスにキャリッジ・リターンを指定します。 1.3.2 HTML タグを使用した CSP ページの作成 CSP ページを生成するには、HTML ファイルを生成して、CSP コンパイラでこのファイルを CSP クラスに変換する方法 もあります。 HTML ファイルを使用して Hello,World ページを生成するには、以下の手順を実行します。 1. Caché スタジオを起動して、[ファイル]→[新規作成]→[CSP ファイル]→[Caché Server Page] を選択します。 2. 新規 CSP ファイルの内容を以下と置換します。 Caché Server Pages (CSP) の使用法 7 Caché Server Pages 入門 <html> <body> <b>Hello, World!</b> </body> </html> 3. [ファイル]→[保存] を選択します。 4. 表示された [名前を付けて保存] ウィンドウで、既定の CSP アプリケーション csp/usr をダブルクリックします。 5. ファイル名 Hello.csp を入力し、[名前を付けて保存] をクリックしてファイルを保存します。 6. スタジオのウィンドウで、[表示]→[ウェブページ] を選択します。 前述の例と同様に、ブラウザに Hello, World! が表示されます。 CSP アプリケーションは単一もしくは一連の CSP ページから構成されます。CSP アプリケーションはユニットとして動作 し、その際にアプリケーション全体に適用する設定を使用します。システムは既定の CSP アプリケーションとして、csp/user を提供します。CSP アプリケーションの詳細は、このドキュメントの “CSP アプリケーションの設定” のセクションを参照し てください。 テキスト・エディタまたは HTML エディタを使用して、HTML ファイルを作成することもできます。このファイルを、ローカ ル・ディレクトリ cachesys/csp/user に Hello.csp として保存します (cachesys は Caché のインストール場所です)。 Hello.csp ページは次のように動作します。 1. ブラウザは、ローカル Web サーバに Hello.csp という要求を送信します。 2. Web サーバはこの要求を CSP ゲートウェイ (Web サーバに接続されている) に渡し、CSP ゲートウェイはこの要求 を Caché CSP サーバに渡します。 3. Caché CSP サーバは Hello.csp ファイルを検索し、CSP コンパイラに渡します。 4. CSP コンパイラでは、Hello.csp ファイルのコンテンツを出力する OnPage メソッドを含む csp.Hello という新しいクラ スを作成します (実際には、OnPage メソッドから呼ばれる一連のメソッドも生成されます)。コンパイルのこの手順は、 生成されたクラスよりも .csp ファイルの方が新しい場合にのみ実行されます。その後の要求は、生成されたクラスに 直接送信されます。 5. CSP サーバは、新規に生成された OnPage メソッドを呼び出し、その出力を前述の例と同様にブラウザに送信しま す。 プログラミングによる開発の例と同様、この例は、わかりやすく簡単に説明しています。実際には、CSP コンパイラは専用 の XML/HTML 処理エンジンであり、以下を実行できます。 • HTML ページのサーバ側のスクリプトや式を処理します。 • 特定の HTML タグが認識されたとき、サーバ側のアクションを実行します。 プログラムの例と同様、プログラミング・ロジックを追加することで、さらに複雑なページを構築できます。例えば以下のよ うになります。 <html> <body> <b>Hello, World!</b> <script language="Cache" runat="server"> // this code is executed on the server Write "<ul>",! For i = 1:1:10 { Write "<li> This is item ", i,! } Write "</ul>",! </script> </body> </html> プログラムの例と同様、このページには、10 項目の箇条書きのリストが表示されます。 8 Caché Server Pages (CSP) の使用法 2 CSP アーキテクチャ この章では、以下の項目について説明します。 • CSP の主な “コンポーネント” • サポート対象 Web サーバで CSP を使用するための “Web サーバ構成” • Caché サーバと通信するための “CSP ゲートウェイ構成” • “CSP アプリケーションのオプション” ご使用の Web サーバにおける CSP ゲートウェイのインストールと構成についての詳細は、"CSP ゲートウェイ構成ガイ ド" を参照してください。 2.1 CSP コンポーネント : Web サーバ、CSP ゲートウェイ、CSP サーバ CSP は、Web サーバ、CSP ゲートウェイ、CSP サーバ (Caché サーバ上で動作) という 3 つのソフトウェア・コンポーネン トを使用します。 図 2–1: CSP コンポーネント Caché Server Pages (CSP) の使用法 9 CSP アーキテクチャ Web サーバと CSP サーバは、1 台または複数のコンピュータで実装できます。開発時には、これら 3 つのコンポーネン ト (Web サーバ、CSP ゲートウェイ、および CSP サーバ) をすべて単一のコンピュータ上に置くことができます。大規模 な配置の場合、2 層あるいは 3 層に構成された複数の Web サーバや CSP サーバを置くこともできます。 このドキュメントでは、これらのコンポーネント (Web サーバ、CSP ゲートウェイ、および CSP サーバ) はそれぞれ 1 つあ るものと見なします。XML ページなど HTML 以外のテキスト形式やイメージなどのバイナリ形式も CSP で扱うことがで きますが、ここでは、HTML ページのみを扱うものとして CSP を説明します。 2.1.1 各コンポーネントの機能 Web サーバは、以下を実行するソフトウェア・ユーティリティです。 • 通常はブラウザからの、着信 HTTP 要求の受け入れ • アクセス権の確認 • 静的コンテンツの処理 • CSP ゲートウェイへの CSP コンテンツ (末尾に .csp または .cls が使用されている URL) の要求の送信 CSP ゲートウェイは共有ライブラリ、.dll ファイル、または CGI スクリプトです。その機能は次のとおりです。 • 要求の送信先の Caché サーバの指定 • 適切な Caché サーバへの要求の送信 • Caché サーバとの接続の維持 (これにより、新しい接続を連続して開く必要性を排除) CSP サーバは、CSP ゲートウェイからの要求を処理する Caché サーバ上で作動するプロセスです。その機能は次のと おりです。 • アプリケーションに対する HTTP 要求の受信 • 管理ポータルで設定され、.cpf ファイルに保存されたアプリケーション構成設定の確認。 • 関連付けられたクラス (直接記述されたもの、または CSP ページから生成されたもの) の実行。これにより、CSP ゲー トウェイに HTML が返送され、CSP ゲートウェイから Web サーバ経由でブラウザに HTML が送信されます。 2.1.2 情報フロー CSP 要求は、標準的な Web サーバ (主なサーバはすべてサポートしています) と標準 HTTP プロトコルによって処理 されます。CSP は Web サーバと Caché 間の通信を管理し、ページを生成するための各アプリケーション・コードを呼び 出します。要求およびリターンのプロセスは以下のとおりです。 1. HTTP クライアント (通常は Web ブラウザ) は、HTTP プロトコルを使用して Web サーバにページを要求します。 2. Web サーバはこれを CSP 要求と認識し、高速なサーバ API を使用して CSP ゲートウェイに転送します。 3. CSP ゲートウェイはどの Caché サーバと通信するかを判断し、その目的のシステムにある CSP サーバに要求を転 送します。 4. Caché で動作している CSP サーバは、要求を処理して CSP ゲートウェイに目的のページを返し、CSP ゲートウェイ はそれを Web サーバに渡し返します。 5. Web サーバは、表示するブラウザにこのページを送信します。 10 Caché Server Pages (CSP) の使用法 URL の Web サーバ構成 2.1.3 静的ファイル すべての CSP は、Caché サーバが処理します。Web アプリケーションで使用するあらゆる種類の静的ファイルは、CSP ゲートウェイを経由して Caché データベース・サーバで扱うことができます。標準の Web アプリケーションの場合、静的 コンテンツを扱うサーバはデータベース・サーバではなく、Web サーバであることが普通です。Caché で Zen アプリケー ションを実行するには、Caché サーバにあるすべての静的コンテンツを CSP ゲートウェイ経由で扱うように Web サーバ を構成する必要があります。 注釈 Zen をベースとしたアプリケーションを実行するには、[静的ファイルの提供] オプションを有効にし、Caché サー バで静的ファイルを扱うことができるように Web サーバを適切に構成することが必要です。Zen フレームワーク では、[静的ファイルの提供] オプションが有効で適切に機能していて、依存イメージや JavaScript ヘルパーの ドキュメントを取得できることが必要です。 この機能には 2 つの要素があります。その 1 つは、指定された CSP アプリケーションの [静的ファイルの提供] オプショ ン設定です。これは、有効 ([常時]) または無効 ([なし]) に設定できます。また、別の設定によって、CSP ゲートウェイか ら Web サーバに静的ファイルをキャッシュできるようにすることも可能です ([常時かつキャッシュ] に設定すると、再度 Caché サーバからファイルを取得しなくても静的ページの要求を処理できるので効率向上が望めます)。詳細は、“CSP アプリケーションのオプション” テーブルの "[静的ファイルの提供] オプション" を参照してください。 もう 1 つの要素では、Caché サーバで静的ファイルを扱うことができるように Web サーバを構成します。 インターシステムズが既定で提供するインストール・スクリプトでは、外部 Web サーバの検索も構成もできません。カスタ ム・インストールを実行する場合は、CSP サポートが有効になるように、インストール済みの IIS または Apache Web サー バを構成することもできます。インストール・スクリプトは、/csp 仮想ディレクトリを作成し、ゲートウェイで扱う .csp、.cls、.zen、 および .cxw の各拡張子のマッピングを作成します。その Web サーバを介して CSP が正常に機能するためには、これ で十分ですが、[ファイルの提供] 機能のサポートは有効になりません。この機能を有効にするには、ゲートウェイ経由で .* 拡張子を扱うためのマッピングをこの拡張子に適用するように Apache または IIS を手動で構成する必要があります。 これは、このメカニズムを介してデータベース・サーバが公開されるようにデータベース・サーバを開くとセキュリティ上の リスクが発生するので、この機能が自動的には有効にならないように設計されているためです。 Web サーバに関する手順の詳細は、"CSP ゲートウェイ構成ガイド" の “CSP へのファイルの種類の追加登録” のセク ションを参照してください。 Web サーバからの静的ページを処理する従来の構成を使用するよう選択することもできます。例えば、既に Web アプ リケーションがこのように設定されている場合などです。この場合、[静的ファイル] オプションの設定は無関係です。これ により、共通の Web サーバで 2 つの異なるバージョンの Caché を扱っている場合に、それぞれの Caché で異なるバー ジョンの特定の静的ファイル (例えば、ハイパーイベントのブローカ・コンポーネント) の要求があった場合の競合を排除 できます。 Web サーバ自体を静的ファイルを処理するように構成した場合、その静的コンテンツが各 Web サーバに存在すること を確認してください。 2.2 URL の Web サーバ構成 Caché には、CSP アプリケーションを実行する既定の仮想ディレクトリ /csp が用意されています。また、Caché の複数の インスタンスを実行している場合に使用するための既定の仮想ディレクトリ /cacheinstance/csp も用意されています。 Caché の複数のインスタンスを実行しており、前に /cacheinstance のない仮想ディレクトリ /csp を使用して CSP アプ リケーションにアクセスする場合、インストールされている最新のバージョンの Caché にアクセスされます。 http://localhost/csp または http//localhost/cacheinstance/csp で始まるアプリケーション・パスを使用して、すべて の CSP アプリケーションを呼び出せるようにする場合は、Web サーバ構成を変更する必要はありません。 Caché Server Pages (CSP) の使用法 11 CSP アーキテクチャ /csp または /cacheinstance/csp で始まらないアプリケーション・パスを持つ CSP アプリケーションを作成する場合は、 Web サーバ構成ファイルのエントリ alias /csp で変更を加える必要があります。 以下のテーブルは、変更が必要な構成ファイルを示します。 Web サーバ 構成ファイル Apache、HP Secure Web Server UNIX® : /etc/httpd/conf/httpd.conf Windows : <web-server-install-directory>\conf\httpd.conf OpenVMS : <web-server-install-directory>\CONF\HTTPD.CONF Sun config/obj.conf および config/magnus.conf Microsoft IIS “Microsoft IIS Web サーバでの新規 URL の構成” で説明する仮想ディレクトリを定義します。 以下のテーブルに、Web サーバと Caché インスタンスの組み合わせを使用して CSP ページにアクセスする例を示しま す。 URL Web サーバ インスタンス http://localhost/cache20071/csp/samples/menu.csp パブリック cache20071 http://localhost/cache52/csp/samples/menu.csp パブリック cache52 http://localhost/csp/samples/menu.csp パブリック インストールされている 最新のバージョンの Caché http://localhost:57772/csp/sys/UtilHome.csp プライベート — 管理ポー タルおよびオンライン・ド キュメントへのアクセス に使用 Web サーバのポート 57772 を使用してインス トールした Caché の バージョン 注釈 CSP は、大文字と小文字を区別します。CSPを構成している場合、整合性を確保しながらパス名を指定してく ださい。 2.2.1 Microsoft IIS Web サーバでの新規 URL の構成 Microsoft IIS は、一連の仮想ディレクトリの定義によって構成されます。各仮想ディレクトリは、URL のディレクトリ部分に 対応する名前、物理ディレクトリ (Web サーバから静的ファイルを処理するよう選択した場合、.html ファイルや .jpg ファ イルなどの静的ファイルが保存されているローカル・ディレクトリ)、および一連のアクセス権 (read や execute など) から 構成されています。 CSP コンテンツに対する任意の要求 (URL) には、ディレクトリ名が含まれます。このディレクトリ名は、Web サーバによっ て定義された仮想ディレクトリ、もしくは仮想ディレクトリのサブディレクトリと一致する必要があります。この仮想ディレクト リは少なくとも、処理する CSP コンテンツに定義された read 特権 と execute 特権を持つ必要があります。 Web サーバから静的ファイルを処理するよう選択した場合、Web サーバは、仮想ディレクトリに定義されている物理ディ レクトリ内の静的ファイル (.html や .jpg など) を検索します。Web サーバも Caché サーバも物理ディレクトリ内の .csp ファイルを検索しません。.csp ファイルは、Caché サーバが稼動しているマシンに保存されます。アプリケーションの開発 段階で推奨されているように Web サーバと Caché サーバを同じマシン上で実行していると、両方のサーバは、静的コ ンテンツと .csp ファイルを同じ場所で同時に検索する場合があります — そのため、Caché サーバは、インストール中に それ自体およびローカル Web サーバを次のように構成します。 12 Caché Server Pages (CSP) の使用法 CSP ゲートウェイ構成 インストール時に、Caché は IIS サーバが実行中であるかどうかを検知し、/csp という仮想ディレクトリを定義するように IIS サーバを構成しようとします。このようにして、/csp/samples と /csp/user (/csp のサブディレクトリ) の両方に対する 要求が、ローカル Caché のインストール環境に送信されます。 CSP アプリケーションを新規に追加する場合、そのアプリケーションの URL パスが /csp で始まっていれば、IIS 構成を 行う必要はありません。例えば、/csp/myapp は /csp に対して定義された IIS 仮想ディレクトリを使用します。アプリケー ション・パスを /csp で開始しない場合は、使用するアプリケーション・パスに対応する新規の IIS 仮想ディレクトリを定義 する必要があります。 例えば、/myapp という URL パスを使用する CSP アプリケーションを定義するには、以下を実行します。 1. IIS マネージャを起動します (注:Windows のバージョンによって、起動方法が異なります。一般的には、Windows のコントロール・パネルから実行します)。 2. [既定の Web サイト] を右クリックし、[新規作成]、[仮想ディレクトリ] の順に選択することにより、仮想ディレクトリ /myapp を定義します。 この操作の例は、"CSP ゲートウェイ構成ガイド" の “IIS への仮想ディレクトリの追加” のセクションを参照してくだ さい。 3. このディレクトリに対する read と execute の権限を許可します。 4. Web サーバで静的コンテンツを処理する場合は、静的コンテンツを保存する物理ディレクトリを指定します。 上記以外に、以下のセクションで説明する CSP ゲートウェイ構成や CSP サーバ構成を行う必要があります。 2.3 CSP ゲートウェイ構成 CSP ゲートウェイは、Web サーバによってインストール、ロードされた DLL、または共有ライブラリです。CSP ゲートウェイ は、.csp や .cls ファイルに対する要求を検出し、その要求を定義された Caché サーバで処理するために送信します。 2.3.1 CSP ゲートウェイ・マネージャ CSP ゲートウェイは、CSP ゲートウェイ・マネージャ (CSP ウェブゲートウェイ管理ぺージ) を使用するか、またはその構成 ファイル csp.ini を直接編集することにより、構成できます。 CSP ゲートウェイ・マネージャは、ブラウザから使用できる小規模な Web アプリケーションです。CSP ゲートウェイ・マネー ジャにアクセスするには、[システム] > [構成] ページで [CSPゲートウェイ管理] をクリックします。既定では、この操作で アクセスできる CSP ゲートウェイ・マネージャは、プライベート Web サーバのものです。 プロダクション Web サーバの CSP ゲートウェイ・マネージャにアクセスするには、URL の localhost または localhost:<port_no> を必要に応じて変更します。 CSP ゲートウェイの構成に関する情報は、[システム] > [構成] から [CSPゲートウェイ管理]→[進む] をクリックして表示 される CSP ウェブゲートウェイ管理ページの [ヘルプ] ボタンから参照できます。詳細は、"CSP ゲートウェイ構成ガイド" を参照してください。 注釈 CSP ウェブゲートウェイ管理ページのローカライズは、インストールされた CSPres.xml があれば、この内容の みに基づきます。ローカライズ・ファイルが存在しない場合、CSP ウェブゲートウェイ管理ページでは、埋め込 み英語テキストを使用するよう既定が設定されます。ブラウザの言語設定はこのメカニズムに影響しません。 Caché Server Pages (CSP) の使用法 13 CSP アーキテクチャ 2.3.2 サーバ・アクセスの定義 注釈 実行時エラーを回避するために、CSP 上で実行している高可用性構成では、スティッキー・セッションのサポー トを有効にしたハードウェア・ロード・バランサを使用することをお勧めします。詳細は、"Caché 高可用性ガイド" の “CSP ゲートウェイの考慮事項” のセクションを参照してください。 この CSP ゲートウェイがアクセス可能なサーバ (CSP アプリケーションを実行する Caché または Ensemble サーバ) のリ ストを定義できます。各サーバは論理名、TCP/IP アドレス、TCP/IP ポート番号 (既定値は 1972)、および有効または無 効のフラグを持ちます。また、タイムアウト、ログ値、およびこのサーバへの接続の最大数と最小数も構成できます。 それぞれのサーバが論理名を持つことにより、CSP ゲートウェイはアプリケーションを特定のサーバに容易に接続できま す。また、サーバを使用する各アプリケーションの構成を 1 つずつ構成し直さなくても、後から 1 ヶ所でサーバの特性を 変更できます。 初期インストール後に、CSP ゲートウェイには LOCAL と定義された論理サーバが 1 つあります。これは、Caché のロー カル・コピーに接続するために定義されたものです。 CSP ゲートウェイがアクセスできるサーバを追加するには、前のセクションでの説明に従って CSP ゲートウェイ・マネー ジャを起動し、[サーバ接続] をクリックします。この手順の詳細は、"CSP ゲートウェイ構成ガイド" の “複数の Caché サーバ上の CSP へのアクセス” のセクションを参照してください。 CSP.ini ファイルの既定の LOCAL サーバの例 : LOCAL=Enabled ... [LOCAL] Ip_Address=127.0.0.1 TCP_Port=1972 Minimum_Server_Connections=3 2.3.3 アプリケーション・アクセスの定義 注釈 Caché インストールにより、新しい /csp 構成が作成されます。/csp をアプリケーションとして構成した場合、 Caché の新しいビルドをインストールすると、その構成は上書きされます。アプリケーション構成を維持するに は、/csp 以外のパスを入力します。 /csp/myapplication のように /csp にあるディレクトリであればどれでもかまいませんが、パスの指定にドット (ピ リオド) は使用できません。ドットを使用すると、CSP ゲートウェイであいまいさが発生しま す。/csp/samples/menu.csp/csp/aaa/bbb/ccc.cls を例として考えると、CSP ゲートウェイでは、これを /csp/samples/menu.csp/csp/aaa/bbb/ccc.cls への要求とも、/csp/samples/menu.csp への REST 要求 (こ の場合、/csp/aaa/bbb/ccc.cls が PATH_INFO) とも解釈できます。Web サーバ環境で動作しているゲート ウェイには、このようなあいまいさを解決する手段がありません。 CSP は、大文字と小文字を区別します。CSPを構成している場合、整合性を確保しながらパス名を指定してく ださい。 CSP アプリケーションとは、指定された URL で表された、一連のページやクラスです。例えば、すべての CSP サンプル・ ページは、/csp/samples アプリケーションの一部です。アプリケーションには、/csp/samples/cinema のようなサブディ レクトリが含まれます。 CSP ゲートウェイ・マネージャを使用すると、CSP アプリケーションが Caché サーバに接続するために使用する URL パ スを定義できます。CSP は特定の URL ディレクトリ (または、そのサブディレクトリ) 内のすべてのファイルを同じアプリ ケーションの一部と見なします。 既定では、CSP ゲートウェイは単一のアプリケーション・パス /csp を定義し、すべての CSP 要求を論理サーバ LOCAL に送信します。/csp/samples と /csp/user に対する要求が、ローカル Caché インストールに送信されます。 14 Caché Server Pages (CSP) の使用法 CSP アプリケーションの設定 /csp で始まる URL を持つ新規 CSP アプリケーションを作成する場合は、CSP ゲートウェイ構成を変更する必要はあり ません。/csp/myapp などの新規アプリケーションは /csp に対して定義された CSP アプリケーション設定を使用します。 URL パスを /csp で開始しない場合は、独自の URL パスに対応する新規の CSP アプリケーションを CSP ゲートウェイ 内に定義する必要があります。 例えば、/myapp という URL パスで始まる CSP アプリケーションを定義するには、以下を実行します。 1. 管理ポータルの [システム] > [構成] ページから [CSPゲートウェイ管理] をクリックして、CSP ゲートウェイ・マネー ジャを開きます。 2. [アプリケーション・アクセス] を選択します。 3. [アプリケーション追加] をクリックします。 4. [アプリケーションパス] フィールドに、/myapp と入力します。 5. [デフォルトサーバ] を選択します。アプリケーションはリストから選択します (これらは“サーバ・アクセスの定義” セ クションに定義されています)。 6. [実行] をクリックして、/myapp アプリケーション・アクセス情報を保存します。 [アプリケーションアクセス] ページの他のフィールドの詳細は、[ヘルプ] をクリックしてください。 2.3.4 CSP ゲートウェイ・パラメータ CSP ゲートウェイには、調整できるパラメータがあります。タイムアウト値、フェイルオーバー、ロード・バランシング特性、 CGI 環境変数などです。 これらのパラメータの詳細は、"CSP ゲートウェイ構成ガイド" の “動作と構成” の章を参照するか、CSPウェブゲートウェ イ管理ページの [ヘルプ] をクリックします。 2.4 CSP アプリケーションの設定 CSP サーバは、HTTP 要求を受信すると、ローカル Caché CSP アプリケーションの設定を使用して、この要求の処理方 法を決定します。このセクションでは、Caché が、CSP アプリケーション設定を使用して CSP アプリケーションの要求を処 理する方法について説明します。 2.4.1 Web アプリケーションの設定の編集 以下のように、管理ポータルの [ウェブ・アプリケーション編集] ページで、Caché が特定の CSP アプリケーションを処理 する方法について設定を作成または変更できます。 1. 選択 [システム] > [セキュリティ管理] > [ウェブアプリケーション]。 構成済みの Web アプリケーションが一覧表示されます。[タイプ] 列には、アプリケーションが、ユーザ・アプリケー ション (CSP) またはシステム・アプリケーション (CSP,System) として示されます。システム・アプリケーションとは、 Caché に付属する CSP ベースのユーティリティです。 2. アプリケーションを選択して [編集] をクリックします。 [一般] タブには、以下のオプションが表示されます。 Caché Server Pages (CSP) の使用法 15 CSP アーキテクチャ テーブル 2–1: Web アプリケーションの設定の編集 — [一般] タブ フィールド 説明 ウェブアプリケーション 名 アプリケーションの名前を入力します。 コピー元 新規アプリケーションの場合にのみ表示されます。コピー元の既存のアプリケーションを 選択します。フィールドには、選択したアプリケーションのオプションによって値が入力さ れます。必要に応じてそれらを編集できます。 説明 説明を入力します。 有効 アプリケーションが有効かどうかを制御します。[有効] になっていれば、認証および承認 されたユーザはアプリケーションを使用できます。[無効] の場合は使用できません。 アプリケーションの実行 に必要なリソース アプリケーションを実行するために、ユーザが Use 許可 (ロールで特権の一部として有 効化されたもの) を保持していなければならないリソースを指定します。リソースおよび許 可の詳細は、"Caché セキュリティ管理ガイド" の “リソースについて” のセクションを参 照してください。 許可された認証方法 アプリケーションへの接続に使用できる認証メカニズムを指定します。ここに表示される オプションは、[認証オプション] ページ ([システム] > [セキュリティ管理] > [システムセキュ リティ設定] > [認証オプション]) での設定内容によって異なります。アプリケーションが複 数の認証メカニズムをサポートする場合、認証は以下のように行われます。 • [認証なし] を含む複数のオプションが有効になっている場合、ユーザ名とパスワード を入力せずにユーザはログインできます。 • オプションがすべて有効になっている状態で、ユーザ名とパスワードを入力した場 合、Caché によってカスケード認証が実行されます。 • 選択したオプションが Kerberos やパスワードで、[認証なし] は選択していない場合、 ユーザ名とパスワードを入力する必要があります。Caché では、最初に Kerberos 認 証が実行され、次に Caché パスワード・ログインによる認証が実行されます。いずれ かの認証が成功すれば、ユーザは認証されます。両方の認証が失敗した場合、ア プリケーションへのアクセスが拒否されます。 承認についての詳細は、"Caché セキュリティ管理ガイド" の "認証" の章を参照してくだ さい。 Kerberos 認証は /isc/studio アプリケーションには使用できないことに注意してください。 Kerberos 認証をこれらのアプリケーションに対して有効にすると、予期せぬ副作用が発 生します。 ID 単位のグループ化 このアプリケーションにグループ名を入力して、このグループ名で他のすべてのアプリ ケーションと認証特権を共有します。このグループ名を使用したすべてのアプリケーショ ンで、認証の同期が保たれます。これらのアプリケーションのいずれかからログアウトす ると、すべてのアプリケーションからログアウトされます。ログアウトされた後でいずれか のアプリケーションのページに戻ろうとする場合は、再度ログインする必要があります。 ただし、一度ログインすると、再度ログインしなくてもアプリケーション間を移動できます (唯一の例外として、これらのアプリケーションのいずれかが非認証であると、それらのア プリケーションは認証クラスタの一部としては扱われません)。詳細は、“ID 単位のグルー プ” および “ID 単位のグループ化” を参照してください。 16 Caché Server Pages (CSP) の使用法 CSP アプリケーションの設定 フィールド 説明 2要素認証有効 2 要素認証を有効とすることで、ユーザはログインのために 2 つの識別子、パスワード、 および携帯電話番号を使用する必要があります。"Caché セキュリティ管理ガイド" の "2 要素認証向けの構成" を参照してください。 CSP/Zen 有効 CSP を有効にすると、CSP および Zen のページが提供されます。チェックを外すと無効 になります。Zen についての詳細は、"Zen の使用法" を参照してください。 着信 Web サービス有効 CSP を有効にすると、SOAP 要求 を処理します。チェックを外すと無効になります。SOAP および Caché Web サービスについての詳細は、"Caché での Web サービスおよび Web クライアントの作成" を参照してください。 許可されるクラス COS パターンを使用して、このアプリケーションで実行する可能性のあるクラスを指定し ます。例えば、1"myclass".3N では、このアプリケーションで myclass123.cls が実行でき るようになりますが、myclassxy.cls は実行できません。 ネームスペース このアプリケーションに対するページが実行されている Caché ネームスペース。 ネームスペースの既定 アプリケーション このアプリケーションを、このネームスペースの既定アプリケーションとして設定しま す。%System.CSP.GetDefaultApp の呼び出しにより、このネームスペースの既定として、 このアプリケーションを返します。Caché のインポート機能はこれを使用することで、XML ファイルからの CSP ページ・インポートなどの場合に対処します。この場合においては、 現在のネームスペースには CSP ファイルをエクスポートした CSP アプリケーションがあ りません。CSP は CSP ファイルを、ネームスペースの既定 CSP アプリケーションにイン ポートします。 CSP ファイル物理パス Caché サーバ上で、CSP のソース・ファイルの保存先とするディレクトリ。このパスは、 Caché サーバ・システムの install-dir/csp/ ディレクトリを基準とする相対パスです。 繰り返し アプリケーション内にサブディレクトリを含むかどうかを指定します。UPath が URL パス で、PPath が物理パスである場合、Recurse が Yes に設定されていれば、UPath/xxx/yyy は、PPath/xxx/yyy で CSP ファイルを検索します。Recurse が No に設定されている場 合は、UPath に直接含まれるファイルのみが使用されます。 自動コンパイル CSP サーバで CSP ソース・ファイルを自動的にコンパイルするかどうかを指定します。 これが Yes に設定されている場合、CSP ファイルがそれ以前にコンパイルされたクラス よりも新しいときは、再コンパイルされます。これは通常、開発環境では、Yes に設定し、 運用環境では、No に設定します。 イベントクラス CSP クラス (%CSP.SessionEvents のサブクラス) の既定名を指定します。この既定名の メソッドは、タイムアウトやセッションの終了などの CSP アプリケーション・イベントを呼び 出します。この値は、%CSP.Session オブジェクトの EventClass プロパティを使用してオー バーライドできます。 セッションタイムアウト 既定のセッション・タイムアウトを秒単位で指定します。この値は、%CSP.Session オブジェ クトの AppTimeout プロパティを使用してオーバーライドできます。 デフォルトスーパークラ ス CSP ファイルから生成されるクラスについて、CSP コンパイラで使用される既定のスー パークラスの名前。既定は、%CSP.Page です。 Caché Server Pages (CSP) の使用法 17 CSP アーキテクチャ フィールド 説明 セッションにクッキーを 使用する クッキーまたは URL 書き換え手法 (各 URL に値を配置) を使用して、ブラウザがあるセッ ションを CSP が追跡するかどうかを指定します(アプリケーションで実際に cookie を使用 するには、この設定にかかわらず、cookie を使用するようにアプリケーションを記述する 必要があります)。選択は、常に cookie を使用する、cookie を使用しない、またはユーザ が cookie を無効にしているかどうかを自動検出する (既定) です。具体的な選択は、a) cookie を使用する ([常に])、b) cookie を使用しない ([なし])、c) (既定) クライアント・ブラ ウザが cookie を無効にしていない限り cookie 使用する ([自動検出]) です。このオプショ ンでは、アプリケーションが cookieを使用するかどうかは設定されません (これは、アプ リケーションを記述する方法によります)。このオプションでは、CSP がセッションを管理す る方法が制御されるだけです。ユーザが cookie を無効にしている場合、アプリケーショ ンでは、URL 書き換えが使用されます。 セッションクッキーパス セッション cookie のスコープ。ブラウザで Caché へのセッション cookie の返信に使用す る URL を指定します。アプリケーションの名前が myapp であれば、既定は /myapp/ に なり、その cookie は /myapp/ 以下にあるページのみに送信されます。これをユーザの アプリケーションにとって必要なものだけに限定すると、このマシンで他の CSP アプリ ケーションがセッション cookie を使用しないように、あるいはこの Web サーバ上の他の アプリケーションがセッション cookie を参照しないようになります。他方では、ブラウザと cookie は、大文字小文字を区別します。セッション cookie を「/」に設定すると、例えば、 アプリケーション名を大文字から小文字に変更した場合などに、ライセンスまたはセッショ ンの問題を防止することができます。 静的ファイルの提供 なし - このアプリケーション・パスからの静的ファイルの提供はしません。 [常に] - 既定。常にこのアプリケーション・パスから静的ファイルを提供します。このパス の静的ファイルに対する CSP セキュリティ設定は無視します。これは新しいアプリケー ション向けの既定です。Web サーバで静的ファイルを扱うようにしているこれまでのアプ リケーションは、引き続き適切に機能します。 常におよびキャッシュ - 常にこのアプリケーション・パスから静的ファイルを提供し、CSP ゲートウェイでこれらのファイルをキャッシュして Cache からこれを要求する必要がなくな ります。これは、ほとんどのアプリケーションが使用すると予想されるモードです。 CSP セキュリティを使用 - このアプリケーション内で csp/cls ページを参照する権限があ る場合、静的ファイルも参照できます。csp/cls ページを参照する権限がない場合、「404 」というメッセージが表示されます。 静的ファイルの提供タイ ムアウト ブラウザで静的ファイルをキャッシュする必要がある時間 (秒)。既定値は 3600 です。 CSP名ロック [はい] に設定すると、2 つの CSP アプリケーションがどちらも同一のネームスペースと パッケージを指している場合は、先にロードしたアプリケーションからのみ目的の CSP ページを取得できます。 カスタムエラーページ アプリケーション内でページを生成する際、エラーが発生すると表示される、末尾が .csp または .cls のページの名前。 パッケージ名 CSP コンパイラが使用するオプションのパッケージの接頭語名。この名前は、CSP ファ イルから作成されたクラスに使用されるパッケージ名に付加されます。このフィールドが 指定されていない場合は、csp の既定値を使用します。 18 Caché Server Pages (CSP) の使用法 CSP アプリケーションの設定 フィールド 説明 ログインページ 名前は CSP ページ名、Zen ページ名、もしくは CSP 対応クラス名にすることができ、そ れらに CSP アプリケーションのフル・パスを付けることも可能です。次のパターンすべて が許可されます。mylogin.csp、/csp/user/mylogin.csp、 MyApp.LoginPage.zen、/csp/user/MyApp.LoginPage.cls。ほとんどの場合、ログイン・ ページはユーザが Cache にログインする前にロードされるので、要求プロセスは CSPSystem ユーザ (もしくは CSP ゲートウェイを Cache に接続しているユーザ) のもと で実行されます。その結果、CSPSystem ユーザはコードをロードしてログイン・ページで 実行するために適切な特権を持つ必要があり、通常はログイン・ページのあるデータベー スを保護するリソースに対する READ 権限が要求されます。 パスワードの変更ペー ジ パスワードの変更で使用するページの名前。 [アプリケーション・ロール] タブを使用すると、アプリケーションの使用中にユーザに割り当てるロールを選択できます。 ここで選択したアプリケーション・ロールが、ユーザに既に割り当てられている一連のロールに追加されます。 [マッチングロール] タブを使用すると、現在のロール割り当てに基づいて、アプリケーションの使用中にアプリケーション・ ユーザに追加ロールを割り当てることができます。 ロールおよびカスタム・ログイン・ページの詳細は、ドキュメント "Caché セキュリティ管理ガイド" の “アプリケーション” を参照してください。 2.4.1.1 ID 単位のグループ化 ID 単位のグループは、ネームスペースではなくアプリケーションにアタッチされます。このため、ネームスペースには関 係なく、同じ ID 単位のグループを持つアプリケーションで認証が共有されます。 2.4.2 新規アプリケーションの定義 CSP サーバ上で /myapp という新規 CSP アプリケーションを定義するには、以下の手順に従ってください。 1. 管理ポータルで [システム] > [セキュリティ管理] > [ウェブアプリケーション] に移動し、[新規ウェブアプリケーション 作成] をクリックします。 2. この場合は、新規のアプリケーション名 /myapp の URL を入力し、[OK] をクリックします。 3. アプリケーションの必要なプロパティを入力します。ほとんどのプロパティはオプションです ("アプリケーションの設 定" のセクションにあるテーブルを参照)。最も重要な点は、以下のとおりです。 • [許可する認証の有効/無効] — アプリケーションに接続するための有効な認証テクノロジ。 • [ネームスペース] — このアプリケーションが実行されている Caché のネームスペース。 • [Caché物理パス] — CSP ファイルの物理的な場所 (HTML ベースの開発を使用している場合)。 4. [保存] をクリックします。 5. [アプリケーション・ロール] タブをクリックして、アプリケーションの使用中にユーザに割り当てるロールを選択します。 これらのアプリケーション・ロールが、ユーザに既に割り当てられている一連のロールに追加されます。 6. [マッチングロール] タブをクリックして、現在のロール割り当てに基づいて、アプリケーションの使用中にアプリケー ション・ユーザに追加ロールを割り当てます。 Caché Server Pages (CSP) の使用法 19 3 CSP での HTTP 要求 CSP は、受信した HTTP (Hypertext Transport Protocol) 要求に応答して、動的なコンテンツを提供します。この章で は、CSP で HTTP がどのように処理されるかという点について基本的な内容を説明します。 HTTP は、クライアントがサーバへ要求を送る単純なプロトコルです。HTTP はステートレス方式のプロトコルです。つま り、クライアントとサーバ間は、要求のやりとりに必要な間のみ接続されます。すべての HTTP 要求には、要求のタイプ (GET や POST など)、URL、およびバージョン・ナンバーを指定する要求ヘッダが含まれています。また、付加情報が含 まれることもあります。CSP はどの HTTP 要求を処理すべきかを自動的に決定し、それを Caché サーバ内の適切なクラ スへ配信し、要求の情報を使用しやすいオブジェクトにまとめます (%CSP.Request オブジェクトなど)。 3.1 CSP 実行時環境 以下の図は、CSP と HTTP 要求のアーキテクチャを表しています。 図 3–1: CSP アーキテクチャ CSP アプリケーションの実行時環境は、以下のとおりです。 • HTTP クライアント (Web ブラウザなど) • HTTP サーバ (Apache や IIS などの Web サーバ) • CSP ゲートウェイ (Web サーバへの Caché アド・オン) Caché Server Pages (CSP) の使用法 21 CSP での HTTP 要求 • Caché サーバ (要求された CSP アプリケーションを CSP サーバで実行する場所となるサーバ) 3.2 HTTP 要求の処理 以下の図は、CSP が HTTP 要求を処理するときの、イベントのフローを表しています。 図 3–2: HTTP イベント・フロー 1. ブラウザ (または同様の Web クライアント) が、HTTP 要求を行います。 2. Web サーバは、これが CSP 要求であると判断し、その要求を Web サーバにインストールされている CSP ゲートウェ イに送信します。2a Web サーバは、アプリケーション構成によっては、静的コンテンツを処理する場合があります。 3. CSP ゲートウェイは、その要求を再度まとめて、適切な Caché サーバに送信します。 4. Caché サーバは、メッセージをデコードし、要求が静的ページに対してであるか、それとも CSP クラスに対してであ るかを判断します。 .html や .jpg などの静的ファイルに対する要求であれば、Caché サーバはローカル・ファイル・システムでそのファイ ルを見つけ、そのコンテンツをクライアントに返信します。 クラスに対する要求であれば、アプリケーションを構成するイベント処理クラスのうち、どのクラスでイベントを処理す るかを決定し、そのクラスの Page メソッドを呼び出します。 5. Page メソッドの出力または静的ページが、HTTP 応答として CSP ゲートウェイに返送されます。 6. CSP ゲートウェイは HTTP の応答を Web サーバに渡します (具体的には、応答は CSP ゲートウェイを経由して、 Web サーバへ返送されます)。 7. Web サーバは Web ブラウザに応答を返し、Web ブラウザがその応答を処理します。HTML の場合はその内容が 表示されます。 22 Caché Server Pages (CSP) の使用法 HTTP 要求の処理 3.2.1 Web サーバと CSP ゲートウェイ Web ブラウザなどの HTTP クライアントが Web サーバにメッセージを送信すると、HTTP 要求が始まります。CSP ゲー トウェイは、DLL または共有ライブラリであり、Web サーバ (IIS、Apache など) が特定の種類のイベントを処理するため に使用します。CSP ゲートウェイは、以下の条件に当てはまる場合に HTTP 要求を処理します。 • URL のディレクトリ・パスに、Web サーバで定義された正当なアクセス権が設定されていること。 CSP ゲートウェイは、以下の機能を提供します。 1. 実行する処理を必要最小限に抑え、その処理のほとんどを Caché CSP サーバで実行することにより、Web サーバ で使用できるリソースを増やします。 2. 指定された CSP サーバへの接続プールを維持します。 3. フェイルオーバー・オプションにより、CSP サーバを多数連結して使用することができます。 3.2.2 CSP サーバ CSP サーバは、CSP ゲートウェイからの要求を処理する、Caché サーバ上で稼動するプロセスです。各 Caché サーバ は、マシンの種類によって発生する制約の範囲内で、必要な数の CSP サーバ・プロセスを実行できます。この場合、CSP サーバはライセンスの対象台数に算入されません。 ステートレスで要求を処理する場合は、多数の異なるクライアントからの要求を各 CSP サーバ・プロセスでサポートでき ます。 では、そのモードが解除されない限り、1 つのプロセスが 1 つのクライアントからの要求処理 に専有されます。 注釈 Caché では、アプリケーション・サーバとデータ・サーバに実質的な違いがないことが重要な利点です。これに より、要求を処理するうえで必要な台数のマシンを使用するようにアプリケーションを構成できます。これはアプ リケーションの論理やデータベース・スキーマとは無関係に実行できます。特定のシステムが、アプリケーショ ン・サーバかデータ・サーバか (あるいは両方) は、構成の問題です。 3.2.3 CSP サーバのイベント・フロー CSP サーバは、CSP ゲートウェイから要求を受信すると、要求が静的ページに対してであるか、それとも CSP クラスに対 してであるかを判断します。静的ページに対する要求の場合は、直ちにページを返信します。CSP クラスに対する要求 の場合は、以下を実行します。 1. 要求がどのセッションに属するかを決定します。いずれのセッションにも属さない場合は、新規セッションを開始しま す。 2. 要求が Caché の正しいネームスペースで処理されたことを確認します。 3. 正しい %CSP.Session オブジェクトが有効であることを確認し、HTTP 要求に含まれた情報を基に、%CSP.Request オブジェクトのインスタンスを生成します。必要に応じて、暗号化します。 4. %CSP.Response オブジェクトを作成し、アプリケーションで応答ヘッダを変更できるようにします。 5. 要求を処理するクラスを判断し、その Page メソッドを呼び出します。このメソッドは、OnPage コールバック・メソッドを 呼び出します。 3.2.4 CSP サーバの URL とクラス名の解決 CSP サーバは、URL を解読して、どのクラスに HTTP 要求を配信するかを決定します。CSP は URL を以下の構成要 素に分解します。 Caché Server Pages (CSP) の使用法 23 CSP での HTTP 要求 URL : http://localhost:[<port_no>]/csp/samples/object.csp?OBJID=2 テーブル 3–1: URL の構成要素 構成要素 目的 http:// プロトコル localhost Web サーバのアドレス [<port_no>] 必要に応じ、Web サーバが稼動しているポート番号を指定します。既定のポート番号 は 80 です。 /csp/samples/ ディレクトリ object.csp ファイル名と拡張子 ?OBJID=2 クエリ プロトコルとサーバ・アドレスは Web サーバが処理し、CSP サーバは関与しません。ディレクトリは、URL が参照する CSP アプリケーション を指定するために利用します。すべての Caché 構成は、多数の CSP アプリケーションを定義すること ができます。URL のディレクトリ部分により、これらを識別します。管理ポータルの [ウェブアプリケーション] ページ ([シ ステム] > [セキュリティ管理] > [ウェブアプリケーション]) で作成および変更する各 CSP アプリケーションでは、すべて の要求によって使用されるさまざまな設定を、所定の URL ディレクトリで指定します。これらの中で最も重要なものは、 要求が実行される Caché ネームスペースと、確立可能なアプリケーションへの接続の種類を指定する認証メカニズムで す。 要求を処理するクラスの名前は、そのファイル名から以下のアルゴリズムを使用して、CSP アプリケーションに基づいて 決定されます。 • ファイル拡張子が .cls の場合、そのファイル名をクラス名とします。 • ファイル拡張子が .csp の場合、パッケージ名として csp (または構成内で指定されたパッケージ名)、クラス名として ファイル名を使用してクラス名を作成します。このクラスが存在しない場合や、期限切れの場合、autocompile が オンになっていれば、CSP コンパイラは CSP ソース・ファイルからクラスを作成します。このファイルは、URL と同じ 名前と拡張子を持ちます。 例えば、CSP サーバが以下の URL を配信するとします。 http://localhost:57772/csp/samples/menu.csp 配信先は、ディレクトリ /csp/samples に関連付けられた Caché ネームスペース (この場合、SAMPLES ネームスペース) で実行されている csp パッケージにある menu というクラスです。 URL ディレクトリ /csp/accounting が Caché ネームスペース ACCOUNTING に関連付けられている場合、CSP サーバ は以下の URL を配信します。 http://localhost:57772/csp/accounting/Ledger.csp 配信先は、Caché ネームスペース ACCOUNTING で実行されている csp パッケージにある ledger というクラスです。 CSP で使用する URL ファイル名には、以下のような制限があることに注意してください。 • 有効な Caché クラス名を指定する必要があります。ドットとパーセント文字 (%25) を除く句読点やスペースは使用で きません。また、先頭には数字を使用できません。 • 既に使用中のクラス名は使用できません。 24 Caché Server Pages (CSP) の使用法 %CSP.Page クラス 注釈 定義されたディレクトリのサブディレクトリ内に .csp ファイルが配置されている場合、サブディレクトリ名はその ページに使用される %CSP.Page クラスのパッケージ名の一部になります。例えば、URL ディレクトリ /csp/samples が CSP アプリケーションとして定義されている場合、/csp/ samples/myapp/page.csp は csp.myapp.page というクラスを参照します。 3.3 %CSP.Page クラス CSP サーバでは、すべての HTTP 要求は、%CSP.Page クラスによって定義されたさまざまなメソッドを呼び出すことによ り処理されます。しかし、%CSP.Page クラスは HTTP 要求の処理に必要なインタフェースを定義するだけで、直接的に は処理を実行しません。実際のイベント処理は、%CSP.Page のサブクラスにより実行されます (このサブクラスは、手動 で生成するか、CSP ソース・ファイルを処理した結果として生成されます)。 %CSP.Page のサブクラスはインスタンスを作成しないため、%CSP.Page オブジェクトも生成されません。%CSP.Page に よって定義されたメソッドは、すべてクラス・メソッドであり、呼び出しにオブジェクトは必要ありません。これらのメソッドに 必要なステート情報は、CSP サーバが管理する他のオブジェクト (%CSP.Request や %CSP.Session オブジェクトなど) により供給されます。 3.3.1 Page メソッド 要求を処理する %CSP.Page クラスを決定した CSP サーバは、適切な処理コンテキストを作成し、そのクラスの Page メ ソッドを呼び出します。処理コンテキストの設定では、すべての出力が Write コマンドを使用して HTTP クライアントに返 送されるように標準出力デバイス ($IO) にリダイレクトを設定し、要求されたすべてのオブジェクト (%request、%response、%session などのオブジェクト) のインスタンスやローカル変数を作成します。 Page メソッドは、HTTP 要求に対する完全な応答処理を実行します。これには、コールバック・メソッド OnPreHTTP、 OnPage、OnPostHTTP を、この順番で呼び出します。サブクラスではこれらのメソッドをオーバーライドして独自の動作 を実現できるので、これらのメソッドはコールバック・メソッドとして参照されます。 OnPreHTTP メソッドは、HTTP 応答のヘッダを書き出す処理を担当します。このヘッダには、コンテンツ・タイプや cookie などの情報が含まれます。既定の動作は、コンテンツ・タイプの設定を text/html とします。一般的には、OnPreHTTP メソッドをオーバーライドする必要があるのは、応答ヘッダを直接管理する必要がある場合のみです。 OnPage メソッドは、HTTP 要求への応答処理において、最も重要な作業を実行します。HTML ドキュメントや XML ド キュメントなど、要求の本文を書き出す処理を担当します。 以下は、OnPage メソッドを使用したサンプル CSP クラスの例です。 Class MyApp.Page Extends %CSP.Page { ClassMethod OnPage() As %Status { Write "<html>",! Write "<body>",! Write "My page",! Write "</body>",! Write "</html>",! Quit $$$OK } } OnPostHTTP メソッドは、HTTP 要求の処理が終了した後に作業をする場合に利用できます。 3.3.2 %CSP.Page クラス・パラメータ %CSP.Page クラスには、オーバーライドできるクラス・パラメータがあります。これらを使用して、コードを記述しなくても動 作をカスタマイズできます。 Caché Server Pages (CSP) の使用法 25 CSP での HTTP 要求 使用可能なクラス・パラメータのリストについては、“ %CSP.Page ” のドキュメントを参照してください。 プログラミングによってアプリケーション開発をしている場合は、これらのクラス・パラメータは (例えば、Caché スタジオ内 のクラス・エディタを使用して) 作成された %CSP.Page のサブクラス内でオーバーライドすることができます。 また、ページの作成に .csp ファイルを使用している場合は、csp:class タグを使用してこれらのパラメータ値を設定で きます。 <csp:class PRIVATE="1"> 3.3.3 CSP エラーの処理 %CSP.Error は、既定の CSP エラー・ページです。作成するエラーページのスーパークラスとしてこれを使用しま す。%CSP.Error で提供される関数を使用してエラーから情報を引き出すことができます。 3.3.3.1 ライセンスが付与される前の CSP エラーの処理 既に既存のセッションがあり、見つからないページにユーザが移動しようとした場合、このセッションには既にライセンス があるので、CSP は、標準エラー・ページを表示します。 CSP アプリケーションにはまだライセンスがなく、以下のいずれかのエラーが発生した場合、CSP は、既定で標準の Web エラー・メッセージ「HTTP/1.1 404 」を表示します。アプリケーションのエラー・ページ (通常、%CSP.Error のサブクラス) で以下のパラメータを設定することによって、ライセンスが付与される前にエラーが発生した場合に表示さ れるページを変更できます。 LICENSEERRORPAGE 以下のエラーが発生した場合、CSP は、LICENSEERRORPAGE パラメータの値を確認します。 Cannot grant license. LICENSEERRORPAGE には、以下の 2 つの値を指定できます。 "" — 「HTTP/1.1 404 」というエラーを返します (既定)。 静的 HTML ページへのパス — /csp/samples/static.html などの名前がつけられた静的ページを表示します。 PAGENOTFOUNDERRORPAGE 以下のいずれかのエラーが発生した場合、CSP は、PAGENOTFOUNDERRORPAGE パラメータの値を確認します。 Class does not exist Method does not exist CSP application does not exist (set parameter on default error page) CSP page does not exist File does not exist CSP namespace does not exist CSP illegal request File cannot open CSP session timeout PAGENOTFOUNDERRORPAGE には、以下の 3 つの値を指定できます。 "" — 「HTTP/1.1 404 ページが見つかりません」というエラーを返します (既定)。 1 — ライセンスを取得し、標準エラー・ページを表示します。 静的 HTML ページへのパス — /csp/samples/static.html などの名前がつけられた静的ページを表示します。 OTHERSTATICERRORPAGE その他のエラーが発生した場合、CSP は、OTHERSTATICERRORPAGE パラメータの値を確認します。 OTHERSTATICERRORPAGE には、以下の 3 つの値を指定できます。 26 Caché Server Pages (CSP) の使用法 %CSP.Request オブジェクト "" — ライセンスを取得し、標準エラー・ページを表示します (既定)。 1 — 「404 ページが見つかりません」というエラーを出力します。ライセンスは必要ありません。 静的 HTML ページへのパス — /csp/samples/static.html などの名前がつけられた静的ページを表示します。 3.4 %CSP.Request オブジェクト CSP サーバが HTTP 要求に応答する際、CSP サーバは受信した要求についての情報を %CSP.Request オブジェクト のインスタンスにまとめます。変数 %request を使用して、このオブジェクトを参照できます。プロパティやメソッドの全リス トについては、%CSP.Request クラスのドキュメントを参照してください。 3.4.1 URL プロパティ 受信した HTTP 要求の URL (問い合せ文字列を除いた部分) を探すには、%CSP.Request オブジェクトの URL プロパ ティを使用します。 Write "URL: ", %request.URL 3.4.2 Data プロパティおよび URL パラメータ URL にはパラメータのリスト (URL クエリ) を指定できます。%CSP.Request オブジェクトは、これらを Data プロパティを 通して利用できるようにします。 例えば、受信した URL が以下を含むとします。 /csp/user/MyPage.csp?A=10&a=20&B=30&B=40 以下を使用して、サーバ上のこれらのパラメータを検索できます。 Write Write Write Write %request.Data("A",1) %request.Data("a",1) %request.Data("B",1) %request.Data("B",2) // // // // this this this this is is is is 10 20 30 40 Data は多次元のプロパティで、その中に格納されたそれぞれの値には、パラメータ名と、パラメータのインデックス番号 という 2 つの添え字があります (パラメータは、上記の例の B のように、URL 内で複数回使用できます)。このパラメータ 名は大文字と小文字を区別しますので、注意してください。 また、受信した HTTP 要求が GET 要求か POST 要求であるかは重要ではありません。Data プロパティでは、まったく同 じ方法でパラメータ値が表されます。 指定されたパラメータ値が定義されているかどうかを確認するには、Caché ObjectScript の $Data ($D) 関数を使用しま す。 If ($Data(%request.Data("parm",1))) { } 参照するパラメータが定義されているかどうか不明な場合は、Caché ObjectScript の $Get 関数を使用します。 Write $Get(%request.Data("parm",1)) 特定のパラメータ名に定義された値の数を知るには、%CSP.Request の Count メソッドを使用します。 For i = 1:1:%request.Count("parm") { Write %request.Data("parm",i) } Caché Server Pages (CSP) の使用法 27 CSP での HTTP 要求 3.4.3 CgiEnvs プロパティおよび CGI 環境変数 Web サーバは、CGI (Common Gateway Interface) 環境変数という、HTTP クライアントや Web サーバの情報を含む一 連の値を提供します。これらの CGI 環境変数に設定されている値へは、多次元プロパティである CgiEnvs を使用して アクセスできます。Data プロパティと同じ方法を使用できます。 例えば、HTTP 要求を作成したブラウザのタイプを判断するには、CGI 環境変数 HTTP_USER_AGENT の値を調べま す。 Write %request.CgiEnvs("HTTP_USER_AGENT") 使用できる CGI 環境変数については、"CSP ゲートウェイ構成ガイド" の “CGI 環境変数” のセクションを参照してくだ さい。 3.4.4 Cookies プロパティ HTTP 要求に cookie が含まれる場合は、その値を多次元プロパティ、Cookies で検索できます。Data プロパティと同じ 方法を使用できます。 クッキーの設定例については、このドキュメントの “%CSP.Response オブジェクトおよび OnPreHTTP メソッド” を参照し てください。 データは %session オブジェクトに保存することもできます。“ユーザ・セッション・データ – Data プロパティ” を参照して ください。クッキーの使用例については、CSP サンプル・データベースの cookie.csp を参照してください。 3.4.5 MIME データ・プロパティ 受信した要求には、MIME (Multipurpose Internet Mail Extensions) データが含まれることがあります。これは一般的に、 ファイルなどの大規模な情報に対して使用されます。MIME データは、%CSP.Request オブジェクトを使用して取得する ことができます。これは、MIME データの読み取りに使用できる Caché ストリーム・オブジェクトのインスタンスを作成し、 返します。 MIME データの利用例は、CSP サンプルの “upload.csp” ページを参照してください。 3.5 %CSP.Response オブジェクトおよび OnPreHTTP メソッド HTTP クライアントへ返される応答ヘッダの管理には、%CSP.Response オブジェクトを使用します。CSP サーバは、自動 的にこのクラスのインスタンスを作成し、このインスタンスへの参照を変数 %response に配置します。 %response オブジェクトは HTTP ヘッダを管理しているので、通常、そのプロパティは %CSP.Page クラスの OnPreHTTP メソッドで設定します。例えば、受信したHTTP 要求を転送するには、以下の OnPreHTTP メソッドを定義します。 Class MyApp.Page Extends %CSP.Page { // ... ClassMethod OnPreHTTP() As %Boolean { Set %response.ServerSideRedirect = "C:\CacheSys\csp\samples\redirect.csp" Quit 1 } } CSP クラスを使用して CSP ページを作成する場合は、次のコードを使用してヘッダ値を設定します。 28 Caché Server Pages (CSP) の使用法 %CSP.Response オブジェクトおよび OnPreHTTP メソッド Class MyPage Extends %CSP.Page { ClassMethod OnPreHTTP() As %Boolean { Do %response.SetCookie("name","value") Quit 1 } HTML を使用して CSP ページを作成する場合は、次のコードを使用してヘッダ値を設定します。 <head></head> <script language="Cache" method="OnPreHTTP" arguments="" returntype="%Boolean"> Do %response.SetCookie("name","value") Quit 1 </script> <body></body> 3.5.1 SetCookie メソッドによる Cookie の送信 HTTP クライアントに cookie を送信する場合は、%response オブジェクトの SetCookie メソッドを使用します。“Cookie へ のデータの格納” のセクションを参照してください。 3.5.1.1 クッキーへのアクセス クッキーが保存されている場合、以下のコードを使用してその値にアクセスできます。 [Page クラスのコード] ClassMethod OnPageBODY() As %Boolean { Write "<body>" Write "<p>COOKIES:</p> "Write "<ul>" Set cookie=%request.NextCookie("") While cookie'="" { For count=1:1:%request.CountCookie(cookie) { Write "<li>",cookie," - ",..EscapeHTML(%request.GetCookie(cookie,count)),"</li>",! } Set cookie=%request.NextCookie(cookie) Write "</ul>" Write !,"</body>" } [CSP ページのコード] <body> <p>COOKIES:</p> <ul> <script language="Cache" runat="server"> Set cookie=%request.NextCookie("") While cookie'="" { For count=1:1:%request.CountCookie(cookie) { Write "<li>",cookie," - ",..EscapeHTML(%request.GetCookie(cookie,count)),"</li>",! } Set cookie=%request.NextCookie(cookie)</script> </ul> </body> クッキーの定義には、次の形式で有効期限とパスを含めることができます。 Do %response.SetCookie("NAME","VALUE",expireData,path) expireData フィールドが空白の場合、メモリ内のクッキーが定義されます。これに対して、expireData フィールドに値を指 定した場合には、このクッキーは指定した期間で削除される永続的なクッキーになります。expireData フィールドの形式 は、Wdy, DD-Mon-YYYY HH:MM:SS GMT です (例 : Wednesday, 24-Mar-2004 18:12:00 GMT)。 Caché Server Pages (CSP) の使用法 29 CSP での HTTP 要求 3.5.2 さまざまなコンテンツ・タイプの提供 通常、CSP ページは text/html コンテンツを提供します。さまざまなコンテンツを指定するには、次のような方法があ ります。 • ページ・クラスで、%CSP.Page クラス・パラメータの値を CONTENTTYPE に設定する方法 • ページの OnPreHTTP メソッド内で、 %response オブジェクトの ContentType プロパティの値を設定する方法 30 Caché Server Pages (CSP) の使用法 4 CSP セッション管理 HTTP は、ステートレスのプロトコルであり、それぞれの要求は前の要求を認識しません。ユーザに静的なコンテンツを 提供する Web サイトには適切に機能しますが、インタラクティブで動的な Web アプリケーションの開発は困難です。こ の問題に対処するために、CSP ではセッション管理機能を提供しています。 4.1 CSP.Session を持つセッション セッションとは、一定時間内に、特定のクライアントから特定のアプリケーションへ送信される一連の要求です。 CSP は、自動的にセッションのトラッキングを実行するため、手動で実行する必要はありません。CSP アプリケーション は、%CSP.Session オブジェクトを使用して、セッション状況の問い合わせや変更ができます。CSP サーバは、%session という Caché ObjectScript 変数を介して、このオブジェクトを使用できるようにします。アプリケーション間での認証セッ ションまたはデータの共有の詳細は、"認証共有の方法" を参照してください。 4.1.1 セッションの生成 セッションは、HTTP クライアントが CSP アプリケーションに要求を送信したときに始まります。 新規セッションの開始後、CSP サーバは以下を実行します。 1. 新規セッションの ID 番号を生成します。 2. ライセンスが適切であるかを確認します。 3. %CSP.Session オブジェクト (永続オブジェクト) の新規インスタンスを生成します。 4. 現在のセッション・イベント・クラスがある場合は、その OnStartSession メソッドを実行します。 5. セッション進行中、HTTP クライアントからの連続した要求を追跡するために、セッション cookie を生成します。クラ イアントのブラウザで cookie が無効になっている場合、CSP はセッションを追跡するために、自動的に (各 URL に 特別な値を付ける) URL の再書き込み機能を使用します。 %CSP.Session オブジェクトの NewSession プロパティは、セッションの最初の要求では 1 に、それに続くすべての要求 では 0 に設定されています。 If (%session.NewSession = 1) { // this is a new session } Caché Server Pages (CSP) の使用法 31 CSP セッション管理 4.1.2 セッション ID セッション ID は、特定のセッションを識別するために使用する一意の値です。セッション ID は、永続 %CSP.Session オ ブジェクトのオブジェクト識別子として使用されます。CSP サーバは、このセッション ID を使用して、HTTP 要求を処理 するときに、%CSP.Session オブジェクトの正しいインスタンスと他の処理コンテキストを利用できるようにします。 CSP アプリケーションは、%CSP.Session オブジェクトの SessionId プロパティから、特定のセッション ID を検索すること ができます。 Write "Session ID is: ", %session.SessionId 4.1.3 セッションの終了とクリーンアップ セッションは、以下のいずれかの理由で終了します (ログアウトの詳細は、"セッションのログアウトまたは終了" を参照し てください)。 1. セッション・タイムアウトの設定時間内に要求を受け取らず、セッションがタイムアウトになった場合 2. セッションは、サーバ上でプログラム処理で明示的に終了します (%CSP.Session オブジェクトの EndSession プロパ ティを 1 に設定することによる)。例えば、クライアントが停止した場合や別のサイトに移動した場合は、セッションを 終了する必要があります。 3. セッションは、%CSP.Session オブジェクトの Logout メソッドを使用してログアウトできます。 セッションが終了した場合、CSP サーバは、永続 %CSP.Session オブジェクトを削除し、必要に応じてセッション・ライセ ンスのカウンタをデクリメントします。タイムアウトまたはサーバの処理によってセッションが終了した場合は、そのセッショ ンのイベント・クラスが存在していれば、そのクラスの OnEndSession メソッドも呼び出されます。 ある Zen コンポーネント (tablePane など) は、一時データを ^CacheTemp.zenData に格納します。これは通常、既 定のイベント・クラスにより自動的にクリーンアップされます。しかし、ユーザ自身のカスタム・イベント・クラスを定義する場 合、そのイベント・クラスの OnEndSession() コールバック・メソッドの %ZEN.Controller.OnEndSession() を明示的に呼び 出す必要があります。これをしない場合は、一時データはクリーンアップされません。 4.1.4 CSP の予約パラメータ 以下のテーブルは、予約パラメータとそれらの使用を示しています。 32 Caché Server Pages (CSP) の使用法 CSP.Session を持つセッション テーブル 4–1: CSP の予約パラメータ パラメータ 使用 Caché Server Pages (CSP) の使用法 33 CSP セッション管理 パラメータ 使用 CacheUserName ログイン・ページから使用します。例えば、 CacheUserName="fred" など、ログインするユーザ名 が含まれます。 CachePassword ログイン・ページから使用します。例えば、 CachePassword="fredspwd" など、CacheUserName で指定したユーザのパスワードが含まれます。 CacheOldPassword CacheUserName と CachePassword と共に渡された 場合、このパラメータにはユーザの現在のパスワードが 含まれます。セキュリティ・ルーチンによってユーザのパ スワードが、 CacheOldPassword="fredsAboutToBeChangedPwd" など、CachePassword の値から取られた新しい値に変 更されます。パスワードが変更されたら、ユーザは新規 パスワードを使用してログインされます。 CacheRepeatPassword 使用されていません。 CacheLogin 使用されていません。 CacheLogout CacheLogout に値を指定しないか、"cookie" 以外の 値を指定すると、この要求のセッションがログアウトされ ます (ただし破棄はされません)。ログアウトによって、現 在のログイン Cookie が破棄され、このセッションに不安 定なまま保持されている 2 要素向けのセキュリティ・トー クンが削除されます。 CacheLogout="cookie" によって、現在のログイン Cookie が破棄されます。 CacheSecurityToken CacheSecurityToken には、 CacheSecurityToken="12345678" など、[ログイン・ セキュリティ・トークン] ページから送信されたセキュリ ティ・トークンの値が含まれます。 CacheSecuritySubmit この名前が存在するということは、値が CacheSecurityToken に関連付けられているセキュリ ティ・トークンをユーザが送信していることを示していま す。 CacheSecurityCancel この名前が存在するということは、ユーザが [ログイン・ セキュリティ・トークン] ページでキャンセルしたことを示 しています。 34 Caché Server Pages (CSP) の使用法 %CSP.Session オブジェクト パラメータ 使用 CacheLoginPage カスタム・ログイン・ページを含め、ログイン・ページには 2 つのサブページがあります。ログイン用のサブページ と、セキュリティ・トークンの値を返すためのサブページで す。ログイン・ページでは、CacheLoginPage の値が確 認されて、表示するサブページが決められます。 CacheLoginPage=1 は、ログイン・サブページを表示 することを示しています。 CacheNoRedirect 要求されたページ P が非認証の場合は、ログイン・ペー ジが表示されます。ユーザがログイン・ページから情報 を送信した後、通常は、P のページ要求は元のブラウザ にリダイレクトされます (これによって、ブラウザが P を 表示する前に、ユーザに <Resend> ボタンを押すように 求めることがなくなります)。この動作は、 CacheNoRedirect=1 を渡すことによって簡略化でき ます。 4.2 %CSP.Session オブジェクト %CSP.Session オブジェクトには、現在のセッションとセッションの側面をプログラミングによって管理するための情報が含 まれています。 4.2.1 ユーザ・セッション・データ — Data プロパティ %CSP.Session オブジェクトの Data プロパティを使用して、そのオブジェクトにアプリケーション固有の情報を格納でき ます。Data は多次元配列のプロパティで、これを使用することで特定の情報の断片を多次元配列に関連付けることが できます。この配列のコンテンツは、セッションの終了まで自動的に維持されます。 他の Caché ObjectScript 多次元配列の使用法と同じ方法で、%CSP.Session オブジェクトの Data プロパティを使用で きます。 例えば、OnPage メソッドで以下のコードを実行します。 Set %session.Data("MyData") = 22 同じセッションのそれ以降の要求は、(どのクラスが処理をするかにかかわらず) %CSP.Session オブジェクト内のこの値 を参照します。 Write $Get(%session.Data("MyData")) // this should print 22 %CSP.Session にアプリケーション特有のデータを格納する機能は非常に高機能ですが、適切に使用する必要がありま す。詳細は、“ステート管理” のセクションを参照してください。 4.2.2 ユーザ・セッション・データの設定 — Set コマンド %CSP.Session オブジェクトにデータを格納するには、Set コマンドを使用します。この場合のデータはリテラル・データ のみで、オブジェクト参照は除きます。Data 配列中のすべてのノードは、最大 32,000 語までの文字列を含むことができ ます。 Caché Server Pages (CSP) の使用法 35 CSP セッション管理 Set %session.Data("MyData") = "hello" Set %session.Data("MyData",1) = 42 4.2.3 ユーザ・セッション・データの取得 — Write コマンド Caché ObjectScript 式の一部として Data プロパティからデータを取得できます。 Write %session.Data("MyData") Write %session.Data("MyData",1) * 5 値を有していない Data 配列のノードを参照すると、実行時に <UNDEFINED> (未定義) エラーが発生します。これを避 けるには、Caché ObjectScript の $Get 関数を使用します。 Write $Get(%session.Data(1,1,1)) // return a value or "" 4.2.4 ユーザ・セッション・データの削除 — Kill コマンド Data プロパティからデータを削除するには、Caché ObjectScript の Kill コマンドを使用します。 Kill %session.Data("MyData") 4.2.5 セッション・タイムアウト CSP セッションは、クライアントからの要求の受信後の経過時間を自動的にトラッキングします。あらかじめ設定した時間 が経過すると、セッションは自動的にタイムアウトになります。 セッション・タイムアウトの既定値は、900秒 (15分) です。CSP アプリケーションに対するこの既定値は、管理ポータルの [システム] > [セキュリティ管理] > [ウェブアプリケーション] ページで変更できます。目的のアプリケーションを選択して [編集] をクリックします。また、%CSP.Session オブジェクトの AppTimeout プロパティを設定すると、アプリケーションでも その値を設定できます。 Set %session.AppTimeout = 3600 // set timeout to 1 hour セッション・タイムアウトを無効にするには、タイムアウト値を 0 に設定します。 4.2.6 タイムアウト通知 — OnTimeout メソッド CSP アプリケーションでタイムアウトが発生すると、CSP サーバは、指定された %CSP.SessionEvents クラスの OnTimeout メソッドを実行してアプリケーションに通知できます。このクラス名は、%CSP.Session オブジェクトの EventClass プロパ ティで指定します。 既定では、イベント・クラスは定義されていないため、タイムアウトは現在のセッションを終了します。 4.3 ステート管理 HTTP はステートレスなプロトコルです。したがって、Web 向けに作成するアプリケーションでは、アプリケーションのコン テキストであるステートを管理するために特別な手法が必要です。CSP には、ステート管理の機能がいくつか用意され ています。これらの機能にはそれぞれ、最適な使用状況があります。 36 Caché Server Pages (CSP) の使用法 ステート管理 4.3.1 要求間のデータの追跡 Web アプリケーションでステートを管理する場合、連続的な HTTP 要求の間の情報を継続的に追跡するという点が基 本的な問題となります。これを解決するために、以下のようなテクニックがあります。 • 非表示フォーム・フィールドまたは URL パラメータを使用して、個々のページにデータを格納します。 • クライアント上の cookie にデータを格納します。 • サーバ上の %CSP.Session オブジェクトにデータを保存します。 • Caché データベースにデータを格納します。 4.3.2 ページへのデータの格納 ページにステート情報を格納するには、後に続く要求がその情報を持つ必要があります。 ハイパーリンク経由でページが要求された場合、データはハイパーリンクの URL 内に配置される必要があります。以下 は .csp ファイル内で定義されたステート情報を含むハイパーリンクの例です。 <a href="page2.csp?DATA=#(data)#">Page 2</A> このリンクを含むページを CSP サーバから提供する場合、式 #(data)# は、クライアントに送信するテキストに記述された サーバ変数データの値に置き換えられます。ユーザが page2.csp へのリンクを選択すると、CSP サーバは、%request オ ブジェクトを介して DATA 値にアクセスします。必要に応じて、CSP はこのようなデータを暗号化できます。詳細は、“認 証と暗号化” を参照してください。 ページに書式が含まれている場合、ステート情報は非表示フィールドに配置できます。 <form> <input type="HIDDEN" name="DATA" value="#(data)#"> <input type="SUBMIT"> </form> ハイパーリンクの例と同様に、この書式がクライアントに送信されるとき、式 #(data)# は変数データの値に置き換えられ ます。ユーザがこの書式を選択すると、%request オブジェクトを介して DATA 値を利用できるようになります。 すべてのリンクと書式に自動的に値を挿入するには、%response.Context を使用します。 4.3.3 Cookie へのデータの格納 ステート情報を格納するには、cookie に格納する方法もあります。cookie とは、クライアントに格納されている名前と値の ペアです。ある時点以降にクライアントから発行される各要求には、その時点以前のすべての cookie 値が含まれていま す。 cookie の値を設定するには、%CSP.Response オブジェクト内のページの cookie 値をオーバーライドします。 Class MyApp.Page Extends %CSP.Page { //... ClassMethod OnPreHTTP() As %Boolean { Do %response.SetCookie("UserName",name) Quit 1 } } サーバは、後で %CSP.Request オブジェクトの Cookies プロパティを使用してこの情報を検索できます。 cookie に情報を格納することにより、セッションの終了時に過去の情報を記録することができます。このためには、既定 では、ブラウザを閉じて cookie を終了するときに、有効期限を設定する必要があります。例えば、cookie にユーザ名を Caché Server Pages (CSP) の使用法 37 CSP セッション管理 記録すると、次回のセッションからこの情報の再入力を省略できます。別の種類の cookie やその形式については、HTML のマニュアルを参照してください。 4.3.4 セッションへのデータの格納 — Data プロパティ 前述のセクションで説明したように、Data プロパティを使用して %CSP.Session オブジェクトにステート情報を格納できま す。%session オブジェクトに格納された情報は、現在のセッションが継続している間、または %session オブジェクトから削 除されるまで利用できます。 %session オブジェクトは、現在のユーザ名のようにセッション実行中に必要な簡単な情報を格納するのに最適です。し かし、%session オブジェクトは、現在のセッションの有効範囲を超えて保持する必要のある情報には不適切です。また、 アプリケーションをユーザがどのように経由したかという経路 (ナビゲーション・パス) に左右される情報にも適していませ ん。通常、ユーザは自由に Web アプリケーションを移動できるため、特定のパスを通過したと仮定してアプリケーション を構築すると問題が生じます。 4.3.5 データベースへのデータの格納 ユーザに関する情報でさらに複雑なものがある場合は、組み込みの Caché データベース内に保存するのが最適です。 その方法の 1 つとして、データベースに 1 つ以上の永続クラスを定義し、そのオブジェクト ID の値を %session オブジェ クトに格納しておき、以降のアクセスで使用できるようにする方法があります。 4.3.6 サーバ・コンテキストの保存 — Preserve プロパティ 通常、ある要求から次の要求まで CSP サーバに保存される処理コンテキストのみが、%session オブジェクトに保持さ れます。CSP サーバは、すべての処理コンテキスト変数、インスタンス化されたオブジェクト、データベースのロック、要 求間で開いているデバイスを保持する機能を提供します。これは、 ( ) モードと呼ばれていま す。%CSP.Session オブジェクトの Preserve プロパティ値を設定することで、いつでも CSP アプリケーションのコンテキ スト保存のオン、オフを切り替えることができます。1 つのセッションに 1 プロセスを結びつけると、スケーラビリティが不 足します。 4.4 認証と暗号化 ステート情報は、HTTP クライアントへ送信するページにあるのが一般的です。後続の要求がこれらのページから生じた 場合、このステート情報はサーバへ返送されます。多くの場合、Web ページにステート情報を置くには、a) HTTP ソー ス・コードを見た人がステート情報の値を理解できないこと、b) 返送された情報が実際に、同じサーバ、同じセッションか ら送信された情報かどうかをサーバが検証できること、などが重要です。暗号化サービスにより、CSP はこの条件に合う 使いやすい機能を提供します。 4.4.1 セッション・キー CSP では、暗号化キーを使用して、サーバのデータの暗号化および解読を実行します。各 CSP セッション は、%CSP.Session オブジェクトの Key プロパティからアクセス可能な一意のセッション・キーを持ち、セッションのデータ を暗号化するために使用します。セッション・キーは HTTP クライアントに送信されないため、この機能は安全です。セッ ション・キーは %CSP.Session オブジェクトの一部として CSP サーバに残ります。 %CSP.Page クラスの Encrypt メソッドを使用して、サーバの値を手動で暗号化できます。その後、Decrypt メソッドを使用 してこの値を解読することもできます。 38 Caché Server Pages (CSP) の使用法 認証と暗号化 4.4.2 暗号化された URL と CSPToken ある特定の状況 (以下の説明参照) では、.csp ファイルから生成されたクラスは、クライアントに送信される URL 値を自 動的に暗号化します (手動で作成されたクラスでは、暗号化するには %CSP.Page クラスの Link メソッドを呼び出す必 要があります)。 例えば、以下の .csp ファイルには、他のページへのリンクが定義されているアンカー・タグが含まれます。 <a href="page2.csp?PI=314159">Page 2</a> この URL が暗号化されている場合、以下の内容がクライアントに送信されます。 <a href="page2.csp?CSPToken=8762KJH987JLJ">Page 2</a> ユーザがこのリンクを選択すると、暗号化パラメータ CSPToken が CSP サーバに送信されます。サーバはこれを解読し、 解読したコンテンツを %request オブジェクトに配置します。暗号化された値が変更された場合や別のセッションから送信 された場合、サーバはエラー・メッセージを生成します。%CSP.Request クラスの IsEncrypted メソッドを使用して、パラ メータ値が最初から暗号化されているかどうかを確認できます。 CSP コンパイラは、HTML 文書に存在する URL のすべての場所を自動的に検出して、必要に応じ、(以下のセクション の説明にある、目的のページのクラス・パラメータに基づいて) 暗号化を実行します。プログラミングで生成されたページ の場合も、%CSP.Page クラスの Link メソッドによって同様の動作を実行できます。 リンクを引数として関数に渡す場合、#url()# 指示文ではなく、%CSP.Page クラスの Link メソッドを常に使用します。以下 にその例を示します。 window.showModalDialog('#(..Link("locks.csp"))#','',windowFeatures); #url()# を関数への引数として使用する次の例は、機能しません。 window.showModalDialog('#url(locks.csp)#','',windowFeatures); CSP コンパイラでは検出できない場所にある .csp ファイル内で URL を暗号化する必要がある場合は、#url()# 指示文 を使用します。例えば、クライアント側の JavaScript 関数では、リンクがパラメータの場合、以下のように使用できます。 <script language=JavaScript> function NextPage() { // jump to next page CSPPage.document.location = '#url(nextpage.csp)#'; } </script> 4.4.3 プライベート・ページ CSP は、プライベート・ページという概念を提供します。プライベート・ページへは、同じ CSP セッションのページからの み移動できます。これは、特定のページへのアクセスを制限する必要があるアプリケーションで役に立ちます。 例えば、private.csp (CSP サンプル・ページの 1 つ) というプライベート・ページがあります。ユーザは、private.csp に (その URL を入力するなどの方法により) 直接アクセスすることはできません。private.csp へは、別の CSP ページに含 まれたリンクからのみアクセスできます。参照元の CSP ページに含まれるリンクは、http:// で始まる絶対 URL にはで きません。参照元ページを基準とした相対パスのみが、プライベート・ページの手法によって適切に暗号化またはトーク ン化されます。つまり、以下の最初の 2 つのリンクは、同じトークンを対象のプライベート・ページ test2.csp に渡します。 <A HREF='test2.csp'>Link to private page - relative path</A> <BR> <A HREF='/csp/samples/test2.csp'> Link to private page - full application path</A> <BR> 次のリンクは、上記のリンクとは異なる方法でハッシュ化され、アクセスに失敗します。 Caché Server Pages (CSP) の使用法 39 CSP セッション管理 <A HREF='http://myserver/csp/samples/test2.csp'> Link to private page - absolute path</A> また、プライベート・ページはブックマークへの登録もできません。プライベート・ページを保護している暗号化されたトー クンは、現在のセッションにのみ有効だからです。 プライベート・ページは以下のように機能します。プライベート・ページに対応する %CSP.Page サブクラスには、クラス・ パラメータ PRIVATE があり、その値が 1 に設定されています。そのため、このページを要求する URL では、有効な暗 号化された CSPToken 値を、問い合せ文字列に記述する必要があります。CSP で処理されたこのページへのすべての リンクには、自動的に CSPToken 値が指定されます。 4.4.4 コード化された URL パラメータ プライベート・ページと同様に、CSP ページは %CSP.Page クラス・パラメータ ENCODED の値を設定することで、URL パラメータをコード化するかどうかを指定できます。ENCODED は、0、1、または 2 に設定できます。ENCODED クラス・ パラメータが 1 または 2 のページへのリンクには、暗号化された CSPToken 値にコード化された URL パラメータが自動 的に設定されます。ENCODED が 2 の場合、値のコード化が必要です。1 の場合は、コード化された値とコード化され ていない値が混在していてもかまいません。 ENCRYPTED の 3 つの設定は以下のとおりです。 • ENCODED=0 — クエリ・パラメータは暗号化されません。 • ENCODED=1 — クエリ・パラメータは暗号化され、CSPToken に渡されます。 • ENCODED=2 — Page メソッドを呼び出す前に、暗号化されていないパラメータが %request オブジェクトから削除さ れる点を除いて、ENCODED=1 と同じです。このため、暗号化されたパラメータのみが %CSP.Request オブジェクト で使用されるようになります。 ENCODED=2 によって、暗号化されていないパラメータが URL から削除されるため、Zen の <form> 要素などのコンポー ネントが無効になる可能性があります。 4.4.4.1 ENCODED=2 の例 例えば、2 つの .csp ページがあるとします。一方のページ (list.csp) にはハイパーリンクで銀行口座のリストが表示され、 もう一方のページ (account.csp) には特定の口座の情報が表示されます。account.csp では、表示する口座を判断する ために、ACCOUNTID という URL パラメータを必要とします。クライアント上で口座番号を公開せず、また account.csp への権限のないアクセスやその他の口座番号の表示をしないようにするには、account.csp の ENCODED パラメータを 2 に設定します。以下は、関連のある .csp です。 list.csp のソース <html> <body> Select an account:<br> <a href="account.csp?ACCOUNTID=100">Checking</a> <a href="account.csp?ACCOUNTID=105">Saving</a> </body> </html> account.csp のソース <html> <csp:class private=1 encoded=2> <body> Account Balance: <b>$#(..GetBalance())#</b> </body> <script language="Cache" method="GetBalance" arguments="" returntype="%Integer"> // server-side method to lookup account balance New id Set id = $Get(%request.Data("ACCOUNTID",1)) If (id = 100) { Quit 157 40 Caché Server Pages (CSP) の使用法 認証共有の方法 } ElseIf (id = 105) { Quit 11987 } Quit 0 </script> </html> CSP サーバは、list.csp が要求されたとき、以下の HTML をクライアントに送信します。 <html> <body> Select an account:<br> <a href="account.csp?CSPToken=fSVnWw0jKIs">Checking</a> <a href="account.csp?CSPToken=1tLL6NKgysXi">Saving</a> </body> </html> ACCOUNTID の暗号化された値のみがクライアントに送信されます。 account.csp が処理されると、ACCOUNTID の解読された値が認識され、account.csp の GetBalance メソッドで参照さ れます。 4.4.4.2 ENCODED=1 の例 ENCODED=2 と ENCODED=1 との違いは、ENCODED=2 の場合は、暗号化されていない形式の URL に追加される テキストはすべて破棄されるということです。ENCODED=1 を使用すると、暗号化されていないテキストがページに渡さ れます。次に、ページには、この暗号化されていないテキストの処理を指定するコードを含めることができます。 サンプル・ページの protected.csp と protectedentry.csp は、ENCODED=1 を使用した例を示しています。 protected.csp のソースは、暗号化されていない URL に追加されているものが確認されることを示しています。暗号 化されていないものがある場合、ページには、HACKER ALERT! というスクローリング・マーキーが表示されます。 これを確認するには、サンプル・ページに移動してください。 1. protectedentry.csp をダブルクリックします。 2. [残高] フィールドに「500」と入力します。 3. [残高の確認] をクリックします。 4. protected.csp ページが開き、「 500 」と、表示されます。 5. URL には、暗号化された CSPToken が含まれていることに注意してください (CSPTaken= の後すべて)。これは、入 力して暗号化された 500 です。 6. この URL の末尾に移動し、「&BALANCE=8000」と入力し、Enter キーを押します。 7. protected.csp ページが表示されます。このページは、URL への暗号化されていない追加を受け入れ、HACKER ALERT! マーキーを表示することによってそれに対処しました。ENCODED を 2 に設定していたら、暗号化されて いない入力は無視されていました。 4.5 認証共有の方法 このセクションでは、以下の 2 つの方法でグループとして機能するアプリケーションのセットを作成する方法を説明しま す。 • 認証の共有 : アプリケーションで認証を共有しない場合、ユーザは、別のアプリケーションによってリンクされている アプリケーションごとに個別にログインする必要があります。認証の共有によって、ユーザは、一度ログインするだけ で、リンクされているすべてのアプリケーションに入れるようになります。 Caché Server Pages (CSP) の使用法 41 CSP セッション管理 • データの共有 : アプリケーションで、グローバル状態の情報を共有したり調整したりできます。 このセクションでは、以下の項目について説明します。 • 認証方法 • 認証アーキテクチャ • 方法を選択するときの考慮事項 4.5.1 認証方法 このセクションでは、以下の認証方法について説明します。これらの認証方法を実装するためのオプションは、[システ ム] > [セキュリティ管理] > [ウェブ・アプリケーション] ページにあります。 • 1 回限りの共有 : ログイン Cookie。ID が同じアプリケーションすべてで認証が共有されます。これは、CSP アプリ ケーションのオプション Login Cookies に対応しています。 • 連続する共有 : ID 単位またはセッション単位による認証グループ – ID 単位。グループ ID が同じアプリケーションすべてで認証が共有されます。これは、CSP アプリケーションの オプション [ID 単位のグループ化] に対応しています。 – セッション単位。これは、CSP アプリケーションの 2 つのオプションに対応しています。[セッションCookieパス] オプションを使用すると、同じ session-path-cookie を用いるアプリケーションで、セッションとその認証が共有さ れます。CSPSHARE オプションを CSPSHARE=1 に設定した場合、ユーザが (ソース・アプリケーションで) ター ゲット・アプリケーションへのリンクをクリックすると、ターゲット・アプリケーションは、ソース・アプリケーションと同 じセッションに配置されます。 4.5.1.1 1 回限りの共有 : ログイン Cookie ログイン Cookie には、最後にログインしたユーザに関する情報が保持されています。ユーザによる頻繁なログインの必 要性をなくすが、アプリケーションを独立した接続されていない状態に保つには、ログイン Cookie を使用します。 ログイン Cookie の場合、各アプリケーションは別々のセッションに配置します。そうすれば、アプリケーションに最初に 入ったときにのみ認証が共有されます。ログイン Cookie を使用したアプリケーションでは、グループは形成されません。 このため、ログイン後、1 つのアプリケーションで認証を変更しても、他のアプリケーションに影響を与えることはありませ ん。 ユーザがパスワードを使用してログインすると、その認証は Cookie に保存されます。ログイン Cookie が有効になってい る別のアプリケーションに (初めて) 入った場合、Cookie に保存されている認証が使用されます。次に、ログイン Cookie が有効になっていない 3 つ目のアプリケーションに (初めて) 入った場合、このユーザはユーザ名/パスワードを入力す る必要があります。 使用する方法の決定の詳細は、“方法を選択するときの考慮事項” のセクションを参照してください。 ログイン Cookie を使用するかどうかを決める場合の考慮事項を以下に示します。 • ログイン Cookie は、ユーザがパスワードを使用してログインするたびに、新しいユーザに更新されます。 • ログイン Cookie は、非認証の (不明な) ユーザには生成されません。 • ログイン Cookie は、API 呼び出しを使用してログインした場合は生成されません。 • ログイン Cookie が有効なセッションは、一度認証されたら独立したセッションになります。このため、1 つのセッショ ンでログアウトやタイムアウトが行われても、他のセッションに影響を与えることはありません。 • ログイン Cookie を使用したアプリケーションの認証を、パスワード認証のみ (非ログイン Cookie) のアプリケーション と共有することはできません。グループで認証されるアプリケーションの場合、動作の一貫性のためには、ログイン 42 Caché Server Pages (CSP) の使用法 認証共有の方法 Cookie をすべてのアプリケーションで使用するか、またはすべてのアプリケーションで使用しないかのいずれかに 設定します。 4.5.1.2 連続する共有 : ID 単位またはセッション単位による認証グループ グループでの共有の場合、グループのアプリケーションの認証はユニットとして移動します。グループ内の 1 つのアプリ ケーションのユーザが新規ユーザとしてログインすると、すべてのアプリケーションがそのユーザに移動します。1 つのア プリケーションがログアウトすると、すべてのアプリケーションがログアウトされます。 アプリケーションは、2 つの方法でグループにすることができます。セッション単位と ID 単位です。セッション単位のグ ループでは、認証とデータが共有されます。ID 単位のグループでは、認証のみが共有されます。 アプリケーションは CSP セッションで実行されます。各セッションにはセキュリティ・コンテキストが関連付けられています CSP セッションの詳細は、このドキュメントの "CSP セッションについて" のセクションを参照してください。 同じセッションに複数のアプリケーションを配置すると、それらのアプリケーションで認証が共有されます。これは、セッ ション単位のグループ (セッション共有) と呼ばれます。また、セッションにユーザ定義のデータが含まれる場合がありま す。リンクを介してアプリケーション間を移動するときに、アプリケーションの Cookie パスを完全に一致させるか、または CSPSHARE=1 フラグを使用することによって、アプリケーションがセッションを共有できるようになります。 マッチング・グループ識別子をアプリケーションに割り当てることによって、アプリケーションをグループ化することができ ます。これは、ID 単位のグループと呼ばれます。このグループでは、セキュリティ・コンテキストが共有されます。アプリ ケーションは通常、別々のセッションに配置されます。このグループでは、ユーザ・データが管理されることはなく、認証 のみが共有されます。 詳細は、“方法を選択するときの考慮事項” のセクションを参照してください。 4.5.1.3 セッション単位のグループ (セッション共有) セッションを共有すると、問題が発生する可能性があります。セッション・イベントは、元の CSP アプリケーションからのみ 取得できます。リンク先のページが別のセッションのイベントを要求する場合、そのセッション・イベントは実行されませ ん。また、セキュリティ・コンテキストが異なる別の CSP アプリケーションでページを実行するにはログインが必要となる場 合があります。そのログインによって、元の CSP アプリケーションで実行しているページのセキュリティ・コンテキストが影 響を受ける可能性があります。セッション単位のグループの使用を選択する前に、後述の "方法を選択するときの考慮 事項" をお読みください。 アプリケーションでセッションを共有する場合、アプリケーションではセッション・オブジェクトを介して認証とデータの両方 が共有されます。セッションを共有するには、以下の 2 つの方法があります。 1. セッションCookieパス : セッション Cookie パスが完全に一致するすべてのアプリケーションが、同一セッションに配 置されます。 2. CSPSHARE : アプリケーションのページへのリンクに CSPSHARE=1 を入れます。これは、ソース・アプリケーション のセッション Cookie パスがターゲットのセッション Cookie パスと異なる場合に使用します。 セッション単位の共有が必要な場合、最善の方法は、すべてのアプリケーションに、同一のセッション Cookie パスを指 定できるような名前を付けることです。セッション Cookie パスはアプリケーション名の部分文字列である必要があるため、 アプリケーションの名前の変更が必要になる場合があります。 これを実行できない場合にセッションの共有が必要なときは、アプリケーション間を移動するリンクに CSPSHARE パラ メータを入れる必要があります。ターゲット・アプリケーションのページは、ソース・アプリケーションのページと同じセッショ ンに配置されます。ソースのセッションは、CSPCHD パラメータとセッション Cookie のいずれかから決定されます。 詳細は、“方法を選択するときの考慮事項” のセクションを参照してください。 Caché Server Pages (CSP) の使用法 43 CSP セッション管理 4.5.1.4 ID 単位のグループ アプリケーションをグループ化するには、[システム] > [セキュリティ管理] > [ウェブアプリケーション] ページの [ID 単位 のグループ化] フィールドにグループ名を付与します。この名前により、開いているアプリケーションはまとめてグループ 化されます。グループは別々のセッションに配置されます。アプリケーションでデータを共有することはありません。 グループ名は、ネームスペースではなくアプリケーションにアタッチされます。ネームスペースに関係なく、同じグループ 名を持つアプリケーションで認証が共有されます。 認証はブラウザ単体のみで共有されます。 詳細は、“方法を選択するときの考慮事項” のセクションを参照してください。 4.5.1.5 CSPSHARE CSP は、ブラウザから要求を受信すると、受信した sessionId が有効かどうかを確認するための一連のチェックを実行し ます。チェックの内容は以下のとおりです。 • ユーザ・エージェントが、この sessionId からの以前の要求と同じものかどうか。 • cookie が使用されている場合は、この sessionId が cookie と CSPCHD パラメータのどちらから取得されたものか。 CSPSHARE=1 クエリ・パラメータを CSP に渡すと、このチェックが無効になります。その上で別の CSP アプリケーション へのリンクを構成し、そのアプリケーションに対して CSPCHD=sessionId を使用して、現在の sessionId を指定できます。 これにより、そのリンクが既存のページと同じセッションで実行されます。また、CSPSHARE=1 の場合、リンクを構成すると CSP 側で自動的に CSPCHD=sessionId をリンクに挿入します。Write 文を使用して手動でリンクを挿入する場合は、 sessionId を手動で挿入することが必要になる場合があります。 例えば、https ページから http ページ (または http ページから https ページ) を要求するアプリケーションを使用 する場合、次に示すように、そのリンクに CSPSHARE=1 を追加します。 #(..Link(%request.URL_"?CSPSHARE=1"))# CSPSHARE=1 では、クッキーが有効であると Caché が検出した場合でも、sessionId を共有するためにリンク構文を強 制的に CSPCHD に追加します。 詳細は、“CSPSHARE についての考慮事項” のセクションを参照してください。 4.5.2 認証アーキテクチャ 4.5.2.1 セキュリティ・コンテキストとスティッキー・ログイン アプリケーションはセッションで実行されます。セッションには、アプリケーションを実行するためのセキュリティ・コンテキ ストが必要です。セキュリティ・コンテキストには、認証状態が含まれます。 セッション単位および ID 単位のグループには、セッションまたはグループで最後に使用されたアプリケーションのセキュ リティ・コンテキストを記憶するスティッキー・ログインが含まれます。グループ・アプリケーション内のユーザが、別のユー ザとしてログインした場合、スティッキー・ログインは更新されます。(未認証のアプリケーションにログインする場合、ス ティッキー・ログインは更新されません。) セッション内の 1 つのアプリケーションに移動すると、セッションは、そのターゲット・アプリケーションに適したスティッキー・ ログインを使用しようとします。スティッキー・ログインがセッションの現在のセキュリティ・コンテキストと一致せず、アプリ ケーションでスティッキー・ログインの認証メソッドを受け入れることができる場合、セッションのセキュリティ・コンテキスト は、スティッキー・コンテキストのものに切り替わります。 セッションのスティッキー・ログインは、セッションの終了時に失われます。グループのスティッキー・ログインは、グループ のアプリケーションのいずれかが含まれるセッションがすべて終了したときに失われます。 44 Caché Server Pages (CSP) の使用法 認証共有の方法 初期ログインの後に、グループには、グループのいずれかのアプリケーションに入るときに使用しようとするスティッキー・ ログインが関連付けられます。このスティッキー・ログインは、グループ内の 1 つのアプリケーションに、不明なユーザとし て入るときには更新されません。これによって、グループ内のその他すべてのアプリケーションが非認証のセキュリティ・ コンテキストに移動することになるためです。 スティッキー・ログインに 2 要素認証ユーザが含まれる場合、その 2 要素認証は、ユーザ名認証が 2 つのアプリケーショ ンで一致する限り、非 2 要素アプリケーションで使用されます。 4.5.2.2 カスケード認証 CSP サーバは、アプリケーションの認証情報を取得しようとするときに、優先度を使用します。CSP サーバは、以下のイ ベントそれぞれで新しい認証情報を取得しようとします。 • 新規セッションに対する最初の要求の場合 • セッション内でアプリケーションの変更があった場合 • アプリケーションが ID 単位のグループに属していて、セッションの現在のセキュリティ・コンテキストが、グループの スティッキー・コンテキストのセキュリティ・コンテキストに一致しない場合 • ユーザ名とパスワードの組み合わせが要求に含まれる場合 CSP サーバは、以下の順序で新しい認証情報を順次取得しようとします。 1. 明示ログイン : 認証されているユーザ名とパスワードをユーザが入力したかどうか確認します。入力した場合、シス テムでは、アプリケーションの認証グループのコンテキストが更新されます (これによってグループのスティッキー・ロ グインが設定されます)。 2. スティッキー・ログイン : アプリケーションのグループのスティッキー・コンテキストを取得します。スティッキー・ログイ ンもグループ単位のセッションもない場合は、セッションの現在のコンテキストを使用します。 3. ログイン Cookie : ログイン Cookie が存在し、対象のアプリケーションで有効になっている場合に使用します。 4. 非認証 : アプリケーションに対して有効になっている場合は不明なユーザを使用します。 5. ログイン・ページの表示 : 上記すべてに失敗した場合は、ユーザ名/パスワードを入力するようにユーザに要求しま す。%CSP.Session API から呼び出された場合は、ユーザ名/パスワードのみが試行されます。UnknownUser として ログインしない限り、ログイン後に、グループのスティッキー・ログインが更新されます。 4.5.2.3 セッションのログアウトまたは終了 認証は、セッションがログアウトまたは終了すると失われます ("セッションの終了とクリーンアップ" のセクションを参照し てください。) セッションをログアウトまたは終了するには、以下の %CSP.Session メソッドを使用できます。 Set %session.EndSession = 1 これによってセッションが強制終了されます。セッションのスティッキー・コンテキストは破棄されます。OnEndSession が 呼び出されます。セッションにセッション単位のグループが含まれる場合、そのグループは破棄されます。セッションに ID 単位のアプリケーションが含まれる場合、そのアプリケーションはグループから削除され、これがグループ内の唯一の アプリケーションでない限り、グループは存続します。ログイン Cookie への影響はありません。セッション単位のグルー プは、データを失います。ただし、ID 単位のグループの場合、そのグループのスティッキー・ログインが 1 つだけの破棄 によって影響を受けることはなく、グループのその他のメンバはログインされた状態のままです。 また、セッション単位のグループの場合、破棄によってグループのメンバが分散され、メンバ・アプリケーションに再び入 る場合に、同一の新規セッションに再統合されることも、(メンバ・アプリケーションが CSPSHARE を使用してグループ化 されていた場合に) さまざまなセッションに送信されることも保証することはできません。 Caché Server Pages (CSP) の使用法 45 CSP セッション管理 do %session.Logout () セッションがログアウトされます。そのスティッキー・コンテキストは破棄されます。セッションにセッション単位のグループ が含まれる場合、そのグループ内のすべてのアプリケーションが認証を失います。セッションに ID 単位のグループに属 するアプリケーションが含まれる場合、そのグループはスティッキー・コンテキストを失い、グループ内のすべてのアプリ ケーションがログアウトされます。 さらに、OnLogout が呼び出されます。ログイン Cookie は破棄されます。 セッションは存続し、データはセッション単位のグループのために維持されます。 do %session.LogoutAll ()” 特定のユーザとして現在認証されているすべてのセッションをログアウトすることができます。 これによってログイン Cookie が破棄されます。 セッションは存続しますが、認証は失われます。 4.5.3 方法を選択するときの考慮事項 このセクションでは、方法を選択するときに考慮すべきいくつかの点を示します。使用する方法の決定の詳細は、“1 回 限りの共有 : ログイン Cookie” のセクションを参照してください。 4.5.3.1 グループの場合の考慮事項 このセクションでは、認証グループを作成するときに考慮すべきいくつかの点を示します。 1. セッション・オブジェクトを介してデータを共有する必要があると判断した場合にのみ、セッション共有を使用します。 ID 単位の共有およびログイン Cookie による共有の方が堅牢で予測可能です。 2. グループを作成する場合、できる限り一貫性を持って、ターゲット・ユーザに一様の動作を作成します。1 つのアプ リケーションを、ID 単位のグループとセッション単位のグループの両方に配置しないでください。複数の異なる認証 方法を使用すると、予期しない動作が生じる可能性があります。ID 単位の共有は、セッション単位の共有よりも優先 されます。このため、1 つのアプリケーションに両方が含まれる場合は、ID 単位で同期がとられます。 3. グループ内のすべてのメンバに同じ認証タイプを使用します。特に、グループ内の一部のアプリケーションでログイ ン Cookie が有効で、その他のアプリケーションでは有効になっていない場合、ユーザ名/パスワードを使用してグ ループに入ろうとするとグループ全体が認証されますが、ログイン Cookie を使用して入ろうとすると、一部のアプリ ケーションのみが認証されます。これによって、ログインが必要な場合もあれば、タイムアウトになる場合もあるため、 ユーザ間に混乱を招く可能性があります。 4. CSP サーバでは、あらゆるアプリケーションがいずれかの認証グループに属していると見なされます。1 つのセッショ ン内にアプリケーションが 1 つのみある場合は、単一エンティティのセッション単位の認証グループが形成されま す。 5. ID 単位のグループには、非認証のみをサポートしているアプリケーションを配置しないでください。 6. セッション単位のグループは不安定です。ID 単位の方がより堅牢な認証方法です。1 つのグループに関するすべ ての情報が、共有データを含めて、1 つのセッションに格納されるため、グループが簡単に失われる可能性がありま す。これは、セッションがタイムアウトする可能性がある、つまり一定時間を過ぎるとセッションが自動的に破棄される ためです。ユーザがコンピュータから離れたり、対象のセッション単位のグループには属していないアプリケーション を使用したりすると、セッションがタイムアウトになる場合があります。グループ内のアプリケーションのいずれかに ENDSESSION=1 が指定されると、グループは分散されます。 7. ブラウザで、分散されたアプリケーションのページが含まれるタブが開いているときに、それらのタブをクリックすると、 特にそれらのアプリケーションが元々 CSPSHARE=1 を使用してグループ化されていた場合に、複数のログインが 必要になることがあります。いずれの場合でも、元のセッションのデータは完全に失われます。 8. グループが認証を失うと、ページを更新するとき、またはグループのアプリケーションの開いているページに移動す るときに、ユーザの再ログインが必要になります。 46 Caché Server Pages (CSP) の使用法 認証共有の方法 9. セッション単位のアプリケーションが含まれるセッションを終了する場合には、そのセッション単位のグループ内のい ずれかのアプリケーションのいずれかのページを更新するときに、ユーザは再ログインする必要があります。ID 単位 のアプリケーションが含まれるセッションを強制終了する場合には、そのセッションのアプリケーションがグループ内 の唯一のメンバであった場合を除き、ログインは必要ありません。 10. セッションをログアウトすると、そのセッションのグループのすべてのメンバが、たとえ異なるセッションに入っていた 場合でもログアウトされます。グループのページのいずれかを更新するには、新規ログインが必要です。ただし、ID 単位のグループの場合、1 回のログインでグループ全体にログインされます。セッション単位のグループの場合、分 散されたアプリケーションを新しく作成されたセッション・オブジェクトに戻すことが CSP ゲートウェイで可能である限 り、1 回のログインでグループ全体にログインされます。 11. ログアウトしてもセッションが破棄されることはないため、セッションのデータはすべて存続します。 12. 同一ブラウザの別々のタブで、2 人の異なるユーザが同一アプリケーションにログインすることはできません。 13. 認証はブラウザ単体のみで共有されます。この実行時識別子は、%Session オブジェクトに格納されます。 14. グループ化により、認証を同じグループ (ID 単位) もしくは同じセッション (セッション単位) 内にいるユーザと共有で きるようになります。指定したグループの外部にあるアプリケーションから認証を共有する場合、ログイン Cookie を 使用します。指定したグループの外部にあるアプリケーションに認証を送付する場合、CSPSHARE=1 を使用します (このドキュメントの “CSPSHARE についての考慮事項” を参照してください)。 4.5.3.2 CSPSHARE についての考慮事項 CSPSHARE は、最後の手段として使用してください。 以下の場合、セッション単位のアプリケーションのリンクには、CSPSHARE=1 は必要ありません。 • ソース・アプリケーションとターゲット・アプリケーションのグループ ID が同じ場合 • ターゲット・ページが、ソース・ページと同じアプリケーションに含まれている場合 • ターゲット・ページのアプリケーションのセッション Cookie パスが、このソース・アプリケーションのセッション Cookie パスと一致する場合 4.5.3.3 データの共有 セッション単位のグループでは、セッション・オブジェクトを介してデータを共有できます。 ID 単位のグループでは、グループ自身のデータを管理する必要があります。例えば、データをグローバルに格納する 場合、現在のユーザ $Username またはグループの実行時の ID を使用して、そのデータにキーが割り当てられることが あります。CSP サーバによって、各ブラウザに browser-id Cookie が割り当てられます。ID 単位のグループの作成時に、 そのグループには、group-id と連結されたブラウザ id であるキーが割り当てられます。これによって一意のキー %CSP.Session.BrowserId が作成され、データの格納時に割り当てるキーとして使用できます。 Caché Server Pages (CSP) の使用法 47 5 CSP におけるタグを使用した開発 CSP を使用すると、標準の HTML ファイルを使用して CSP アプリケーションを開発できます。この機能は CSP コンパイ ラといい、HTML ドキュメントおよび XML ドキュメントを、HTTP 要求への応答が可能な %CSP.Page クラスに変換しま す。 CSP コンパイラで生成されたクラスは、プログラマ自身が作成したクラスとまったく同じなので、相互運用にも問題はあり ません。CSP ページの開発方法として、HTML ページを使用する方法、または %CSP.Page を拡張したクラス (これはア プリケーションで使用できます) を作成する方法を選択できます。生成した CSP クラスを検証しておくと、デバッグ時に役 立ちます。 CSP コンパイラで処理した HTML ドキュメントには、例えば、クラスの生成を管理するタグ、コントロール・フローを提供 するタグ、データ・アクセスを管理するタグ、およびサーバ側の動作を制御するタグを記述できます。これらのタグは、CSP マークアップ言語または CSP タグです。これらのタグは、開発時に CSP サーバで解釈されます。HTTP クライアントに 送信される HTML は、完全に標準に準拠したもので、CSP タグを持っていません。 CSP ファイルでは、通常の HTML タグ以外に、以下も使用できます。 • #( )# を使用した Caché データ式は、ページが生成されるときに値を置換します。 • Caché CSP タグ <csp:xxx> は、組み込み機能およびユーザ定義機能を提供します。 • Caché スクリプト <script language=cache runat=server/compiler> は、ページの生成時あるいはコン パイル時に Caché コードを実行します。 • Caché の各メソッドは、ページから起動できる再使用可能なクラス・メソッドです。 • サーバ側のサブルーチン呼び出しである #server()# および call()# は、クライアント側のコード (ハイパーイベント) からサーバ側のサブルーチンを実行します。 • “カスタム・タグの開発” の章で説明されているカスタム・タグ。 5.1 CSP コンパイラ CSP コンパイラは、Caché サーバ上で動作する Caché クラスとプログラムのセットで、以下の動作を実現します。 1. CSP マークアップ言語を使用して HTML ドキュメントを読み取り、解析します。 2. CSP ルールに基づいてパターン・マッチング論理を適用します。 3. Caché クラスを生成します。 4. このクラスを実行可能コードにコンパイルします。 Caché Server Pages (CSP) の使用法 49 CSP におけるタグを使用した開発 例えば、以下の簡単な CSP ドキュメント hello.csp をコンパイルするとします。 <html> <body> Hello! </body> </html> CSP コンパイラは、これを以下のようなクラスに変換します。 Class csp.hello extends %CSP.Page { ClassMethod OnPage() As %Status { Write "<html>" Write "<body>" Write "Hello!" Write "</body>" Write "</html>" Quit $$$OK } } ユーザがブラウザから hello.csp を要求すると、CSP サーバは生成した OnPage メソッドを呼び出し、CSP ドキュメントの 元のテキストをブラウザに送信して表示できるようにします。 5.1.1 自動および手動によるページ・コンパイル CSP サーバで CSP ソース・ドキュメントをクラスにコンパイルする処理は、自動的に実行できるほか、手動で実行するこ ともできます。 ・モード (既定) では、必要に応じて CSP ソース・ドキュメントをクラスにコンパイルする指示が、CSP サーバか ら自動的に CSP コンパイラに出されます。CSP サーバは、ソース・ファイルとクラスのタイムスタンプを比較し、クラスのタ イムスタンプより新しいソースを持つページをすべて再コンパイルします。一般的に、タイムスタンプを確認するための オーバーヘッドを回避するために、展開済みのアプリケーションでは、このモードはオフになっています。 をオフにするには、以下の手順に従います。 1. 管理ポータルで、[システム] > [セキュリティ管理] > [ウェブアプリケーション] の順にクリックします。 2. アプリケーションをテーブルから選択して [編集] をクリックします。 3. [CSPアプリケーション編集] ページで、[自動コンパイル] を無効にします。 CSP ソース・ファイルをクラスに明示的にコンパイルできます。これはエラーの検出に便利です。 1. Caché スタジオで CSP ソース・ファイルを開きます。 2. [ビルド]→[コンパイル] を選択します。 以下の例に示すように、$system.CSP API を使用して Caché コマンド行 (ターミナル) から CSP ソース・ファイルをコンパ イルすることもできます。このメソッドは、物理的パスではない URL パス /csp/user/mypage.csp を持つ CSP ファイルを ロードし、コンパイルします。c (コンパイル) フラグは、生成されたクラスをコンパイルすることを示します。k フラグ (保持) は、生成された中間コードを表示できるように保持することを示します。 Do $system.CSP.LoadPage("/csp/user/mypage.csp","ck") 5.2 CSP マークアップ言語 CSP マークアップ言語とは、CSP コンパイラで生成したクラスを制御するために使用する指示文やタグのセットです。 50 Caché Server Pages (CSP) の使用法 CSP マークアップ言語 CSP ドキュメントをコンパイルすると、Caché ObjectScript コードまたは Basic コードを実行する Caché クラスが得られま す。これを知っていると、正しいアプリケーション・ロジックの開発や、トラブルシューティングに役立ちます。CSP と CSP マークアップ言語を詳しく知るには、CSP コンパイラで生成したコードの検証が役立ちます。 また、HTTP 要求に応答するために、CSP サーバ上で実行されるコードや、HTTP クライアント上で実行されるコード (HTML や JavaScript) を追跡することも重要です。 5.2.1 CSP ページ言語 既定では、CSP コンパイラは実行時式を評価し、Caché ObjectScript を使用してコードを生成します。指定された CSP ドキュメントで、ドキュメントの先頭に PAGE 指示文を記述すると、この既定を Basic に変更できます。 <%@ page language="Basic" %> 例えば、CSP サンプル (ソースを表示するには [ソース] をクリックします) にある basic.csp アプリケーションを参照してく ださい。 CSP ドキュメントでは、実行時式やサーバ側の <script> タグのコンテンツに、そのページの既定の言語を使用する必要 があります (別の言語を使用するとコンパイル時にエラーが発生します)。または、別の言語でメソッドを定義し、既定の 言語からそのメソッドを呼び出します。 5.2.2 テキスト CSP ドキュメント (HTML または XML) のテキストで、CSP 指示文や CSP 独自のタグでないものは、ページを要求して いる HTTP クライアントにそのまま送信されます。 例えば、以下のような CSP ドキュメントがあります。 <b>Hello!</b> これは、生成されたクラスに以下のコードを生成します。 Write "<b>Hello!</b>",! その後、以下を HTTP クライアントに送信します。 <b>Hello!</b> 5.2.3 コンパイル時の式とコード 式の評価を、CSP ページの実行時ではなく、コンパイル時に実行するように指定できます。これらの式は通常は、CSP 規則の定義内で使用されますが、他の定義で使用されることもあります。 コンパイル時の式は、##( expr )## 指示文で区切ります。expr は、Caché ObjectScript の式です。 例えば、以下のような CSP ドキュメントがあります。 This page was compiled on: <b>##($ZDATETIME($H,3))##</b> これは、生成されたクラスに以下のコードを生成します。 Write "This page was compiled on <b>2000-08-10 10:22:22</b>",! <script> タグの runat 属性を使用して、ページのコンパイル時にコード行を実行するように定義できます。 <script language="Cache" runat="compiler"> 注釈 すべてのコンパイル時式およびコードの記述には、Caché ObjectScript を使用する必要があります。 Caché Server Pages (CSP) の使用法 51 CSP におけるタグを使用した開発 5.2.4 実行時式 CSP ドキュメントには、ページが処理されるとき (実行時) に CSP サーバ上で実行される式を記述できます。その場合、 複数の式は #(expr)# 指示文で区切ります。ここで、expr には、ページの既定の言語に応じて、有効な Caché ObjectScript 式または Basic 式を指定します。実行時式の言語は、CSP ドキュメントの既定の言語と一致している必要があります。 注釈 #(expr)# 指示文では、名前間接演算はサポートされていますが、引数間接演算はサポートされていないことに 注意してください。 例えば、以下のような CSP ドキュメントがあります。 Two plus two equals <b>#(2 + 2)#</b> これは、生成されたクラスに以下のコードを生成します。 Write "Two plus two equals <b>", (2 + 2), "</b>",! その後、以下を HTTP クライアントに送信します。 Two plus two equals <b>4</b> 実行時式のサンプルは、以下のとおりです。 • ページに以前に設定した変数の値 The answer is <b>#(answer)#</b>. • オブジェクトのプロパティあるいはメソッド Your current balance is: <b>#(account.Balance)#</b>. • %ResultSet オブジェクト内のフィールド <table> <csp:while condition="result.Next()"> <tr><td>#(result.Get("BookTitle"))#</td></tr> </csp:while> </table> • %request オブジェクトを使用した URL パラメータ <table bgcolor='#(%request.Data("tablecolor",1))#'></table> 実行時式は、#(expr)# を正当な HTML として使用できる CSP ドキュメントの中であれば、どこにでも記述できます。つま り、HTML 要素の属性値として HTML テキストに記述したり、クライアント側の JavaScript コードの定義に記述したりす ることができます。 実行時式の値に特殊文字 (<、>、山括弧など) がある場合は、それらをエスケープし、正しいエスケープ・シーケンスが HTTP クライアントに送信されるようにする必要があります。%CSP.Page クラスが提供するエスケープ・メソッドの 1 つを使 用してエスケープします。詳細は、“HTTP 出力のエスケープと引用” を参照してください。以下の例は、EscapeHTML クラスメソッドを示しています。メソッドを実行すると、object.Description に存在する、エスケープ処理が必要な文字はす べて、該当する HTML エスケープ・シーケンスに置き換えられます。 Description: <b>#(..EscapeHTML(object.Description))#</b>. HTML 属性値に実行時式を使用している場合、実行可能なコードに変換する前に、実行時式に検出された HTML エ ンティティはそれが表す文字に変換されます。以下はその例です。 <font size=#(1 > 0)#> これは、生成されたクラスに以下のコードを生成します。 52 Caché Server Pages (CSP) の使用法 CSP マークアップ言語 Write "<font size=",(1 > 0),">",! 5.2.5 実行時コード CSP サーバで実行する複雑な式をページに記述する必要がある場合、<script runat=server> タグを使用して、 CSP サーバ上で実行するコード行を配置できます。実行時式と同様に、実行時コードもさまざまな用途に使用できます。 <script> タグの LANGUAGE 属性で指定する、実行時コードで使用する言語は、CSP ドキュメントの既定の言語と一 致している必要があります。 例えば、以下のような CSP ドキュメントがあります。 <ul> <script language="cache" runat=server> For i = 1:1:4 { Write "<li>Item ",i,! } </script> </ul> これは、生成されたクラスに以下のコードを生成します。 Write "<ul>",! For i = 1:1:4 { Write "<li>Item ",i,! } Write "</ul>",! その後、以下を HTTP クライアントに送信します。 <ul> <li>Item <li>Item <li>Item <li>Item </ul> 1 2 3 4 5.2.6 実行時コード ObjectScript 単一行 以下の構文を使用して、ObjectScript の単一行を実行できます。これは、単一行に対してのみ機能します。行を折り返 すことはできません。 #[ set x = a + b write x ]# 5.2.7 サーバ側メソッド CSP ドキュメントでは、CSP 用に生成されたクラスに属するメソッドを定義できます。これには、<script> タグを持つ引 数を使用します。 メソッド名、引数リスト、返り値のタイプや、メソッドの実装に使用する言語を指定することができます。この言語は、CSP ド キュメントの 既定の言語 と一致している必要はありません。 例えば、以下は MakeList というメソッドを定義します。このメソッドは、count アイテムを含む番号付きリストを作成します。 <script language="Cache" method="MakeList" arguments="count:%Integer" returntype="%String"> New i Write "<ol>",! For i = 1:1:count { Write "<li> Item",i,! } Write "</ol>",! Quit "" </script> Caché Server Pages (CSP) の使用法 53 CSP におけるタグを使用した開発 これにより、CSP ドキュメントのどこからでもこのメソッドを実行できます。 <hr> #(..MakeList(100))# <csp:class> タグによる継承機能を使用して、以前に定義したメソッドをページ・クラスに継承したり、他のクラスのクラス・ メソッドを呼び出したりすることもできます。 <hr> #(##class(MyApp.Utilities).MakeList(100))# 5.2.8 SQL <script> タグ 以下の <script> タグを使用することで、SQL を使用して CSP ページ内で Caché %ResultSet オブジェクトを定義で きます。 この例では、query という名前のダイナミック SQL %ResultSet オブジェクトのインスタンスを生成し、指定された SQL ク エリを作成、実行します。ここでは、このクエリを繰り返し実行できるようにしています。 <script language="SQL" name="query"> SELECT Name FROM MyApp.Employee ORDER BY Name </script> 通常、クエリ結果を表示するためには、SQL script タグで生成した %ResultSet オブジェクトを、<csp:while> タグ ("csp:WHILE Tag" 参照) と共に使用します。 SQL <script> タグは、ページの実行が終了すると、%ResultSet オブジェクトのインスタンスを閉じます。 SQL テキスト内で ? 文字を使用して、SQL クエリのパラメータを指定できます。また、SQL <script> タグで P1、P2、... Pn (n はパラメータ番号) の各属性を使用して、パラメータ値を指定できます。 以下の例では、SQL <script> タグを使用して現在のユーザの購入内容を表示します。現在のユーザのユーザ ID は、元々 %session オブジェクトに格納されていると仮定します。 <script language=SQL name=query P1='%session.Data("UserID")'> SELECT DateOfPurchase,ItemName,Price FROM MyApp.Purchases WHERE UserID = ? ORDER BY DateOfPurchase </script> <hr> Items purchased by: <b>#(%session.Data("UserID"))#</b> <br> <table> <tr><th>Date</th><th>Item</th><th>Price</th></tr> <csp:while condition="query.Next()"> <tr> <td>#(..EscapeHTML(query.GetData(1)))#</td> <td>#(..EscapeHTML(query.GetData(2)))#</td> <td>#(..EscapeHTML(query.GetData(3)))#</td> </tr> </csp:while> </table> <csp:query> タグを使用すると、Caché クラスの一部として定義したクエリを使用して %ResultSet オブジェクトを生成でき ます。 <csp:query NAME="query" CLASSNAME="Sample.Person" QUERYNAME="ByName"> SQL <script> タグで使用するときと同様に、%ResultSet オブジェクトの結果を使用できます。 5.2.9 生成されたクラスの管理 <csp:class> タグを使用して、CSP コンパイラで生成したクラスを管理できます。例えば、クラスのスーパークラスの選択 や、%CSP.Page クラス・パラメータの多くに対する値の定義などができます。 54 Caché Server Pages (CSP) の使用法 コントロール・フロー 例えば、通常の %CSP.Page クラスから継承するクラスのほかに、別のクラスからも継承するクラスを生成するとします。 SUPER 属性は、コンマ区切りで列挙したクラスのリストを持ち、生成されたクラスのスーパークラスとしてこれらのクラスを 使用します。 <csp:class SUPER="%CSP.Page,MyApp.Utilities"> 以下は、クラス・パラメータの値を再定義する例です。クラス・パラメータ PRIVATE の値を 1 に再定義して、ページをプ ライベート・ページとするには、以下のように指定します。 <csp:class PRIVATE=1> 5.3 コントロール・フロー CSP マークアップ言語には、ページの実行管理を容易にするタグがいくつかあります。サーバ側のタグほど汎用的では ありませんが、これらのタグの使用により特定のタスクの実行が容易になります。 5.3.1 <csp:if> タグ <csp:else> タグおよび <csp:elseif> タグと組み合わせて <csp:if> タグを使用することで、CSP ページに条件付き出力を 定義できます。 <csp:if> タグには condition という唯一の属性があります。その属性値には、ページに指定した既定の言語に応じて、 Caché ObjectScript 式または Basic の式を指定します。この式は実行時に CSP サーバによって評価されます。値が True の場合、タグの内容が実行されます。 以下はその例です。 <csp:if condition='user="Jack"'> Welcome Jack! <csp:elseif condition='user="Jill"'> Welcome Jill! <csp:else> Welcome! </csp:if> 5.3.2 <csp:while> タグ <csp:while> タグは、指定されたサーバ側の条件が True の場合、CSP ドキュメントのセクションを繰り返し処理します。 <csp:while> タグの condition 属性には、ページに指定した既定の言語に応じて、ObjectScript または Basic の式を 指定します。この値は、ページが提供される際に CSP サーバで評価されます。この条件が True (1) である限り、 csp:while タグの内容が 評価されます。 一般に <csp:while> タグは、Caché の %ResultSet オブジェクトと併用して、SQL クエリの結果を HTML に表示する ために使用します。以下の例では、クエリの Name 列の値を出力する <csp:while タグの内容が、%ResultSet オブ ジェクトの Next メソッドが結果セットの終了を示す False (0) を返すまで繰り返し実行されます。 <script language=SQL name=query> SELECT Name FROM MyApp.Employee ORDER BY Name </script> <csp:while condition="query.Next()"> #(..EscapeHTML(query.Get("Name")))#<BR> </csp:while> <csp:while> タグの counter 属性を使用して、カウンタ変数の初期値をゼロ (0) とし、反復が開始するたびに自動 的に 1 ずつインクリメントするように定義できます。 Caché Server Pages (CSP) の使用法 55 CSP におけるタグを使用した開発 例えば、以下の <csp:while> タグは、HTML で 5 列のテーブルを作成します。 <table> <csp:while counter="row" condition="row<5"> <tr><td>This is row #(row)#.</td></tr> </csp:while> </table> 以下は、条件で否定演算子 (一重引用符) を使用した例です。条件には、スペースを含めることはできず、また、開始引 用符も終了引用符も含まれないことに注意してください。(mystr'=”QUIT”) のように括弧を使用して条件を記述する こともできます。 <csp:while condition=mystr'="QUIT"> //add code </csp:while> 5.3.3 <csp:loop> タグ : 番号を割り当てたリストの例 CSP ドキュメントでコンテンツを繰り返し実行するには、<csp:loop> タグを使用する方法もあります。 <csp:loop> タグを使用すると、counter 属性を使用してカウンタ変数を定義できるほか、開始値、終了値、増分値を 定義できます。既定の増分値は 1 です。 例えば、以下のように <csp:loop> タグを使用して、5 つの項目を含むリストを作成できます。 <ul> <csp:loop counter="x" FROM="1" TO="5"> <li>Item #(x)# </csp:loop> </ul> 5.4 HTTP 出力のエスケープと引用 HTML で使用された特殊文字のリテラル表示を作成するには、エスケープ・シーケンスを使用する必要があります。例 えば、HTML で特殊な意味を持つ > (右山括弧) 文字を HTML で表示するには、一連の文字 > を使用してエス ケープする必要があります。CSP ドキュメントの異なる部分では、異なるエスケープ規則が適用される場合もあります (HTML や JavaScript など)。 %CSP.Page クラスは、多数のエスケープ・メソッドと引用メソッドを提供しています。 • エスケープ・メソッド は、入力された文字列を受け取り、特殊文字が含まれている文字列を適切なエスケープ・シー ケンスに置換して返します。 • 引用メソッドは、入力された文字列を受け取り、引用符で囲まれた文字列にして返します。引用符で囲まれた文字 列の特殊文字はすべて、エスケープ・シーケンスに置換されます。 • また、各エスケープ・メソッドに対し、エスケープ・シーケンスを普通のテキストに置換するアンエスケープ・メソッドも あります。 5.4.1 EscapeHTML による HTML のエスケープ %CSP.Page クラスは、文字を対応する HTML のエスケープ・シーケンスに置換できます。 例えば、CSP ファイルからサーバ側の変数 x の値をブラウザで表示する必要がある場合、x に使用されている任意の文 字を以下の式でエスケープできます。 #(..EscapeHTML(x))# 56 Caché Server Pages (CSP) の使用法 HTTP 出力のエスケープと引用 x の値が <mytag> の場合、HTTP クライアントに送信されるテキストは以下のようになります。 <mytag> 同様に、エスケープ処理は HTML 属性の値を送信する場合に必要です。 <input type="BUTTON" value="#(..EscapeHTML(value))#"> value の値が <ABC> の場合、HTTP クライアントに送信されるテキストは以下のようになります。2 つの左右の山括弧は、 それぞれ対応する文字シーケンス < および > に置き換えられます。 <input type="BUTTON" value="<ABC>"> #()# 指示文を "" (二重引用符) で囲むと、HTML 属性値の結果が引用符で囲まれます。 データベースから HTTP クライアントに出力を送信する場合は、必ず出力をエスケープすることをお勧めします。例え ば、以下は Web ページにユーザ名を書き込む式です (user は Name プロパティを持つオブジェクトへの参照であると します)。 User name: #(user.Name)# ユーザがデータベースに自分の名前を入力できるアプリケーションで、以下のように、HTML コマンドを含む名前が誤っ て入力されたとします。HTML エスケープ・シーケンスを使用せずに、この名前が HTTP クライアントに書き込まれると、 このページは予期しない動作をします。 Set user.Name = "<input type=button onclick=alert('Ha!');>" 5.4.2 EscapeURL による URL パラメータのエスケープ URL 文字列のパラメータ値もエスケープできます。URL で使用するエスケープ・シーケンスのセットは、HTML で使用 するものとは異なっています。%CSP.Page クラスの EscapeURL メソッドでは、文字を処理するすべての特殊な URL パ ラメータ値を、対応するエスケープ・シーケンスに置換します。 例えば、CSP ファイルからサーバ側の変数 x の値を URL パラメータ値として使用する場合、x に使用されている任意の 文字を以下の式でエスケープできます。 <a href="page2?ZOOM=#(..EscapeURL(x))#">Link</A> x の値が 100% の場合、HTTP クライアントに送信されるテキストは以下のようになります。% 文字は %25 とエスケープさ れます。 <a href="page2?ZOOM=100%25">Link</A> 5.4.3 QuoteJS による JavaScript のエスケープ %CSP.Page クラスの文字列は、すべての特殊な文字列を、対応する JavaScript のエスケープ・シーケンスに置換しま す。 例えば、警告ボックスにメッセージを表示するクライアント側の JavaScript 関数を CSP ファイルで定義するとします。メッ セージはサーバ側の変数 x で指定します。x の値は、以下を使用して JavaScript の引用符で囲まれた文字列に変換さ れます。 <script language="JavaScript"> function showMessage() { alert(#(..QuoteJS(x))#); } </script> Caché Server Pages (CSP) の使用法 57 CSP におけるタグを使用した開発 x の値が “Don't press this button!” の場合、HTTP クライアントに送信されるテキストは以下のようになります。 <script language="JavaScript"> function showMessage() { alert('Don\'t press this button!'); } </script> 5.5 サーバ側のメソッド CSP は、HTML クライアントからサーバ側のメソッドを呼び出す 2 つのテクニックを提供します。 • HTTP 送信機能の使用 • #server (同期) または #call (非同期) のいずれかのハイパーイベントの使用 HTTP 送信を使用する利点は、クライアント側のプログラミングが簡単であり、クライアント側のコンポーネントが必要ない ことです。HTTP 送信の使用の短所は、メソッド呼び出しの後にページがクライアントによって再描画され、サーバ側の プログラミングがより難しくなることです。 ハイパーイベントを使用する場合、XMLHttpRequest を使用して #server および #call を実装します。#call は非同期で す。(ユーザとして) Web ページに値を入力しても、ページは直ちには更新されません。ページが更新されるときまでに、 ユーザは別のページに移動している場合があります。#server は同期です。ページは、呼び出しから値が返されたときに すぐに更新されます。 HTTP 送信およびハイパーイベントについては、以下のセクションで詳述します。 5.5.1 Caché と AJAX AJAX という略語は、一般的に、クライアント側のページに表示されるサーバのデータが、ブラウザに新しいページが表 示されるよう要求しなくても更新されるようにするための、一連のテクノロジを意味します。Caché ハイパーリンクを使用す ると AJAX による対話が可能となるので、プログラマにとっては、サーバとの面倒な通信処理がまったく不要になるという 利点があります。Caché で AJAX トランザクションを処理できるようにするには、以下の 2 つの方法があります。 1. CSP の場合は、#server() コマンドと #call() コマンドを使用して、クライアントからサーバ側のメソッドを直接呼び出せ るようにします。 2. Zen の場合は、プログラマが Zen の WebMethod を定義することにより、クライアントとサーバの対話を処理できま す。この WebMethod は、メソッド・シグニチャによって同期または非同期にすることができます。 同期 AJAX 要求のシグニチャ Method XYZ(arg) as %Status [WebMethod] 非同期 AJAX 要求のシグニチャ Method XYZ [WebMethod] 5.5.2 HTTP 送信を経由したサーバ側メソッドの呼び出し HTTP 送信を使用してサーバ・コードを実行する場合、ブラウザで必要とする機能はほとんどありません。これは、膨大 な数のユーザを対象としてさまざまなブラウザをサポートする必要のあるアプリケーションには最適な手法です。HTTP 送信を使用する場合、ユーザが SUBMIT ボタンをクリックするたびに要求されたページが再表示されます。 以下のようにして、HTTP 送信を実行できます。 58 Caché Server Pages (CSP) の使用法 サーバ側のメソッド 1. 以下のように SUBMIT ボタンのある HTML フォームを作成します。 <form name="MyForm" action="MyPage.csp" method="GET"> User Name: <input type="TEXT" name="USERNAME"><br> <input type="SUBMIT" name="BUTTON1" value="OK"> </form> これは、テキスト・フィールド [USERNAME] と SUBMIT ボタンの [BUTTON1] がある単純なフォームです。フォーム の ACTION 属性には、フォームの送信先の URL を指定します。METHOD 属性は、POST または GET のどちらの HTTP プロトコルを使用してフォームを送信するかを指定します。 2. ユーザが SUBMIT ボタンである [BUTTON1] を押すと、ブラウザはフォームにあるすべてのコントロールから値を集 め、フォームの ACTION 属性で指定されている URL に値を送信します(ただし、ACTION 属性でページの名前を 指定するか、ACTION 属性を空白のままにすることによって、ページはそれ自体に送信し返すことができます)。 フォームが、POST または GET のどちらで送信されたのかにかかわらず、CSP は送信された値を URL パラメータと して処理します。この場合、フォームの送信は、以下の URL の要求に相当します。 MyPage.csp?USERNAME=Elvis&BUTTON1=OK これには、SUBMIT ボタンの名前と値が記述されています。フォームに複数の SUBMIT ボタンがある場合、実際に 押されたデータ・ボタンのみが要求に記述されます。これにより、いつ SUBMIT が実行されたかを検出できます。 3. サーバ・コードは (この場合は MyPage.csp)、送信されたことを検出します。これは、以下のように %request オブ ジェクトの BUTTON1 名をテストすることで実現します。 <script language="Cache" runat="SERVER"> // test for a submit button If ($Data(%request.Data("BUTTON1",1))) { // this is a submit; call our method Do ..MyMethod($Get(%request.Data("USERNAME",1))) } </script> 4. 必要なサーバ側のロジックの実行後、サーバ・コードは継続し、ブラウザで表示する HTML を返します。これにより、 現在のフォームが再表示されるか、異なるページが表示されます。 5.5.3 ハイパーイベント #server および #call を使用したサーバ側メソッドの呼び出し ハイパーイベントは、インタラクティブな Web アクションを作成するための Web ブラウザ・イベントおよび Web 開発技術 の当社の CSP 拡張です。ハイパーイベントを使用すると、クライアントの Web ブラウザでのイベントに応答して、クライア ントで HTML ページを再ロードせずに、Caché サーバでクラスのメソッドを実行できます。この機能は一般的に AJAX と 呼ばれています。Caché ハイパーイベントはさまざまな状況で使用できますが、特に、Web ページ全体の再ロードや再 フォーマットをせずに、データベースを検証または検索することが必要なデータベース・アプリケーションに最適です。通 常、ハイパーイベントは、XMLHttpRequest を使用して実装されます。 クラスを使用して CSP ページを作成している場合、ハイパーイベントに必要な JavaScript をロードするために <head> セクションの出力中に ..HyperEventHead メソッドを呼び出す必要があります。 5.5.3.1 #server を使用したサーバ側メソッドの呼び出し CSP ファイル内で、#server 指示文を使用して、サーバ側のメソッドを呼び出すことができます。この指示文は JavaScript が使用できれば、どこででも使用できます。 #server 指示文の構文は以下のとおりです。 #server(classname.methodname(args,...))# classname はサーバ側の Caché のクラスの名前、methodname はそのクラスのメソッドの名前です。また、args はサーバ 側メソッドに渡されるクライアント側の JavaScript の引数のリストです。例えば、Caché クラスの MyPackage で、サーバ側 のメソッド Test を呼び出すには、以下のように指定します。 Caché Server Pages (CSP) の使用法 59 CSP におけるタグを使用した開発 <script language="JavaScript"> function test(value) { // invoke server-side method Test #server(MyPackage.Test(value))#; } </script> CSP コンパイラは、#server 指示文が現れるたびに、それをサーバ側のメソッドを呼び出す JavaScript コードに置換しま す。 指定された CSP ページから ..MethodName 構文を使用して、生成されたクラスに属するメソッドを呼び出すことができま す。以下に例を示します。 #server(..MyMethod(arg))# 5.5.3.2 #call を使用したサーバ側メソッドの呼び出し 同時性は、呼び出されるメソッドが #server と #call のいずれであるかによって決まります。#server は同期で、#call は非 同期です。 同期呼び出しでは、UI 応答における一時停止 (待機) が顕著に発生する場合があります。一方、非同期呼び出しには、 特有の利点だけでなく問題点もあります。例えば、ユーザが Web ページに値を入力すると、ページは直ちには更新さ れません。ページが更新されるときまでに、ユーザは別のページに移動している場合があります。 #server が非同期の場合、サーバ側のメソッドを呼び出しても、#server は返り値を待ちません。代わりに、ユーザのアプ リケーションはサーバから返送される JavaScript に依存し、必要な処理をクライアントで実行します。 #call は非同期です。サーバ側のメソッドを呼び出しても、#call は返り値を待ちません。代わりに、ユーザのアプリケー ションはサーバから返送される JavaScript に依存し、必要な処理をクライアントで実行します。 非同期の #call を使用する場合、複数の連続した呼び出しを行うときは注意が必要です。前のメソッドの完了前に #call を介して別のメソッドを呼び出すと、Web サーバが前のメソッド呼び出しのキャンセルを決定する場合があります。 #server と同様に、#call 指示文は、JavaScript が使用できれば、どこででも使用できます。 #call 指示文の構文は以下のとおりです。 #call(classname.methodname(args,...))# classname はサーバ側の Caché のクラスの名前、methodname はそのクラスのメソッドの名前です。また、args はサーバ 側メソッドに渡されるクライアント側の JavaScript の引数のリストです。例えば、Caché クラスの MyPackage で、サーバ側 のメソッド Test を呼び出すには、以下のように指定します。 <script language="JavaScript"> function test(value) { // invoke server-side method Test #call(MyPackage.Test(value))#; } </script> CSP コンパイラは、#call 指示文が現れるたびに、それをサーバ側のメソッドを呼び出す JavaScript コードに置換します。 指定された CSP ページから ..MethodName 構文を使用して、生成されたクラスに属するメソッドを呼び出すことができま す。以下はその例です。 #call(..MyMethod(arg))# 5.5.3.3 ハイパーイベントの例 このセクションでは、ハイパーイベントの例をいくつか示します。ここでは、#server 指示文と #call 指示文を使用して、ク ライアント・イベントに応答するサーバの動作を実行します。例えば、新規顧客をデータベースに追加するフォームがあ るとします。顧客の名前が入力されると、アプリケーションは同じ顧客名がデータベースに存在するかどうかを調べます。 以下のフォーム定義は、入力内容が変更されたときに、サーバ側の Find メソッドを呼び出します。 60 Caché Server Pages (CSP) の使用法 サーバ側のメソッド <form name="Customer" method="POST"> Customer Name: <input type="Text" name="CName" onChange=#server(..Find(document.Customer.CName.value))# > </form> この場合、Find メソッドは、同じ CSP ファイルで次のように定義されます。 <script language="Cache" method="Find" arguments="name:%String"> // test if customer with name exists // use embedded SQL query New id,SQLCODE &sql(SELECT ID INTO :id FROM MyApp.Customer WHERE Name = :name) If (SQLCODE = 0) { // customer was found // send JavaScript back to client &js<alert('Customer with name: #(name)# already exists.');> } </script> このメソッドは、クライアントと通信し、実行するための JavaScript を返信します。 サーバ側メソッドが呼び出されるたびに、主デバイスへ書き込まれるすべての出力はクライアントに返送されます。そこで JavaScript 関数に変換され、クライアント・ページにより、クライアント・ページのコンテキストで実行されます。 例えば、サーバ側のメソッドが以下のコード行を実行したとします。 Write "CSPPage.document.title = 'New Title';" 以下の JavaScript がクライアントに送信、実行されます。 CSPPage.document.title = 'New Title'; この場合、ブラウザの表示タイトルは New Title に変更されます。この方法で、任意の有効な JavaScript をクライアン トに送信できます。JavaScript の各行の末尾には、キャリッジ・リターン (! 文字を使用) を記述します。これがないと、ブラ ウザは JavaScript を実行できません。 サーバ・メソッドから容易に JavaScript が得られるように、Caché ObjectScript は、&js<> 指示文を使用して埋め込み JavaScript をサポートします。これは、Caché ObjectScript メソッドで JavaScript の行を指定するための特殊な言語構造 です。埋め込み JavaScript を含むメソッドをコンパイルすると、&js<> 指示文のコンテンツは、適切な Write コマンド文に 変換されます。埋め込み JavaScript は、#()# 指示文を使用して Caché ObjectScript 式を参照できます。 例えば、以下のような Caché メソッドがあります。 Set count = 10 &js< for (var i = 0; i < #(count)#; i++) { alert('This is pleasing!'); } > これは、以下と同等です。 Set count = 10 Write "for (var i = 0; i < ", count, "; i++) {",! Write " alert('This is pleasing!');",! Write "}",! クライアントからこのメソッドを呼び出すと、心地良い警告メッセージが 10 回表示されます。 5.5.3.4 CSP クラスでの #server の使用法 CSP クラス内でハイパーイベントおよび Javascript を使用するには、明示的にハイパーイベント・ブローカ・ファイルを呼 び出す必要があります。以下の例のように、<head> 終了タグのすぐ上に #(..HyperEventHead())# を配置します。 Class esl.csptest Extends %CSP.Page [ ProcedureBlock ] { Caché Server Pages (CSP) の使用法 61 CSP におけるタグを使用した開発 ClassMethod OnPage() As %Status { &html<<html> <head> <script language=javascript> function onServer() { alert(#server(..ServerMethod())#); } </script> #(..HyperEventHead())# </head> <body> <input type=button value="click here" onclick='onServer()' /> </body> </html>> Quit $$$OK } ClassMethod ServerMethod() { quit "from server" } } 5.5.4 サーバ側メソッドを使用するヒント Web ページからサーバ側のメソッドを呼び出せることは大変便利です。ただし、アプリケーションでサーバ側のメソッドを 使用する場合、注意する点がいくつかあります。 注釈 このセクションでは、特に明記されていない限り、#server について説明した内容は、#call にも適用されます。 #server 指示文と #call 指示文のいずれかを使用すると、JavaScript から Caché サーバ上のメソッドを Web ブラウザに 呼び出すことができます。これにより CSP は、フォームの送信時点まで待たず、フィールドからフォーカスが移動したとき にそのフィールドを検証することで、ユーザに迅速なフィードバックを提供します。#server 構文の使用には、注意すべき いくつかの要素があります。これを無視すると、アプリケーションの速度が低下したり、まったく動作しなくなる可能性があ ります。 #server を使用する際には、2 つの基本的な規則があります。 1. Web ページの onload イベントでは、#server を使用しないでください。使用するとエラーを起こす可能性がありま す。Web ページを生成する場合は、Caché でデータを生成する方が、より高速で簡単です。 2. Web ページの onunload イベントでは、#server を使用しないでください。ブラウザとサーバ間の通信を含め、#server 呼び出しはコストが高いため、できるかぎり呼び出し数を少なくし、1 回の呼び出しごとの動作量を多くします。 onload イベント内で実行する必要があるコードはすべて、Caché からページを生成した方が、高速で簡単に実行できる ため、これはお勧めしません。例えば、JavaScript 変数の初期値を設定し、後でそのページからその変数を #server 呼 び出しで使用できるようにするには、以下のように記述します。 <html> <head> <script language="JavaScript"> function LoadEvent() { var value=#server(..GetValue())#; } </script> </head> <body onload=LoadEvent();> </body> </html> <script language="Cache" method="GetValue" returntype="%String"> Quit %session.Data("value") </script> しかし、ここで #server を呼び出す必要はありません。JavaScript 変数値は、ページが生成されたときは既に %session.Data("value") で認識されているからです。したがって、以下のように記述します。 62 Caché Server Pages (CSP) の使用法 サーバ側のメソッド <html> <head> <script language="JavaScript"> function LoadEvent() { var value='#(%session.Data("value"))#'; } </script> </head> <body onload=LoadEvent();> </body> </html> 同様に、ドキュメントをロードするときにフォーム要素値を更新する場合、ページの生成時に値を入力します。例えば、以 下のように記述します。 <input type="text" name="TextBox" value='#(%request.Get("Value"))#'> ページの onload イベントで、#server を使用する必要はありません。 ページはロードされていないため、Caché から返された JavaScript が実行されるかどうかを確認することは困難です。実 際の動作はブラウザに依存します。また、ユーザがコンピュータの電源をオフにすると、onunload イベントを取得できま せん。したがって、%session オブジェクトのタイムアウトを使用するなどして、どのような場合でもアプリケーションが対処 できるようにする必要があります。onunload #server ロジック・コードを、例えば、ユーザがクリックする次の CSP ページの 最初に移動できます。 5.5.4.1 #server および #call の呼び出し回数を最小限に抑える方法 #server および #call は、ブラウザがページに HTTP を要求することによって動作します。このページには、暗号化され た特殊なトークンがあり、実行する Caché メソッド名を伝えます。Caché はこのメソッドを実行し、返送された出力すべて を JavaScript としてブラウザで実行します。また、#server 呼び出しも値を返します。これらの呼び出しは HTTP 要求を 使用するため、サーバのネットワーク・パケットや CPU など通常の CSP ページ要求よりもコストがかかります。#server 要 求を多用すると、#server 呼び出しを実行するたびに Caché サーバから新規の CSP ページが要求されるため、アプリ ケーションの拡張性が大幅に低下します。つまり、従来の Web ページでは、URL に移動するとそのページを 1 回生成 するだけですが、10 回の #server 呼び出しがある CSP ページでは、10 回 CSP ページを生成する場合と同じコストが かかります。したがって、これらの #server 呼び出し数を削減すると、アプリケーションがサポートできるユーザ数が 10 倍 増加します。 #server 呼び出し数を削減するには、それぞれの #server 呼び出しがアプリケーションで本当に必要かどうか、そして必 要な場合には、#server によって一度にできるだけ多くの動作がサーバで行われているかどうかを検証する必要がありま す。例えば、以下は、サーバから得た新規の値でフォームを更新する JavaScript のブロックです。 このコード・ブロックは、CSP キーワード CSPPage を使用して、Javascript キーワード self ではなくページ自体を参照す ることに注意してください。この例では、この 2 つのキーワードが同様に機能します。self は、さまざまなコンテキストで予 期しない動作をする場合があるので、CSPPage を使用することをお勧めします。 <script language="JavaScript"> function UpdateForm() { CSPPage.document.form.Name.value = #server(..workGet("Name",objid))#; CSPPage.document.form.Address.value = #server(..workGet("Address",objid))#; CSPPage.document.form.DOB.value = #server(..workGet("DOB",objid))#; } </script> サーバ・コードは以下のとおりです。普通はオブジェクトまたは SQL を使用しますが、ここではコードを小さくするため、 グローバルを使用しています。 <script language="Cache" method="workGet" arguments="type:%String,id:%String" returntype="%String"> Quit $get(^work(id,type)) </script> この 1 回のアップデートは、新規 Web ページ用に Caché サーバから 3 回呼び出しを実行しています。このコードを、 すべての値を一度で更新する 1 回の #server 呼び出しに変換できます。 JavaScript は以下のとおりです。 Caché Server Pages (CSP) の使用法 63 CSP におけるタグを使用した開発 <script language="JavaScript"> function UpdateForm() { #server(..workGet(objid))#; } </script> メソッド定義は以下のようになります。 <script language="Cache" method="workGet" arguments="id:%String" returntype="%String"> &js<CSPPage.document.form.Name.value = #($get(^work("Name",objid)))#; CSPPage.document.form.Address.value = #($get(^work("Address",objid)))#; CSPPage.document.form.DOB.value = #($get(^work("DOB",objid)))#;> </script> これにより、複数回呼び出す代わりに、データを 1 回だけ渡し、Caché ですべての動作を実行できます。以下は、さらに 複雑な JavaScript の例です。 <script language="JavaScript"> function UpdateForm() { CSPPage.document.form.Name.value = #server(..workGet("Name",objid))#; if (condition) { CSPPage.document.form.DOB.value = #server(..workGet("DOB",objid))#; } else { CSPPage.document.form.DOB.value = ''; } } </script> この場合でも、#server 呼び出しは 1 回にとどめる必要があります。この if 条件文全体を、#server 呼び出しで返される JavaScript に埋め込みます。最終的に workGet メソッドは以下のようになります。 <script language="Cache" method="workGet" arguments="id:%String" returntype="%String"> &js<CSPPage.document.form.Name.value = #(^work("Name",objid))#; if (condition) { CSPPage.document.form.DOB.value = #(^work("DOB",objid))#; } else { CSPPage.document.form.DOB.value = ''; } > </script> 5.5.4.2 #server および #call に対するカスタム・エラー警告の作成 ハイパーイベント (#server または #call) で何かを呼び出し、実行中に何らかの理由でサーバとの通信に失敗した場合 は、エラーが生成され、CSP の既定の動作によって、警告ボックスにエラーが表示されます。エラーをログに記録したり、 ユーザに別のメッセージを表示するなど、エラーを個別に処理する場合は、cspRunServerMethodError javascript 関数 を記述します。以下の例では、エラーは既定の動作のように警告ボックスに表示されます。 function cspRunServerMethodError(err) { // Just display the error and carry on alert(err); return null; } 64 Caché Server Pages (CSP) の使用法 6 データベース・アプリケーションの構築 CSP により、組み込みのオブジェクト・データベースと直接対話ができる、動的な Web ページの作成が便利になりまし た。これにより、構築されたデータベース・アプリケーションには、以下のような利点があります。 • オブジェクトに対するリレーショナル・データのマッピングが単純です。 • 複雑なミドルウェアは不要です。 • 拡張性が高く、シングル・サーバから多階層、複数のサーバ構成まで、実行時に再構成が可能です。 Caché SQL ゲートウェイを使用すると、サード・パーティ製のリレーショナル・データベースのデータにアクセスすることが できる、オブジェクト指向の CSP アプリケーションを構築することができます。Caché はこれをアプリケーション・トランスペ アレントな方法で実行します。この章で説明するすべてのテクニックは、組み込みの Caché データベース、またはサー ド・パーティ製のデータベースのどちらにデータを格納するかにかかわらず機能します。 CSP は柔軟性に優れており、データベース・アプリケーションをさまざまなテクニックで構築できます。その方法には、 HTML 形式でデータを自動的に結合するという、高度なレベルのタグを使用したものから、オブジェクトを使用してデー タに直接アクセスするサーバ側のスクリプトを記述するものまであります。この技術について、以下に説明します。 6.1 ページでのオブジェクトの使用 Caché により、アプリケーションのデータを表す永続オブジェクトのデータベースを、簡単に構築することができます。こ れらの永続オブジェクトは、Web アプリケーションにおいてさまざまな方法で使用できます。 ページにオブジェクト・データを表示するには、オブジェクトを開き、サーバ側のスクリプトを使用してその内容を書き出 す方法が最も簡単です。 以下の例は、Caché SAMPLES データベース内の Sample.Person クラスを使用します。これらの例は、CSP ページを使 用していますが、記述されたテクニックは %CSP.Page クラスをサブクラスにして構築されたアプリケーションにも適用され ます。 6.1.1 テーブルにオブジェクト・データを表示 以下の 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) Caché Server Pages (CSP) の使用法 65 データベース・アプリケーションの構築 </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 テーブルにデータが表示されます。 注釈 絶対に、実際の作業を /csp/samples ディレクトリで実行しないように注意してください。Caché をアップグレー ドすると、サンプルは再度インストールされ、そのディレクトリ内で作業した内容は消去されます。 6.1.2 フォームでのオブジェクト・データの表示 上記のようなコードを使用して、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 を超えるデータの保持が可能なフィールドを持つフォームを作成する場合は、以下のようなコードとします。 66 Caché Server Pages (CSP) の使用法 ページでのオブジェクトの使用 Set value=%request.Data("fieldname",1) If $isobject(value) { ; Treat this as a stream } Else { ; Treat this as a regular string } 6.1.3 フォームの送信要求処理 上記の例は、オブジェクトのコンテンツをフォームに表示することに加え、ユーザが [保存] ボタンを押してフォームを送 信したときに、オブジェクトの変更を保存します。これは、以下のように実行されます。 フォームが送信されるとき、コントロールの値は (その送信を行ったボタンも含めて) サーバへ返信されます。この場合、 フォームは最初にページを提供した 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() } 6.1.4 <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=""> Caché Server Pages (CSP) の使用法 67 データベース・アプリケーションの構築 <csp:object> タグの使用は、明示的にオブジェクト・インスタンスを生成するサーバ側のスクリプトを指定することと同 じです。<csp:object> タグの利用例は、CSP ページのサンプル "object.csp" を参照してください。 6.2 フォームへのデータの結合 CSP には、あるオブジェクトのデータを HTML フォームに結合するための機能があります。この結合には、標準の HTML フォームやそのフォームを定義する入力コントロール・タグを使用します。 これにより、任意の HTML エディタやデザイ ン・ツールを使用して、オブジェクトに結合されたフォームを簡単にデザインできます。<csp:object> タグはオブジェ クト・インスタンスを指定し、フォームや入力コントロール・タグに属性 cspbind を追加して、それらがどのように結合される かを示します。 CSP コンパイラは、cspbind 属性を含むフォームを認識し、自動的に以下のようなコードを生成します。 • 適切な入力コントロールに、指定されたオブジェクト・プロパティの値を表示します。 • 簡単な検証 (入力が必須のフィールドにデータが入力されているかどうかの確認など) を実行するため、クライアン ト側の JavaScript 関数を生成します。 • クライアント側の JavaScript 関数を生成して、結合されたオブジェクトを保存するための生成済みサーバ側メソッド を呼び出します。 • フォームに入力されたデータを検証して保存する、サーバ側のメソッドを生成します。これらのメソッドは、CSP イベ ント・ブローカを使用してページから直接呼び出せます。または、フォーム送信操作の結果として呼び出すこともで きます。 • フォームの非表示フィールド、OBJID を生成します。これには、結合されたフォームのオブジェクト ID 値が含まれま す。 以下は、Sample.Person クラスのインスタンスに結合するフォームの例です。 <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.Person クラスのインスタンスを開きます (ここではオブジェクト ID 1 を指定します)。このオブジェクト・インスタンスには person という名前が付けられます。そして、HTML フォームの form タグに cspbind という属性を追加し、その値を person と指定することにより、このオブジェクト・インスタンスをその HTML フォームに結合します。 このフォームには、3 つのテキスト入力コントロール、Name、SSN (社会保障番号)、City があります。これらは、各 input タグに cspbind という属性を追加することにより、オブジェクト・プロパティである Name、SSN、Home.City と結合していま す。その属性の値は、コントロールが結合しているオブジェクト・プロパティの名前です。 結合されたフォームで使用されるコントロールの名前は、有効な JavaScript 識別子である必要があります。 68 Caché Server Pages (CSP) の使用法 フォームへのデータの結合 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)))#> 6.2.1 プロパティへの結合 特定の HTML 入力コントロールをオブジェクト・プロパティに結合するには、以下を実行します。 • csp:object タグを使用して、オブジェクト・インスタンスを参照するサーバ側変数を定義します。 • form タグを使用して、HTML フォームを作成します。その form タグに cspbind 属性を追加することにより、フォーム をオブジェクト・インスタンスに結合します。cspbind 属性の値を、csp:object タグの名前にします。 • フォーム内で HTML 入力コントロールを作成し、それに cspbind 属性を追加します。この cspbind 属性の値を、結 合するオブジェクト・プロパティの名前にします。 cspbind 属性を使用することで、さまざまなタイプのオブジェクト・プロパティに結合できます。詳細は、以下のテーブルを 参照してください。 テーブル 6–1: cspbind 属性の効果 プロパティ 例 結果 リテラル cspbind=“Name” コントロールをリテラル・プロパティに結合します。プロ パティの DISPLAY 値を表示します。 埋め込みオブジェクトのプ ロパティ cspbind=“Home.City” コントロールを埋め込みオブジェクトのプロパティに結 合します。埋め込みオブジェクトのプロパティの DISPLAY 値を表示します。 参照されたオブジェクト cspbind=“Company” コントロールを参照プロパティのオブジェクト ID 値に結 合します。参照プロパティの object ID 値を表示しま す。 参照されたオブジェクトの プロパティ cspbind=“Company.Name” コントロールを参照オブジェクトのプロパティに結合し ます。参照オブジェクトのプロパティの DISPLAY 値を 表示します。 インスタンス・メソッド cspbind=“%Id()” インスタンス・メソッドの値を返すために、コントロール を結合します。読み取り専用のフィールドとして、メソッ ドの返り値を表示します。 Caché Server Pages (CSP) の使用法 69 データベース・アプリケーションの構築 結合機能は、ほとんどの HTML 入力コントロールでサポートされています。詳細は、以下のテーブルを参照してくださ い。 テーブル 6–2: 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 コントロールのプロパティ値をテキストとして表示しま す。 6.3 <csp:search> タグを持つ CSP 検索ページ csp:search タグで、一般的な ページを作成できます。結合したフォームとこのページを組み合わせて使用して、検索 処理を実行できます。 アプリケーション・ユーザは、結合されたフォームを含むページから CSP 検索ページにアクセスし、これを使用して、デー タベースから基準に当てはまるオブジェクトを見つけます。次にこれらのオブジェクトの 1 つを選択して、編集できます。 csp:search タグは、検索ページを表示するクライアント側の JavaScript 関数を生成します。検索ページ は、%CSP.PageLookup クラスによって表示されます。 csp:search タグには、検索ページの動作を管理するための属性を指定します。これには、以下のものがあります。 テーブル 6–3: <csp:search> タグの属性 属性 説明 CAPTION オプション。標準の検索ページに表示される説明文字列。 CLASSNAME 必須項目。検索を実行するクラス名。 FEATURES オプション。ポップアップ型の検索ウィンドウが使用されるとき、JavaScript の window.open メソッドに渡される features 引数を含む文字列。これにより、ポップアッ プ・ウィンドウの表示方法など、詳細な管理ができるようになります。 MAXROWS オプション。検索結果テーブルに表示する最大行数を指定。既定値は 100 です。 70 Caché Server Pages (CSP) の使用法 <csp:search> タグを持つ CSP 検索ページ 属性 説明 NAME 必須項目。検索ページを呼び出す、生成されたクライアント側の JavaScript 関数の 名前。 OBJID 検索ページを呼び出したときに表示されているオブジェクトの、オブジェクト ID 値。 ユーザが検索をキャンセルした際に、前のページを再表示するために使用します。 ONSELECT オプション。ポップアップ型の検索ページで、ユーザが特定の検索結果を選択する ときに呼び出す JavaScript 関数の名前。この関数は、選択されたオブジェクトのオ ブジェクト ID 値で呼び出されます。 OPTIONS オプション。検索ページのオプションを、コンマで区切って並べたリスト。オプション には、ポップアップ検索ウィンドウを作成する popup や、検索述語のドロップ・ダウ ン・リストを表示する predicates があります。 ORDER オプション。検索結果を並べ替えるフィールドの名前。 SELECT オプション。検索結果テーブルで表示に使用するフィールドのコンマで区切られたリ スト。何も指定がないときは、WHERE リストが SELECT リストとして使用されます。 STARTVALUES オプション。検索ページを呼び出すフォーム内の、コントロールの名前をコンマで区 切って並べたリスト。そのコントロールの内容が検索ページ中で seed の値として使 用されます。リスト内の名前の順番は、検索ページ内の (WHERE 属性によって指 定された) 条件フィールドに対応します。 TARGET オプション。ポップアップ検索ページでない場合に、検索結果ウィンドウでリンクが参 照するページの名前を指定します。これは、ユーザが選択した際に表示するページ です。既定は、検索を呼び出すページです。 WHERE 必須項目。検索ページの条件として使用されるフィールドをコンマで区切って並べ たリスト。これらのフィールドは、SELECT 属性が指定されない限り、検索結果テー ブルにも表示されます。 例えば、以下は JavaScript 関数、MySearch を定義します。この関数は、ポップアップ検索ウィンドウを表示し、名前で Sample.Person オブジェクトを検索します。 <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.csp" と "popform.csp" を参照してください。 Caché Server Pages (CSP) の使用法 71 データベース・アプリケーションの構築 6.4 ISCLOG でのログの有効化 CSP に関する問題のトラブルシューティングを行うには、Caché ターミナルで以下のコマンドを入力することによって、 Caché のログを有効にします。 Set ^%ISCLOG = 2 このグローバルは、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 のフィールドと定義を示しています。 テーブル 6–4: ISCLOG のフィールド フィールド 定義 %category CSPServer : cspServer、cspServer2、%request、%response からのログが記録されま す。 CSPSession : %session からのログ、および cspServer と cspServer2 のうちセッションを 処理する部分からのログが記録されます。これにより、セッションのライフサイクルを監視できま す。 CSPLicense : cspServer と cspServer2 のうちライセンスを処理する部分からのログが記 録されます。 Gateway Request : GatewayMgr、GatewayRegistry、ゲートウェイ要求ハンドラからのロ グ、および cspServer2 のうちゲートウェイ要求を処理する部分からのログが記録されます。 %level 1= 例外とエラー。 72 Caché Server Pages (CSP) の使用法 ISCLOG でのログの有効化 フィールド 定義 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 後述の "メッセージ形式" のセクションを参照してください。 6.4.1 メッセージ形式 メッセージの先頭には、タグ・ラベルの名前、または現在実行されているメソッドの名前が出力されます。この名前は、角 括弧で囲まれ、[MyMethod] のようになります。 CSPSession カテゴリのメッセージの場合は、メソッド名の後に CSPSession-Id=sessid も付きます。これは、セッ ションの作成前または破棄後、つまり ISCLOG エントリの SessionId フィールドが空の場合に、セッション・イベントのログ を記録するために必要です。 [MyMethod] CSPSession-Id: 12ty34ui22 GatewayRegistry カテゴリのメッセージの場合は、メソッド名の後に CSPID=cspid も付きます (使用可能な場合)。 これによって、ゲートウェイ要求ハンドラを介して、API 呼び出しからの個々のゲートウェイ要求を追跡できるようになりま す。 [MyMethod]CSPID:334r43345 rest of message Caché Server Pages (CSP) の使用法 73 7 CSP アプリケーションにおけるテキストのローカ ライズ アプリケーションのテキストをローカライズする場合は、まず 1 つの言語でテキスト文字列のインベントリを作成します。次 に、アプリケーションのロケールが異なるときに別の言語に翻訳したバージョンでこれらのメッセージを置き換えるための 規則を確立します。提供されたローカライズ・ファイルは、install-dir\Mgr\Locale ディレクトリにインストールされます。 ローカライズされた CSP アプリケーションの簡単なデモを見るには、Caché の実行中に URL http://localhost:57772/csp/samples/language.csp を入力します。 Caché は、CSP アプリケーションのテキストをローカライズする以下のプロセスをサポートします。 1. 開発者は、アプリケーションのユーザ・インタフェースのどこにテキスト文字列を表示するかを決定します。 2. 開発者は、元の言語でテキスト文字列を記述した XML メッセージ・ファイルを作成します。 3. 開発者は、その XML を Caché ネームスペースにインポートします。 これにより、新規エントリがそのネームスペースのメッセージ・ディクショナリに追加されます。 4. 開発者は、XML を翻訳者チームに渡します。 5. 翻訳者は、元のテキストを翻訳したテキストに置き換えることで新規 XML メッセージ・ファイルを作成します。 6. 開発者は、新規に作成されたこの XML を Caché ネームスペースにインポートします。 翻訳したテキストと元のテキストは、メッセージ・ディクショナリに共存します。 7. 実行時に、アプリケーションはブラウザの既定の言語に基づいて、表示するテキストを選択します。 この章では、以下の内容について説明します。 • メッセージ・ディクショナリの構造 • XML メッセージ・ファイルの構造 • タグを使用した CSP ページのテキストをローカライズする方法 • クラス・ベースの CSP ページのテキストをローカライズする方法 • アプリケーションに新規言語への翻訳を追加する方法 • メッセージ・ディクショナリをインポート、エクスポート、および管理する方法 Caché Server Pages (CSP) の使用法 75 CSP アプリケーションにおけるテキストのローカライズ 7.1 メッセージ・ディクショナリ メッセージ・ディクショナリは、ドメイン名、言語名、メッセージ ID で構成されたテキスト文字列を格納する単純なデータ ベースです。 • 各メッセージのテキストは、32,000 文字以下の文字列です。データベースで長い文字列が使用できる場合は、文字 列長はさらに長くすることができますが、既定の最大長は 32,000 文字です。メッセージはテキストのみで構成でき ますが、%1、%2 などのパラメータを 1 つ以上使用することもできます。アプリケーションのページでメッセージを表示 する必要がある場合、Caché によって、これらのパラメータをテキストに置き換えることができます (エラー・メッセージ 内のファイル名など)。 • ドメイン名は任意の文字列です。特定のアプリケーションやページのすべてのメッセージなど、関連するテキスト・ア イテムのグループはドメイン名で識別します。ドメインを一連のメッセージに割り当てると、Caché で同じドメインのす べてのメッセージに対して特定のアクションを後で実行することができます。 ドメイン名は大文字と小文字が区別され、同じ文字の大文字と小文字を使用できます。ドメイン名が % で始まる場 合、Caché では、ドメイン内のすべてのメッセージがすべてのネームスペースで表示可能なシステム・メッセージと見 なされます。% で始めない場合は、メッセージを作成すると、それが定義されたネームスペースでのみ表示可能で す。 • 言語名は、RFC1766 で定義されている、すべて小文字の言語タグです。これは、1 つ以上の部分で構成されてお り、主言語タグ (en や ja) の後に、オプションでハイフン (-) で区切られた 2 番目の言語タグ (en-gb や ja-jp) を記述します。 • メッセージID は任意の文字列で、メッセージを一意に識別します。メッセージ ID はドメイン内で一意とすれば十分 です。メッセージ ID は、メッセージを作成するための規則に応じて、ユーザ側で割り当てるか、Caché で自動的に 割り当てます。メッセージ ID は大文字と小文字が区別され、同じ文字の大文字と小文字を使用できます。 7.1.1 メッセージ・ディクショナリの格納 Caché のそれぞれのユーザ定義ネームスペースでは、^CacheMsg という添え字付きグローバルにメッセージ・ディクショ ナリが格納されます。^CacheMsg の添え字の順序は、ドメイン、言語、メッセージ ID です。 ネームスペースの ^CacheMsg fを表示するには、以下の手順に従います。 1. 管理ポータルを起動します。 2. [システム] > [構成] > [ローカルデータベース] ページに移動します。 3. ネームスペース名の右側の [グローバル] をクリックします。 4. [CacheMsg] の行の [データ] をクリックします。 Caché では、そのネームスペースのメッセージ・ディクショナリ全体が表示されます。 以下は、Caché SAMPLES ネームスペースから抜粋した例です。これは、sample というドメインでローカライズ・ドメイン にある 2 つの言語 (英語とスペイン語) のエントリを示します。行が長すぎてこの表示に収まらない場合は、この例の右 側が切り捨てられます。 ^CacheMsg("sample","en","LangComment") = "Demo of displaying a page in the local ^CacheMsg("sample","en","LangDesc") = "This sample demonstrates how to display a ^CacheMsg("sample","en","LangDisplay") = "Display Resource" ^CacheMsg("sample","en","LangEnglish") = "English" ^CacheMsg("sample","en","LangSet") = "Set Language" ^CacheMsg("sample","en","LangText1") = $c(13,10)_"This page has been translated ^CacheMsg("sample","en","LangText2") = $c(13,10)_"To display this page in a lang ^CacheMsg("sample","en","LangText3") = $c(13,10)_"To display the XML resource fi ^CacheMsg("sample","en","LangText4") = $c(13,10)_"The source code of this page s ^CacheMsg("sample","en","LangTitle") = "Language Localization Example" 76 Caché Server Pages (CSP) の使用法 XML メッセージ・ファイル ^CacheMsg("sample","en","Language") = "English" ^CacheMsg("sample","en","menu") = "Samples Menu" ^CacheMsg("sample","en","source") = "Source" ^CacheMsg("sample","es","LangComment") = "Demo de presentación de una p ^CacheMsg("sample","es","LangDesc") = "Este ejemplo muestra como presentar una p ^CacheMsg("sample","es","LangDisplay") = "Mostrar Recurso" ^CacheMsg("sample","es","LangEnglish") = "Spanish" ^CacheMsg("sample","es","LangSet") = "Establecer Lenguaje" ^CacheMsg("sample","es","LangText1") = $c(13,10)_"Esta página ha sido tra ^CacheMsg("sample","es","LangText2") = $c(13,10)_"Para mostrar esta págin ^CacheMsg("sample","es","LangText3") = $c(13,10)_"Para mostrar el fichero fuente ^CacheMsg("sample","es","LangText4") = $c(13,10)_"El código fuente de esta ^CacheMsg("sample","es","LangTitle") = "Ejemplo de Localización de Lenguaj ^CacheMsg("sample","es","Language") = "Español" ^CacheMsg("sample","es","menu") = "Menú Samples" ^CacheMsg("sample","es","source") = "Fuente" 7.1.2 メッセージ・ディクショナリへのエントリの追加 メッセージをメッセージ・ディクショナリに提供するには、以下のテーブルのオプションを使用することができます。オプショ ンごとにテーブルには本章のセクションが表示され、詳細情報を参照できます。 作業の条件 メッセージ・ディクショナリへのエントリの追加方法 詳細 タグまたはクラスを使用 した CSP 開発 テキスト・エディタまたは XML 編集ツールを使用して XML メッ セージ・ファイルを編集します。この XML ファイルを Caché ネームスペースにインポートします。 “XML メッセージ・ファイ ル” タグのみを使用した CSP 開発 特定のローカライズ構文を使用するタグを使用した CSP ペー ジを送信することにより、コンパイル時に自動的にメッセージ・ ディクショナリを生成します。 “タグを使用したファイ ルのローカライズ” クラスのみを使用した CSP 開発 $$$Text マクロ呼び出しを使用した CSP クラス・ページを送信 することにより、コンパイル時に自動的にメッセージ・ディクショ ナリを生成します。 “クラス・コードからの ローカライズ” これらの開発オプションのいずれか、またはすべてを同じアプリケーションで使用することができます。 開発オプションを組み合わせる場合は、アプリケーション・メッセージを別の言語に翻訳するときに、Export コマンドを実 行することにより、メッセージ・ディクショナリからオリジナルの言語のメッセージの完全なリストをエクスポートできます。こ れにより、完全な XML メッセージ・ファイルが元の言語で生成されます。 重要 エクスポートおよびインポートの手順は、“メッセージ・ディクショナリの管理” のセクションを参照してく ださい。 7.2 XML メッセージ・ファイル XML メッセージ・ファイルは、XML 形式でのメッセージ・ディクショナリの説明です。これは、Caché でメッセージ・ディク ショナリの内容を外部ファイルにエクスポートするための形式です。これは、Caché XML にインポートするメッセージに必 要な形式でもあります。 重要 エクスポートおよびインポートの手順は、“メッセージ・ディクショナリの管理” のセクションを参照してく ださい。 XML メッセージ・ファイルには 1 つの言語と複数のドメインに対するメッセージを記述できます。このファイルは以下の DTD に準拠しています。 InstallDir\dev\csp\rules\CacheMessages.dtd Caché Server Pages (CSP) の使用法 77 CSP アプリケーションにおけるテキストのローカライズ ここで、InstallDir は Caché のインストール・ディレクトリです。 可能な場合、XML メッセージ・ファイルは UTF-8 エンコードを使用する必要があります。ただし、開発者または翻訳者 は、XML メッセージ・ファイルの編集を容易にするために shift-jis などのローカル・プラットフォーム・エンコードを 使用できます。XML ファイルにどのエンコードを使用するかにかかわらず、エンコードはアプリケーションの Caché ロケー ルによってサポートされ、言語のメッセージを表現できなければなりません。 7.2.1 <MsgFile> 要素 <MsgFile> 要素は XML メッセージ・ファイルの最上位のコンテナです。<MsgFile> 要素はファイルごとに 1 つのみ です。 <MsgFile> は 1 つの必須属性 Language を持ちます。<MsgFile> の Language 属性の値は、ファイルの言語を識別 する、すべて小文字の RFC1766 コードです。これは、1 つ以上の部分で構成されており、主言語タグ (en や ja) の後 に、オプションでハイフン (-) で区切られた 2 番目の言語タグ (en-gb や ja-jp) を記述します。 以下の例では、この言語は「en」 (英語) です。 <?xml version="1.0" encoding="utf-8" ?> <MsgFile Language="en"> <MsgDomain Domain="sample"> <Message Id="source">Source</Message> <Message Id="menu">Samples Menu</Message> </MsgDomain> </MsgFile> <MsgFile> には少なくとも 1 つの <MsgDomain> 要素を指定する必要があります。複数の <MsgDomain> を指定で きます。 7.2.2 <MsgDomain> 要素 <MsgDomain> は 1 つの必須属性 Domain を持ちます。<MsgDomain> の Domain 属性の値は、アプリケーションで メッセージを整理するために使用しているドメイン名の 1 つです。 <MsgDomain> 要素にはゼロ個以上の <Message> 要素を指定できます。 7.2.3 <Message> 要素 <Message> は 1 つの必須属性 Id を持ちます。<Message> の Id 属性の値は、アプリケーションでメッセージを整理 するために使用しているメッセージ ID の 1 つです。 <Message> 要素にはテキスト文字列を記述できます。この文字列は以下の項目を個別に、または組み合わせて構成 することができます。 • ファイル形式によって許容される単純なテキスト • 置換引数 %1、%2、%3、または %4 • HTML フォーマット • Caché ObjectScript 形式での文字列式 以下の例では、%1、%2、太字フォーマットの HTML タグ、および連続する 2 つの二重引用符で 1 つの二重引用符を 示す ObjectScript 文字列規則を使用しています。 <Message> The session $Username="<b>%1</b>" $Roles="<b>%2</b>" </Message> 78 Caché Server Pages (CSP) の使用法 タグを使用したファイルのローカライズ 7.3 タグを使用したファイルのローカライズ タグを使用した CSP ページの開発では、メッセージになっていないリテラル・テキストをメッセージ・ディクショナリのエン トリに置き換えるようにタグを構成できます。そのためには、タグ内にローカライズ属性 language、domain、または textid を指定します。これらの属性では以下のタグを使用できます。 • <csp:text> • <span> • <div> • <input> (type が "SUBMIT"、"BUTTON"、または "RESET" の場合) ほとんどの場合、language、domain、および textid に指定された値がメッセージ・ディクショナリから取得するメッセージを 示す場合、これらのタグは実行時にのみ機能します。 ただし、これらのタグはコンパイル時と実行時とでは異なる目的に使用される場合があります。その場合、コンパイル時 にはメッセージ・ディクショナリのエントリを自動的に生成し、実行時にはこれらのエントリを取得し、表示します。以下の セクションでは、この動作について説明します。 • 実行時のローカライズ・タグ • コンパイル時のローカライズ・タグ 7.3.1 実行時のローカライズ・タグ 重要 このトピックは、CSP タグ <csp:text>、<span>、<div>、<input>、および <button> のみが該当します。 実行時に、CSP ページが表示されるときに、タグとその内容はメッセージ・ディクショナリから得られたテキストに置き換え られます。テキストの選択は、タグによって指定される language、domain、および textid の各属性によって指定されます。 例えば、以下の構文は fr (フランス語)、sample ドメイン、および menu メッセージ ID によって指定されるメッセージに 置き換えられます。<csp:text> タグ (この場合は Menu) 内のテキストは無視されます。 <csp:text textid="menu" language="fr" domain="sample">Menu</csp:text> language、domain、および textid の既定値は、属性が省略されるか、空 (値 "") の場合に使用されます。 • language 属性を指定しない場合は、%response.Language の値が使用されます。 • domain 属性を指定しない場合は、%response.Domain の値が使用されます。 • textid は必須です (例外があります。“コンパイル時のローカライズ・タグ” のセクションを参照してください)。 7.3.1.1 既定の言語 ほとんどの開発者は、実行時に対象の言語がロケールの既定に適切に設定されるように、language 属性を意図的に指 定しません。language を指定しない場合、既定で %response.Language の値に設定され、ブラウザ設定から実行時の値 を自動的に取得します。 SAMPLES ネームスペースのローカライズ例のソース・コードにこの規則の例を示します。これは、以下のように表示しま す。 1. スタジオを開始します。 2. SAMPLES ネームスペースに変更します。 Caché Server Pages (CSP) の使用法 79 CSP アプリケーションにおけるテキストのローカライズ 3. [ワークスペース] ウィンドウの [ネームスペース] タブをクリックします。 4. [CSP ファイル] を選択します。 5. ファイル /csp/samples/language.csp を開きます。 7.3.1.2 既定のドメイン %response.Domain プロパティは、CSP ページ・クラスの DOMAIN パラメータの値で初期化されます。以下のように <csp:class> タグの domain 属性を使用して %response.Domain の値を設定することもできます。 <csp:class domain="myDomainName"> 7.3.1.3 メッセージ引数 メッセージ・テキストに引数 (%1、%2、%3、%4 など) が含まれる場合は、arg1、arg2、arg3、arg4 などの各タグ属性により、 対応する置換テキストを指定できます。リテラル値を指定するか、変数を使用することができます。以下はその例です。 <csp:text textid="sessionInfo" arg1="#(userName)#" arg2="#(roleID)#" /> 7.3.1.4 ボタン・テキスト タグを使用した CSP ファイルで、ボタンに表示されるテキストは、通常、<input type="button"> タグまたは <button> タグの value 属性を使用して指定します。 <input> タグでローカライズ属性 (language、domain、または textid) を使用している場合、value 属性は無視されます。 ボタンに表示されるテキストは、メッセージ・ディクショナリから得られたテキストです。<button> タグでテキストをローカ ライズする場合、<csp:text> タグの language、domain、または textid 属性を使用します。 7.3.2 コンパイル時のローカライズ・タグ 重要 このトピックは、CSP タグ <csp:text>、<span>、<div>、および <input> タグのみが該当します。 textid 属性には空の値 "" を指定できます。その場合は、タグを使用した CSP ファイルをコンパイルするときに、新規 メッセージが自動的にメッセージ・ディクショナリに生成されます。生成されたメッセージのテキストは、CSP タグのコンテ ンツから構成されます。Caché は、このテキストの 32 ビット CRC (冗長巡回検査) を計算してメッセージ ID を生成しま す。 必須の textid 属性を実際に省略できるのは、<csp:text> タグを使用した場合のみです。他のローカライズ・タグでは、 少なくとも空の値 "" を指定する必要があります。 <csp:text> タグに textid 属性が指定されていない場合は、Caché は新規メッセージとメッセージ ID 値を自動的に生 成します。<csp:text> から textid を省略すると、タグ内部テキストの先頭にオプションの @textID@ 文字列を追加でき ます。textID は、メッセージに割り当てるメッセージ ID です。以下はその例です。 <csp:text>@simpleMenu@Menu</csp:text> 上記の例では、Caché は、メッセージ ID を生成しません。テキストが Menu であるメッセージを生成し、そのメッセージ にメッセージ ID simpleMenu を割り当てます。 コンパイル時にメッセージ・ディクショナリのエントリを生成するために使用している CSP タグであっても、実行時にはそ のエントリを取得するための参照として機能します。“実行時のローカライズ・タグ” のセクションを参照してください。 80 Caché Server Pages (CSP) の使用法 クラス・コードからのローカライズ 7.4 クラス・コードからのローカライズ コードを使用した CSP ページの開発では、メッセージになっていないリテラル・テキストをメッセージ・ディクショナリのエ ントリに置き換えるコードを指定できます。以下のテーブルのオプションを使用して、これを行うことができます。オプショ ンごとにテーブルには本章のセクションが表示され、詳細情報を参照できます。 作業の条件 詳細 XML メッセージ・ファイルを編集して、Caché にインポートします。これによっ て、メッセージ・ディクショナリが作成されます。 “XML メッセージ・ファイル” さまざまな “get message” ルーチンおよび “format text” ルーチンとマクロを 呼び出します。これらはメッセージ・ディクショナリからテキストを取得し、その メッセージを表示できるようにします。 “実行時のメッセージの取得” $$$Text マクロの 1 回の呼び出しにより、メッセージを作成、取得および表示 します。$$$Text は、コンパイル時にはメッセージを自動的に作成し、実行時 にはメッセージを取得するコードを生成します。 “コンパイル時および実行時の $$$Text マクロ” 7.4.1 実行時のメッセージの取得 ここでは、実行時にメッセージ・ディクショナリからメッセージ・テキストを取得する方法について説明します。メッセージに 引数 %1、%2、%3、%4 などを記述している場合は、対応する置換テキストを指定した後でそのテキストをページに表示す る必要があります。 このトピックで説明する呼び出しは、メッセージ・ディクショナリに既にエントリを配置している場合にのみ有効です。例え ば、XML メッセージ・ファイルを編集し、Caché にインポートしてエントリを配置します。1 回の呼び出しでメッセージを作 成、取得、および表示する場合は、“コンパイル時および実行時の $$$Text マクロ” のセクションを参照してください。 7.4.1.1 %response.GetText メソッド %CSP.Response クラスは、メッセージ・ディクショナリからテキストを取得してメッセージの引数を値に置き換えることがで きる GetText インスタンス・メソッドを提供します。CSP クラス・コードでは、現在インスタンス化されている %CSP.Response オブジェクトが変数 %response で表されます。このトピックでは、メソッドを %response.GetText として参照します。 メソッド・シグニチャは以下のようになります。 method GetText(language As %String = "", domain As %String = "", id As %String, default As %String, args...) returns %String Caché Server Pages (CSP) の使用法 81 CSP アプリケーションにおけるテキストのローカライズ 引数 説明 domain (オプション) メッセージのドメインを指定する文字列。指定しない場合、domain は既定で %response.Domain に設定されます。 language (オプション) 言語を指定する RFC1766 コード。Caché では、この文字列はすべて小文字に変換 されます。language を指定しない場合、既定で %response.Language の値に設定され、ブラウザ 設定から実行時の値を自動的に取得します。 id メッセージ ID。 default language、domain、および id で識別されるメッセージが見つからない場合に使用する文字列。 arg1、arg2 など メッセージ引数の置換テキスト。これらはすべてオプションなので、メッセージに引数がない場合 でも %response.GetText を使用できます。 7.4.1.2 FormatText メソッド %Library.MessageDictionary クラスは、メッセージ引数をテキストに置き換える FormatText クラス・メソッドを提供します。 メッセージ・ディクショナリからメッセージ・テキストを既に取得している場合は、FormatText を使用できます。 メソッド・シグニチャは以下のようになります。 ClassMethod FormatText(text As %String, args...) As %String 引数 説明 text メッセージ・テキスト。%response.GetText または $$$Text によって返される %String を使用しま す。 arg1、arg2 など メッセージ引数の置換テキスト。 7.4.1.3 $$$FormatText マクロ これらのマクロを使用すると、メッセージ引数をテキストに置き換えることができます。メッセージ・ディクショナリからメッセー ジ・テキストを既に取得している場合は、以下のようにそれを使用できます。 • $$$FormatText • $$$FormatTextJS ($$$FormatText の結果に JavaScript エスケープを適用します。) • $$$FormatTextHTML ($$$FormatText の結果に HTML エスケープを適用します。) $$$FormatText マクロは %String を返します。構文は、以下のとおりです。 $$$FormatText(text,arg1,arg2,...) 引数 説明 text メッセージ・テキスト。%response.GetText または $$$Text によって返される %String を使用しま す。 arg1、arg2 など メッセージ引数の置換テキスト。 82 Caché Server Pages (CSP) の使用法 クラス・コードからのローカライズ 7.4.2 コンパイル時および実行時の $$$Text マクロ $$$Text マクロはローカライズへのショートカットを提供します。$$$Text マクロを 1 回呼び出すだけで、ローカライズ したメッセージを作成、取得、および表示できます。$$$Text は、このメッセージをコンパイル時に自動的に作成し、実 行時にはそのメッセージを取得するコードを生成します。 $$$Text マクロの返り値は %String です。使用する正しい $$$Text マクロは、この出力文字列に必要な形式によっ て異なります。 • $$$Text • $$$TextJS ($$$Text の結果に JavaScript エスケープを適用します。) • $$$TextHTML ($$$Text の結果に HTML エスケープを適用します。) $$$Text によって返される %String は、変数に割り当てることができます。この変数を以降の呼び出しで使用して、そ のメッセージを表現できます。以下はその例です。 Set tmsg = $$$TextJS("Error saving production") &js<alert('#(tmsg)#: #($ZCVT($ZE,"O","JS"))#');> または、文字列が必要な場所に $$$Text マクロを挿入できます。 &js<alert('#($$$TextJS("Error saving production"))#: #($ZCVT($ZE,"O","JS"))#');> $$$Text は、次のテーブルに示す引数 text、domain、および language を持ちます。先頭の引数、text のみが必須で す。 引数 説明 text 空でない文字列 text には、リテラル文字列を指定する必要があります。#()# 構文で囲んだ CSP ランタイム式の値は指定できません。text では、次の形式を使用できます。 "actualText" または以下のようにします。 "@textId@actualText" textId はメッセージ ID で、actualText はメッセージのテキストです。 文字列 actualText には以下のものを指定できます。これらを組み合わせて指定することもできま す。 • ファイル形式によって許容される単純なテキスト • 置換引数 %1、%2、%3、または %4 • HTML フォーマット • Caché ObjectScript 形式での文字列式 指定されている場合、textId がメッセージ ID として使用されます。@textId@ が指定されていない 場合、Caché は、このテキストの 32 ビット CRC (冗長巡回検査) を計算して新規の textId を生成 します。指定した textId と同じ ID を持つメッセージが既に存在する場合は、その既存のメッセー ジと actualText が同じ内容のテキストであるかどうかがチェックされます。同じテキストではない 場合は、エラーが報告されます。 Caché Server Pages (CSP) の使用法 83 CSP アプリケーションにおけるテキストのローカライズ 引数 説明 domain (オプション) 新規メッセージのドメインを指定する文字列。指定しない場合、既定では domain は コンパイル時に DOMAIN クラス・パラメータの値に設定され、実行時に %response.Domain に設定 されます。 language (オプション) 言語を指定する RFC1766 コード。Caché では、この文字列はすべて小文字に変換 されます。指定しない場合、language は既定で以下のようになります。 • コンパイル時 : $$$DefaultLanguage。 • 実行時 : %response.Language。%response.Language に値が定義されていない場合は $$$DefaultLanguage。 タグを使用した CSP ページでは、ブラウザ設定から %response.Language の値を自動的に取得 し、既定の言語として使用可能です。クラス・ベースの CSP ページの場合はこれと異なり、既定 値として使用する %response.Language の値を明示的に設定する必要があります。 %Library.MessageDictionary クラス・メソッド MatchLanguage の返り値を指定することによ り、%response.Language に値を割り当てることができます。このメソッドでは、言語のリストとドメイ ン名を指定することで、HTTP 1.1 に適合するルール (RFC2616) を使用してドメイン内での最適な 言語を見つけます。 7.4.2.1 コンパイル時の $$$Text $$$Text、$$$TextJS、または $$$TextHTML の各マクロの呼び出しを含むクラスをコンパイルするときに、これらの呼 び出しごとに、マクロ引数で指定された text、message ID、domain、および language を使用してメッセージ・ディクショナ リにメッセージが生成されます。 7.4.2.2 実行時の $$$Text メッセージに引数 %1、%2、%3、%4 などを記述している場合は、対応する置換テキストを指定した後でそのテキストを表示 する必要があります。$$$Text は文字列を返すので、コーディング言語に固有の文字列操作を使用できます。例えば JavaScript では以下のとおりです。 var prompt = '#($$$TextHTML("Remove user %1 from this Role?"))#'; prompt = prompt.replace(/%1/g,member.userName); $$$Text 文字列を%response.FormatText メソッドまたは $$$FormatText マクロの最初の引数に入力することもできます。 7.5 メッセージ・ディクショナリの翻訳 メッセージ・ディクショナリの翻訳の規則は、以下のとおりです。 1. 開発者はアプリケーションのネームスペースから XML メッセージ・ファイルをエクスポートします。 重要 背景情報は、“XML メッセージ・ファイル” のセクションを参照してください。エクスポートの手順は、 “メッセージ・ディクショナリの管理” のセクションを参照してください。 XML メッセージ・ファイルを編集して Caché にインポートするだけでメッセージ・ディクショナリを作成する場合は、こ の手順を省略できます。 84 Caché Server Pages (CSP) の使用法 メッセージ・ディクショナリの管理 2. 開発者は XML メッセージ・ファイルおよび CacheMessages.dtd を翻訳者に送信します。翻訳者は、任意の XML 編集ツールを使用して XML メッセージ・ファイルを編集します。特に、XML 部分は変更せずにテキストを元の言語 から新規言語に翻訳します。 3. 翻訳者は以下の条件を満たす新規メッセージ・ファイルを返送します。 • CacheMessages.dtd に適合する。 • <MsgFile> の language 属性の新規 RFC1766 値を特定できる。 • 識別された言語の翻訳済みテキストを含む。 4. 開発者は新規 XML メッセージ・ファイルをアプリケーションのネームスペースにインポートします。 重要 インポートの手順は、“メッセージ・ディクショナリの管理” のセクションを参照してください。 これで、アプリケーションは別の言語をサポートするようになります。 7.6 メッセージ・ディクショナリの管理 このセクションでは、CSP アプリケーションをローカライズするときに広く使用されている %Library.MessageDictionary メ ソッドの要約を示します。これらのメソッドを使用して以下の作業を行います。 • XML メッセージ・ファイルからメッセージをインポートします。 • XML メッセージ・ファイルへメッセージをエクスポートします。 • メッセージ・ディクショナリからメッセージを削除します。 • メッセージ・ディクショナリでメッセージをリストします。 • 言語値に最適な言語を検索します。 7.6.1 XML メッセージ・ファイルのインポート Caché には XML メッセージ・ファイルをインポートするためのユーティリティ・メソッドが用意されています。 ターミナル・プロンプトでの入力 1. アプリケーションを開発しているネームスペースに変更します。 ZN "myNamespace" 2. import コマンドを実行します。Caché では各言語が個別の XML メッセージ・ファイルに格納され、言語名が各ファ イルの名前に付加されています。以下にコード例を示します。 • 以下では、特定の言語で記述されたメッセージのみをインポートできます。 SET file="C:\myLocation\Messages_ja-jp.xml" DO ##class(%Library.MessageDictionary).Import(file) • 以下では、同じアプリケーションに対して複数の言語をインポートします。 SET myFiles="C:\myLocation" DO ##class(%Library.MessageDictionary).ImportDir(myFiles,"d") 3. ネームスペースの ^CacheMsg グローバルを検査して結果を確認します。 Caché Server Pages (CSP) の使用法 85 CSP アプリケーションにおけるテキストのローカライズ 以下のトピックでは、両方のインポート・メソッドの概要を示します。 7.6.1.1 特定の XML メッセージ・ファイルのインポート %Library.MessageDictionary クラス・メソッド Import には以下のシグニチャがあります。 classmethod Import(filepath As %String, flag As %String = "") returns %Status 引数 説明 filepath filepath で指定した XML メッセージ・ファイルがインポートされます。そのディレクトリにあるファイ ルが XML メッセージ・ファイルのみであることを確認してください。他の XML ファイルがあると、エ ラーが生成されます。 flag (オプション) d 表示フラグを指定すると、ファイルがインポートされたときにターミナル・コンソール に確認メッセージが表示されます。指定しない場合、この確認は行われません。 7.6.1.2 ディレクトリ内のすべての XML メッセージ・ファイルのインポート %Library.MessageDictionary クラス・メソッド ImportDir には以下のシグニチャがあります。 classmethod ImportDir(directory As %String, flag As %String = "") returns %Status 引数 説明 directory すべての XML メッセージ・ファイルを指定されたディレクトリにインポートします。 flag (オプション) d 表示フラグを指定すると、ファイルがインポートされたときにターミナル・コンソール に確認メッセージが表示されます。指定しない場合、この確認は行われません。 7.6.2 XML メッセージ・ファイルのエクスポート Caché には、メッセージ・ディクショナリの一部を XML メッセージ・ファイルにエクスポートするためのユーティリティ・メソッ ドが用意されています。ターミナル・プロンプトでの入力 1. アプリケーションを開発しているネームスペースに変更します。 ZN "myNamespace" 2. 出力ファイルとその場所を特定します。 SET file="C:\myLocation\Messages.xml" 3. export コマンドを実行します。 • 特定のドメインにあるメッセージのみをエクスポートすることが実際的な場合があります。この場合は次のように 指定します。 DO ##class(%Library.MessageDictionary).ExportDomainList(file,"myDomain") • ネームスペースにあるすべてのメッセージをエクスポートするには次のように指定します。 DO ##class(%Library.MessageDictionary).Export(file) 以下のトピックでは、両方のエクスポート・メソッドの概要を示します。 86 Caché Server Pages (CSP) の使用法 メッセージ・ディクショナリの管理 7.6.2.1 1 つの言語での特定のドメインのエクスポート %Library.MessageDictionary クラス・メソッド ExportDomainList には以下のシグニチャがあります。 classmethod ExportDomainList(file As %String, domainList As %String, language As %String) returns %Status 引数 説明 file (必須) この形式での出力ファイル名のテンプレート。 filepath.ext Caché では、ext 拡張子と共に language 値を filepath に付加することにより出力ファイルを命 名します。 domainList (オプション) エクスポートするドメインのコンマで区切られたリスト。 language (オプション) 指定した language のみがエクスポートされます。値はすべて小文字の RFC1766 コードとする必要があります。指定しないと、値はシステム既定の言語、つまり、特殊変数 $$$DefaultLanguage に格納されている値に設定されます。 7.6.2.2 特定の言語でのすべてのドメインのエクスポート %Library.MessageDictionary クラス・メソッド Export には以下のシグニチャがあります。 classmethod Export(file As %String, languages As %String = "", flag As %String = "") returns %Status 引数 説明 file (必須) この形式での出力ファイル名のテンプレート。 filepath.ext Caché では、ext 拡張子と共に languages 値を filepath に付加することにより出力ファイルを 命名します。 languages (必須) コンマで区切られた言語リスト。リストの各値は、すべて小文字の RFC1766 コードとす る必要があります。languages を指定しない場合、または空である場合は、データベースにあ るすべての言語がエクスポートされます。Caché では、file 引数について記述された規則を使 用して、各言語が個別のファイルにエクスポートされます。 flag (オプション) s システム・フラグを指定すると、システム・メッセージ・ディクショナリがエクスポー トされます。指定しない場合は、アプリケーション・メッセージ・ディクショナリのみがエクスポー トされます。 7.6.3 メッセージの削除 以下のようにして、メッセージを削除します。 Set status = ##class(%MessageDictionary).Delete(languages,flag) languages は、オプションのコンマ区切りの言語リストです。languages が指定されていない場合、すべての言語が削除さ れます。既定では、アプリケーション・メッセージのみを削除します。s はオプションのシステム・フラグで、システム・メッ Caché Server Pages (CSP) の使用法 87 CSP アプリケーションにおけるテキストのローカライズ セージを削除するかどうかを示します。インクルード・ファイルに関連するメッセージは常に削除されますが、ファイル自 体は削除されません。d 表示フラグもサポートされています。 7.6.4 メッセージのリスト 指定されたドメインにロードされたメッセージを持つすべての言語リストは、GetLanguages 関数を使用して取得できます。 Set list = ##class(%MessageDictionary).GetLanguages(domain,flag) GetLanguages は、標準の RFC1766 形式で、言語の %ListofDateTimes 形式リストをすべて小文字で返します。 domain が指定されている場合、指定されたドメインに存在する言語のみがリストに返されます。そうでない場合、すべて の言語がリストに返されます。s はオプションのシステム・フラグで、システム・メッセージまたはアプリケーション・メッセー ジのどちらでサポートされる言語を返すかを示します。既定では、アプリケーション・メッセージの言語が返されます。d 表示フラグもサポートされています。 7.6.5 一致言語の検索 要求に最適な言語の検索には、以下を実行します。 Set language = ##class(%MessageDictionary).MatchLanguage(languages,domain,flag) HTTP 1.1 一致規則 (RFC 2616) を使用して、指定されたドメインの言語リストにある言語に最適な言語が検索されます。 言語リストは、コンマで区切られた RFC1766 形式の言語名のリストです。そのリストの言語それぞれに対応する品質値 があり、指定された言語に対しユーザが選択した言語の評価を示します。既定の品質値は、q=1 です。 例えば、da, en-gb;q=0.8, en;q=0.7 は、 ことを意味します。リストの言語が サポート対象の言語タグと一致する場合、またはリストの言語に付く接頭語の後の最初のタグ文字がハイフン (-) である 場合、リストの言語はサポート対象の言語タグに一致します。特殊な言語を示すアスタリスク (*) が入力リストにある場合、 リストにある他の言語に一致しない、すべてのサポート対象の言語に一致します。 言語品質要素は、リストにある最長言語で言語タグに一致するものの品質値により、サポート対象の言語タグに割り当て られます。返される言語は、高品質要素を割り当てられたサポート言語です。 s はオプションのシステム・フラグで、システム・メッセージとの一致を検索するか (s を指定した場合)、アプリケーション・ メッセージとの一致を検索するかを示します。 88 Caché Server Pages (CSP) の使用法 8 カスタム・タグの開発 この章では、カスタム・タグの開発および使用について説明します。項目は以下のとおりです。 • ルールとアクション • タグ・マッチング • ルール・アクション内のサーバ側の式とコード • サーバ・ドキュメント・オブジェクト・モデル • アクション内での <csr> タグの使用 • アクション外での <csr> 追加タグの使用 • <csr> ルール・クラスの使用 • <csr> %CSP.Rule メソッドの使用 • <csr> %CSP.AbstractAtom メソッドの使用 • <csr> Available ルーチンの使用 • <csr> Example の使用 CSP では、CSP ファイル内で使用するカスタム HTML タグを開発することができます。CSP マークアップ言語自体が、 このカスタム・タグのメカニズムを使用して実装されます。カスタム・タグでは、以下を実行できます。 • HTML 制作者は、一般的な構文を使用して、高い機能性を得ることができます。 • Web アプリケーション用の再使用可能なコンポーネントを開発できます。 8.1 ルールとアクション CSP コンパイラはマークアップ HTML ドキュメントを Caché クラスに変換します (“CSP コンパイラ” を参照)。CSP コン パイラの機能の例として、以下のものがあります。 1. CSP ドキュメントに埋め込まれた #( )# 式を認識します。 2. HTML/XML ドキュメントにある特定のタグまたはタグの組み合わせを認識し、開発者が指定したアクションに置き換 えます。これはタグ・マッチングと呼ばれ、この章で説明します。 XML の XSL テクノロジに精通していれば、CSP とは、アプリケーション用の HTML を生成する機能を追加した XSL で あることがわかります。 Caché Server Pages (CSP) の使用法 89 カスタム・タグの開発 例えば次の CSP ページには、HTML ページに会社名を表示するカスタム・タグ <my:COMPANY> が記述されています。 <html> <body> <my:COMPANY> </body> </html> このページが処理されるときに、<my:COMPANY> タグが適切な HTML テキストに置き換えられるようにする必要がありま す。以下はその例です。 <html> <body> <b>Octoglomerate</b> </body> </html> <my:COMPANY> タグに対して CSP コンパイラで実行するアクションは、csr:action タグを持つルール・ファイルで定 義します。ルール・ファイルは、.csr (Caché Server Rule) ファイル拡張子を持つ XML ドキュメントで、タグを認識するルー ルを定義し、これらのタグが見つかったときに実行するアクションを定義します。ルールの説明などの追加情報を指定す ることもできます。 <my:COMPANY> タグのルール・ファイルは以下のようになり、company.csr という名前が付けられます。 <csr:rule name="myCOMPANY" match="my:COMPANY" empty> <csr:action> <b>Octoglomerate</b> </csr:action> </csr:rule> このルール・ファイルは以下を指定します。 <csr:rule> タグを使用して、このファイルは myCOMPANY というルールを定義します。属性 empty は、<my:COMPANY> タグが終了タグを持たないことを指定します。 ルール名をつけるときには、Caché クラスの名付けと同様の制限があります (Caché 名前付けルールの詳細は、"Caché オブジェクトの使用法" の "“名前付け規約”" および "Caché ObjectScript の使用法" の "“構文規則”" を参照して ください)。各ルールは、それが定義された Caché ネームスペースの範囲でのみ有効です。ただし、% で始まる名前を持 つルールは例外で、これらは %CacheLIB ネームスペースで定義し、他のすべてのネームスペースから認識できます。 <csr:action> タグは実行するアクションを指定します。<csr:action> タグの内容は HTML とする必要があり、以 下のいずれかになります。 • #()# 式 • ##()## 式 • <SCRIPT> タグ • 追加の <csr:> タグ (後述します)。 • <csr:action> タグの中で CSP タグを使用することはできません。つまり CSP コンパイラでは、アクションの内容 に関してはタグが変換されません。 company.csr ルール・ファイルをロードするには、ファイルを /cachesys/csp/user ディレクトリに移動し、Caché ターミナ ルを使用して Caché セッションを開始し、以下のコマンドを実行します。 Do $system.CSP.LoadRuleFile("company.csr") これにより、指定されたファイルのルール定義を、実行中のネームスペースにロードします。Caché スタジオで [ファイ ル]→[新規作成]→[Caché Server Page] を選択し、ルール・ファイルをロードしてコンパイルすることもできます。このファ イルを csp/user ディレクトリに保存します。CSP サンプル内の rulemgr.csp ページにより、どのルールが有効であるか がわかります。 90 Caché Server Pages (CSP) の使用法 タグ・マッチング — match 属性 多くの CSP がルール・ファイルを使用して実装されます。スタジオでシステム・ルール・ファイルを、$SYS ネームスペー スの [ワークスペース] ウィンドウ→[ネームスペース] タブ→[CSP ファイル] の下に表示できます。 8.2 タグ・マッチング — match 属性 タグの属性値は、タグ名の後に角括弧 [ ] で囲んで記述することで指定します。 <csr:rule> タグの match 属性は、CSP コンパイラで何をルールとして認識し、指定されたアクションを実行するかを 定義します。match 属性は、1 つ以上のタグ名を / (スラッシュ) 文字で区切って記述した文字列です。複数のタグ名を 指定した場合、それらのタグは入れ子になっていると見なされます。その場合、左から右に向かって、最上位のタグから 最下位のタグの順番で記述します。* (アスタリスク) 文字は、あらゆるタグと一致するワイルドカードです。 以下のテーブルの match 値の例で、これをわかりやすく説明します。 ルールは、MATCH の一番内側にあるタグに対して適用されます。同じタグに複数のルール定義が存在する場合、CSP コンパイラはどの match 値が最も具体的であるかを判断することで、使用するルールを決定します。例えば、BBB に対 するルールよりも、AAA/BBB に対するルールの方が具体的です。同様に、属性の値を指定するルール (BBB[CCC]) の 方が、そうでないもの (BBB) より具体的です。 テーブル 8–1: タグ・マッチングの例 match の値 ルールの適用例 AAA <AAA> タグが見つかった場合に必ず適用 : <AAA></AAA> AAA/BBB <AAA> タグと直接入れ子になっている <BBB> タグが見つかった場合に必ず適用 : <AAA> <BBB></BBB> </AAA> AAA/*/BBB <AAA> タグの任意の位置で入れ子になっている <BBB> タグが見つかった場合に 適用 : <AAA><FFF> <BBB></BBB> </FFF></AAA> AAA[CCC] 任意の値が設定された CCC 属性を持つ <AAA> タグが見つかった場合に適用 : <AAA CCC=”10” ></AAA> AAA[CCC=22] 値 “22” が設定された CCC 属性を持つ <AAA> タグが見つかった場合に適用 : <AAA CCC=”22”><AAA> AAA[CCC=22]/*/BBB 値 “22” が設定された CCC 属性を持つ <AAA> タグの中の任意の位置で入れ 子になっている <BBB> タグが見つかった場合に適用 : <AAA CCC=”22” ><FFF> <BBB></BBB> </FFF></AAA> 8.3 ルール・アクション内のサーバ側の式とコード ルールに定義されているアクションでは、ページの実行時またはコンパイル時のいずれかで実行する式とコードを指定 します。 8.3.1 アクションの実行時式 実行時の式をアクションで指定するには、CSP ページで使用できるものと同じ #(expr)# 構文を使用します。例えば、以 下は Caché の $ZDATE コマンドを使用して現在の時刻を表示する <TODAY> タグを定義するルール定義です。 Caché Server Pages (CSP) の使用法 91 カスタム・タグの開発 <csr:rule name="TODAY" match="TODAY" empty> <csr:action> Today is: <b>#($ZDATE($H))#</b> </csr:action> </csr:rule> このルールをロードすると、以下のように CSP ページの本文に配置できます。 <TODAY> そして、そのページが要求されたとき、現在の日付が表示されます。 8.3.2 コンパイル時の式とアクション コンパイル時式をアクションで指定するには、##(expr)## 構文を使用します。例えば、以下は、CSP ページが最後にコ ンパイルされた日付を表示するタグ <LASTMOD> を定義するルールです。##( )## 式は、ページをコンパイルするときに 評価されます。式の評価結果は、生成された CSP ページの静的な部分になります。 <csr:rule name="LASTMOD" match="LASTMOD" empty> <csr:action> This page was last compiled on: <b>##($ZDATE($H))##</b> </csr:action> </csr:rule> コンパイル時式は、実行時の式にも使用できます。この場合、最初の $H は実行時に評価され、現在の日付が返されま す。2 番目の $H はページがコンパイルされるときに評価され、ページがコンパイルされた日付を返します。 This page is #(+$H - ##(+$H)##)# days old. 8.3.3 アクション内の <script> タグ 同様に、タグを使用して、アクション内に複数行のコードを記述できます。実行時コードには <script language=cache runat=server> タグを使用し、コンパイル時コードには <script language=cache runat=compiler> タグを 使用します。例えば以下は、100 項目の箇条書きリストを作成するルールです。 <csr:rule name="BIGLIST" match="BIGLIST" empty> <csr:action> <ul> <script language="Cache" runat=server> For i = 1:1:100 { Write "<li>Item " _ i _ $C(13,10) } </script> </ul> </csr:action> </csr:rule> このルールをロードすると、以下のように CSP ページの本文にそのルールを配置できます。 <BIGLIST> そして、そのページが要求されたとき、100 項目の箇条書きリストが表示されます。 8.4 サーバ・ドキュメント・オブジェクト・モデル CSP コンパイラが CSP ドキュメントを処理するとき、最初にルール・マッチングにかかわるすべてのタグを検索します。ド キュメントをスキャンするコンパイラによって、CSP ドキュメントに記述されたタグの構造と一致するオブジェクト・ツリーが 生成されます。このツリー構造は、サーバ側のドキュメント・オブジェクト・モデル と呼ばれます。これは、HTML ページが 表示されるときにブラウザに存在するドキュメント・オブジェクト・モデルに似ています。 92 Caché Server Pages (CSP) の使用法 サーバ・ドキュメント・オブジェクト・モデル サーバ側のドキュメント・オブジェクト・モデルは、%CSP.AbstractAtom クラスのサブクラスのインスタンスから構成され、 HTML ドキュメントの単位を表しています。HTML ドキュメントは、Rule と TextAtom という 2 種類のアトム・オブジェクト で構成されています。これらは、それぞれのクラスである %CSP.Rule と %CSP.TextAtom で表されます。%CSP.Rule の サブクラスのインスタンスで表される Element は、HTML タグ、その属性値、内部 HTML、そしてこれに含まれる任意の 内部タグに相当します。TextAtom は、Element 以外のすべてを表します。効率を上げるため、CSP コンパイラはルー ル・マッチングに関係するタグの Element オブジェクトのみを生成します。その他 (例えば <B> や <I> タグ) は TextAtom オブジェクトに含まれます。 例えば、<MYTAG> タグのルールを記述した次の CSP ドキュメントを考えます。 <html> <body> Hello! <MYTAG MSG="Welcome"> </body> </html> これによって、以下のサーバ側のドキュメント・オブジェクトが構成されます。 • TagName が HTML の Element (子を含む) – TagName が body の Element (子を含む) • Text が Hello! の TextAtom • TagName が MYTAG で、MSG 属性が Welcome の Element (効率を上げるために) サーバ側のドキュメント・オブジェクト・モデルは、ページ・コンパイル中にのみ生成され実行時に は存在しません。コンパイル時に実行する式やコードをアクションで指定してサーバ側のドキュメント・オブジェクト・モデ ルを活用するのは、主にこのためです。 CSP コンパイラはドキュメント・オブジェクト・モデルを構成した後、ドキュメントを以下の方法で処理します。まず、ツリー 構造の最下層から上位に向かってオブジェクトを検索し、ツリー中のそれぞれの %CSP.Rule オブジェクトにかかわるルー ルを適用し、その結果を実行可能なコードに記述します。%CSP.TextAtom オブジェクトは、定義によりルールを持たな いので、実行可能なコードに直接記述されます。 8.4.1 ルール属性値へのアクセス ルールを実行するとき、そのルールに関連付けられた %CSP.Rule オブジェクトへの参照を、現在のオブジェクトを介して 利用できます。 例えば、VALUE 属性を使用して指定したメッセージを、太字のイタリック体テキストとして表示するカスタム <MESSAGE> タグを定義するとします。 <MESSAGE VALUE="Yo!"> このルールの定義は、以下のとおりです。 <csr:rule name="MESSAGE" match="MESSAGE" empty> <csr:action> <B><I>##(..GetAttribute("VALUE"))##</I></B> </csr:action> </csr:rule> <MESSAGE> タグが検出されると、必ず MESSAGE ルールが実行 (RenderStartTag が呼び出されるなど) されます。その アクションは以下のとおりです。 1. <B> タグと <I> タグを記述します。 2. タグ・オブジェクトの値を書き出します。 Caché Server Pages (CSP) の使用法 93 カスタム・タグの開発 3. <B> タグと <I> タグを閉じます。 8.5 アクション内での <csr> タグの使用 ルールのアクション定義内で、以下のようなタグが使用できます。ここでは以下について説明します。 • <csr:default> タグ • <csr:children> タグ • <csr:section> タグ 8.5.1 <csr:default> タグ <csr:default> タグは、このルールに関連付けられたタグの内容を直接記述します。例えば、以下のルールは <ECHO> タグ、およびその属性と子を記述します。 <csr:rule name="ECHO" match="ECHO" > <csr:action> <csr:default> </csr:action> </csr:rule> このタグは主に、タグの属性の一部を変更し、それ以外は変更しないときに使用されます。例えば、CSP ページのすべ てのテーブルの背景を赤にするには、次のように <table> タグに対するルールを定義します。 <csr:rule name="REDTABLE" match="TABLE" > <csr:action> <script language="Cache" runat="COMPILER"> // set the bgcolor attribute for this element Do ##this.SetAttribute("BGCOLOR","red") </script> <csr:default> </csr:action> </csr:rule> このルールが適用されると、(コンパイル時のスクリプトを使用して) すべての <TABLE> タグの BGCOLOR 属性の値は red に変更されますが、テーブル・タグ (その子も含め) の他の特性は変更されません。 8.5.2 <csr:children> タグ <csr:children> タグは、タグが持つ子タグをすべて記述します。これは、<csr:default> タグと違い、このルール に関連付けられたタグ自体は対象としません。このタグは、囲んでいるタグがどのように表されるかを完全に把握する必 要があるが、その子についてはどのように表されるかを気にしない場合に使用します。 8.5.3 <csr:section> タグ <csr:section> タグは、生成された HTML ページ内で、目的の内容を記述する位置を指定します。既定では、実行 時の HTML ページ内で、CSP ドキュメント内のルール・タグが記述されている位置に相当する位置に、テキストが記述 されます。<csr:section> タグを使用すれば、これを変更できます。例えば、HTML ページの本文にボタンを作成し、 それに対応する JavaScript をページの冒頭に作成するルールを定義するとします。そのために、以下のルールを定義 します。 94 Caché Server Pages (CSP) の使用法 アクション外での <csr> タグの使用 <csr:rule name="MYBUTTON" match="FORM/*/MYBUTTON" empty> <csr:action> <csr:section NAME=HEAD> <script language="JavaScript"> function MyButton() { alert('MyButton pressed!'); return true; } </script> </csr:section> <input type="button" value='##(##this.GetAttribute("VALUE"))##' onclick="MyButton();"></input> </csr:action> </csr:rule> 8.6 アクション外での <csr> タグの使用 ルール定義でアクションの外部で使用できる <csr> タグが用意されています。ここでは以下のタグについて説明しま す。 • <csr:class> タグ • <csr:property> タグ • <csr:description> タグ • <csr:attribute> タグ 8.6.1 <csr:class> タグ <csr:class> タグでは IMPORT、SUPER、または INCLUDES の各属性を使用できるので、生成されたルール・クラス は他のクラス・メソッドにアクセスできます。 この例は、<csp:else> タグのルール定義の中で見ることができます。その定義では、%CSP.RuleBlock がスーパーク ラスとして指定されています (既定では、CSR ページの DOM (ドキュメント・オブジェクト・モデル) モデル内の要素を表 す、すべてのクラスのスーパークラスは %CSP.RuleElement です)。 <csr:rule name="%ELSE" match="CSP:IF/CSP:ELSE" empty> <csr:class super=%CSP.RuleBlock> <csr:action> <SCRIPT LANGUAGE=Cache RUNAT=COMPILER> New ifblock Set ifblock=..GetCurrentBlock() If ifblock'="" { If ifblock.EndLabel="" Set ifblock.EndLabel=..GetNewLabel() Do ..WriteServer(" Goto "_ifblock.EndLabel_" ;}") Do ..WriteServer(ifblock.NextLabel_" ;{") Set ifblock.NextLabel="" } </SCRIPT> </csr:action> </csr:rule> 8.6.2 <csr:property> タグ <csr:property> タグは、ルール・クラス内のプロパティを定義します。このタグを使用すると、生成した csr クラスのプ ロパティを指定できます。<csr:property> の使用法として、開始タグを記述するときにプロパティを設定し、終了タグ を記述するときにそのプロパティをチェックするというものがあります。name 属性は、プロパティ名を指定します。指定し たプロパティの以下の属性がサポートされます。 • name Caché Server Pages (CSP) の使用法 95 カスタム・タグの開発 • description • final • initial • multidimensional • private • transient • type 8.6.3 <csr:description> タグ <csr:description> タグには、カスタム・ルールの説明のほか、必要に応じてその例を記述します。 以下は、%SQLCURSOR ルールから抜粋した、このタグの例です。 <csr:description> The <b>SCRIPT LANGUAGE=SQL</b> creates embedded SQL for a DECLARE CURSOR statement in the class generated by the CSP page. The declared cursor will be opened using an SQL OPEN statement and the SQLCODE will be returned. It is the programmers responsibility to display any error indicated by the SQLCODE value.<p> The mode of the query is determined by the MODE attribute. The mode is taken to be a runtime mode by default. If the COMPILERMODE attribute is specified, then the mode is taken to be a compile time mode that is defined by a generated #SQLCOMPILE statement. <p>For example: <EXAMPLE> <SCRIPT LANGUAGE=SQL CURSOR=prsn> select name,ssn from sample.person where ssn %STARTSWITH '2' order by ssn </script> <CSP:WHILE CURSOR=prsn INTO='Name,ssn' counter=x condition=(x<3)> Name: #(Name)#<br> SSN: #(ssn)#<br> </CSP:WHILE> </EXAMPLE> <p>Will display all people whose ssn begins with 1: <OUTPUT> Name: Smith, Joe<br> SSN: 111-11-1111<br> Name: Jones, Harry<br> SSN: 111-11-1122<br> and so on..<br> and so on..<br> </OUTPUT> </csr:description> 8.6.4 <csr:attribute> タグ <csr:attribute> タグには、カスタム・タグの属性のリストと各タグの簡単な説明を記述します。 以下は、<csp:content> タグから抜粋した例です。 <csr:attribute name=Type description="Specify the default Content-Type" type="contentType:STRING" > <csr:attribute name=Charset description="Specifies the default charset" type="charSet:STRING" > <csr:attribute name=NoCharSetConvert description="Turns off the charset conversion" type="noCharSetConvert:STRING" > 96 Caché Server Pages (CSP) の使用法 ルール・クラスの使用 8.7 ルール・クラスの使用 ルール・コンパイラは、コンパイルされる各ルール定義のクラスを生成します。ルールが該当した時に、このコードが実行 されます。これによって以下の利点が得られます。 1. 高い機能を持つルールが実現します。 2. ルールをクラスとして直接作成できます。 3. ルール・クラスをスタジオで表示、編集できます。 8.7.1 生成されたルール・クラスの構造 .csr ファイルからルールをコンパイルすると、生成されるルール・クラスは RenderStartTag メソッドのほか、ルール定義で コンパイル時コードを指定している場合は、1 つ以上の CompilerMethod メソッド () で構成されます。<csr:children> タグまたは <csr:default> タグがルール定義で定義されている場合は、RenderEndTag メソッドもこのクラスに追加さ れます。CompilerMethod メソッドはコンパイル時に実行されるコードを含みますが、RenderStartTag メソッドおよび RenderEndTag メソッドはそれぞれ、CSP ページ・クラスに直接記述されるコード式用の一連の Write メソッドから構成さ れます。使用される Write メソッドは式によって異なります。Write メソッドは、%CSP.AbstractAtom クラスで定義されま す。これについては、この章の後で説明します。 以下は、<csr:if> ルールに属するルール・クラスです。このクラスには RenderStartTag メソッドと RenderEndTag メソッ ドが含まれており、CompilerMethod の 2 つのインスタンスがあります。これらの各メソッドの詳細を、以下で説明します。 Import User Class %csr.csp.IF Extends %CSP.RuleBlock { Parameter CSRURL = "w:/csp/rules/Control.csr"; Method CompilerMethod1() [ Language = cache ] { Do ..NewBlock() Set ..NextLabel=..GetNewLabel() Do ..WriteServer( " If '(" _ $$UnEscapeHTML^%cspQuote(..GetAttribute("condition","0")) _ ") Goto " _ ..NextLabel _" ;{" ) } Method CompilerMethod2() [ Language = cache ] { New comment Set comment=" ;}" If ..EndLabel'="" Do ..WriteServer(..EndLabel_comment) Set comment="" If ..NextLabel'="" Do ..WriteServer(..NextLabel_comment) Do ..RemoveBlock() } Method RenderEndTag() As %Status { New element Set element=##this Set %statuscode=$$$OK Do ..CompilerMethod2() Quit:$$$ISERR(%statuscode) %statuscode Quit $$$OK } Method RenderStartTag() As %Status { New element Set element=##this Set %statuscode=$$$OK Do ..CompilerMethod1() Quit:$$$ISERR(%statuscode) %statuscode Quit $$$PROCESSCHILDREN } } Caché Server Pages (CSP) の使用法 97 カスタム・タグの開発 8.7.2 RenderStartTag メソッド RenderStartTag メソッドは、CSP ページに開始タグを記述するときに呼び出されます。RenderStartTag は、この要素を 記述するルーチン・ビルダ・オブジェクトにコードを書き込みます。<csr:action> の本文内の <csr:children> タ グの前に置かれるテキストは、一連の異なる write メソッドを使用して、ルーチン・ビルダ・オブジェクトに書き込まれます。 メソッドは、書き込まれるテキスト・タイプによって異なります。 以下はコードの例です。 <csr:action> <script language="Cache" runat=server> Set myfile="c:\temp.txt" Open myfile:("FR":100) Use myfile:() Read var1 Close myfile </script> </csr:action> これにより、コンパイル時に、以下の RenderStartTag メソッドが、作成されたルール・クラスに生成されます。 Method RenderStartTag() As %Status { New element Set element=##this Do ..WriteCSPServer(" Set myfile=""c:\temp.txt""",0) Do ..WriteCSPServer(" Open myfile:(""FR"":100)",1) Do ..WriteCSPServer(" Use myfile:() ",1) Do ..WriteCSPServer(" Read var1",1) Do ..WriteCSPServer(" Close myfile",1) Quit $$$SKIPCHILDREN } RenderStartTag メソッドには、ルール定義の構造に応じて、他の文を指定できます。アクションに <script runat=compiler> タグを指定していると、CompilerMethod メソッドが作成されます。これらの CompilerMethod メソッ ドは、以下のコマンドを使用して RenderStartTag メソッドの開始時に呼び出されます (CompilerMethod1 のインスタンス の例として示しています)。 Set %statuscode=$$$OK Do ..CompilerMethod1() Quit:$$$ISERR(%statuscode) %statuscode さまざまな Write メソッドと CompilerMethod メソッドの呼び出しに加え、RenderStartTag メソッドには、<csr:action> 定義で 1 つ以上の csr タグを使用しているかどうかにより、その他のコマンドも記述できます。 8.7.2.1 <csr:children> に対する Quit 文 .csr ファイルに <csr:children> タグを使用している場合、RenderStartTag メソッドの最終行は以下のようになります。 Quit $$$PROCESSCHILDREN これは、子が RenderStartTag メソッドの完了時に処理されることを示します。RenderEndTag メソッドは、明示的にクラス にも記述され、<csr:children> タグを呼び出した後に発生する文を書き込みます (既定では、RenderEndTag メソッ ドは何も行いません)。 8.7.2.2 <csr:default> に対する Quit 文 アクション定義で <csr:default> タグを使用すると、生成される RenderStartTag メソッドには以下のコマンドが記述 されます。 Do ..RenderDefaultStartTag() Quit $$$PROCESSCHILDREN 98 Caché Server Pages (CSP) の使用法 ルール・クラスの使用 8.7.3 CompilerMethod[n]() メソッド 1 つ以上の <script> タグに対して runat=compiler が指定されていれば、CompilerMethod メソッドが .csr ファイ ルから生成されます。これは、<script runat=compiler> 文の位置に応じて、RenderStartTag メソッドのどこからで も呼び出すことができます。コンパイル時コードを持つ <script> タグが複数あると、複数の CompilerMethod メソッド (CompilerMethod1()、CompilerMethod2() など) が生成されます。他の 2 つのメソッドとは異なり、.csr ファイルにあるコン パイル時 Caché ObjectScript 文は、このメソッドの本文に 1 行ずつコピーされます。 例えば、.csr ルール・ファイルにある以下のコンパイル時コードを考えます。 <script language="Cache" runat=compiler> SET ^client(2,1,1)=..InnerText() </script> この .csr ファイルがコンパイルされると、関連するルール・クラスに以下のメソッドが生成されます。 Method CompilerMethod1() [ Language = cache ] { SET ^client(2,1,1)=..InnerText() } 8.7.4 RenderEndTag メソッド <csr:children> タグまたは <csr:default> タグが .csr ファイル・ルール定義にあれば、RenderEndTag メソッドが ルール・クラスに生成されます。これは、終了タグの記述時に呼び出されます。<csr:children> タグの後に記述され るあらゆる文は、RenderStartTag メソッドと同様に、このメソッド内でルーチン・ビルダに記述されます。 以下は、CSP サンプル・ページの barchart.csr 例にあるルール定義のサンプルです。テーブル宣言内の <csr:children> タグの配置に注意してください。 <csr:rule name="iscbarchart" match="isc:barchart" language="any"> <csr:action> <table bgcolor='##(..GetAttribute("BGCOLOR"))##' border=0 cellspacing=0 style='border: ##(..GetAttribute("BORDER","solid blue"))##;'><tr> <csr:children> </tr></table> </csr:action> </csr:rule> コンパイル時に、RenderStartTag メソッドの Quit 文で子を処理するプロセス呼び出しにより、iscbarchart ルール・クラ スが生成されます。ルール・ファイル内の <csr:children> タグの後にある HTML は、RenderEndTag メソッドに記述 されます。 Import User Class csr.csp.iscbarchart Extends %CSP.Rule { Parameter CSRURL = "w:/csp/samples/barchart.csr"; Method RenderEndTag() As %Status { New element Set element=##this Do ..WriteText("",1) Do ..WriteCSPText("</tr></table>",0) Quit $$$OK } Method RenderStartTag() As %Status { New element Set element=##this Do ..WriteText("",1) Do ..WriteCSPText( "<table bgcolor='##(..GetAttribute(""BGCOLOR""))##' border=0 cellspacing=0" ,1) Do ..WriteCSPText( " style='border: ##(..GetAttribute(""BORDER"",""solid blue""))##;'><tr>" ,0) Caché Server Pages (CSP) の使用法 99 カスタム・タグの開発 Quit $$$PROCESSCHILDREN } } 8.8 %CSP.Rule メソッドの使用 %CSP.Rule クラスには、<csr> ルール定義で使用できるインスタンス・メソッドがいくつかあります。これらのメソッドは、次 の 2 つのタイプのうちのいずれかです。 • 読み取り専用で、要素の値を返すメソッド GetAttribute QuoteAttribute GetAttributesOrdered IsDefined • ドキュメント・オブジェクト・モデルの要素を変更するメソッド InnerText AddChildElement SetAttribute OnMatch 8.8.1 GetAttribute メソッド 8.8.1.1 構文 GetAttribute(name As %String, default As %String = "") GetAttribute メソッドは、この要素に対する HTML 属性 name の値を取得します。この値には、解決された ##( )## 式 および ##''## 式が既に設定されています。 以下は、HTML グリッドの名前とサイズのセットの例です。 Set tablename=##this.GetAttribute("NAME") Set maxcols=##this.GetAttribute("COLS") Set maxrows=##this.GetAttribute("ROWS") 8.8.2 QuoteAttribute メソッド 8.8.2.1 構文 QuoteAttribute(name As %String, default As %String = "") QuoteAttribute メソッドは、この要素に対する HTML 属性 name の値を取得します。評価された #()# 式、##( )## 式、 および ##''## 式で置き換えるために、その値は引用符で囲まれます。 以下では、<csp:loop> タグを例として使用しています。文字列型の属性が 1つ ("counter") と整数型の属性が 3 つ ("FROM"、"STEP"、"TO") 含まれています。これは、それらの値を取得し、CSP ページ上に文字列として表示します。 100 Caché Server Pages (CSP) の使用法 %CSP.Rule メソッドの使用 <SCRIPT LANGUAGE=Cache RUNAT=COMPILER> New counter,from,step,to Set counter=..GetAttribute("counter","counter") Set from=..QuoteAttribute("FROM",1) Set step=..QuoteAttribute("STEP",1) Set to=..QuoteAttribute("TO",1) Do ..NewBlock() Do ..WriteServer(" For "_counter_"="_from_":"_step_":"_to_" {") </SCRIPT> 8.8.3 GetAttributesOrdered メソッド 8.8.3.1 構文 GetAttributesOrdered(ByRef paramsordered) GetAttributesOrdered メソッドは、すべてのパラメータを順序付けられた配列で返します。 8.8.4 IsDefined メソッド 8.8.4.1 構文 IsDefined(name As %String) IsDefined メソッドは、HTML 属性 name が定義されているかどうかを示します。 If ..IsDefined("CAPTION") { Do ..WriteServer(setCmd _ " nvp(""CAPTION"") = " _ ..QuoteAttribute("CAPTION")) } 8.8.5 InnerText メソッド 8.8.5.1 構文 InnerText() InnerText メソッドは、開始タグと終了タグの間に含まれるテキストを取得します。 このメソッドを使用して、タグのコンテンツを集めて、言語とドメイン属性によって指定されたテキストと置換します。 Set %text=##class(%CSP.TagLanguage).GetText(##this,..InnerText()) 8.8.6 AddChildElement メソッド 8.8.6.1 構文 AddChildElement(atom As %CSP.AbstractAtom) AddChildElement メソッドは、この要素に子アトムを追加します。 8.8.7 SetAttribute メソッド 8.8.7.1 構文 SetAttribute(name As %String, value As %String) Caché Server Pages (CSP) の使用法 101 カスタム・タグの開発 SetAttribute メソッドは、この要素の HTML 属性 name を value に設定します。 以下の例では、"NAME" 属性が指定されていなければ、"NAME" 属性を既定値 ("FORM") に設定します。 If ('..IsDefined("NAME")) { Do ..SetAttribute("NAME","FORM") } 8.8.8 OnMatch メソッド 8.8.8.1 構文 OnMatch(rule As %CSP.Rule) returns %Status ルールの既定の OnMatch メソッドは、何も実行しません。OnMatch は、ユーザ・ルールによってオーバーライドされる場 合があります。 一般的に、このメソッドの機能について、つまり、ルールが一致するかをメソッドがチェックする方法について説明します。 アプリケーションですべての CSP ページによって継承される共通コードを作成する方法のひとつは、OnMatch メソッド をオーバーライドすることです。 選択されたルールがルール DOM に追加されると、一致するルールごとに OnMatch メソッドが呼び出されます。ルール が照合され、複数のルールが同じ選択に一致すると、OnMatch がそれぞれ呼び出されます。この順序はコンパイルの 順序およびその他の要因に依存しているため、この順序自体に依存することはできません。 OnMatch メソッドに渡されるルール・クラス・インスタンスが、DOM に追加された選択されたルールです。このルールは、 (XSLT 選択ルールに非常に類似したルールに従って) 最も明確な照合を実行するルールです。一致するルール・クラ スすべての OnMatch が、この最も選択的なルールを使用して呼び出されます。 OnMatch メソッドは、渡されたルールを使用して DOM を更新できます。同梱の url.csr 内の %URL.FORM ルールおよ び添付サンプルを参照してください。サンプル・ルールは、組み込みシステム・ルールほど選択的ではありませんが、こ れによって、既定の動作を継続できます。OnMatch コールバックは、これを目的として設計されています。このコールバッ クは、最も選択的なルールではなくても、ルールが一致したときに呼び出されるためです。サンプルの代替として、カス タム・ルールを作成し、それを DOM に追加してから、ページ・クラス生成時に DOM が検索されているときに必要な修 正を施すことができます。このオプションは可能ですが、より複雑です。 OnMatch メソッドをオーバーライドする代わりに、独自のルールにコードを追加できます。システム・ルールをオーバーラ イドすることはお勧めしません。 システム・ルール (特に html、head、および body) のオーバーライドには、厳密な注意とルール・コンパイラの内部に 対する依存が必要です。インターシステムズは、isc:SAMPLE ルールを作成し、各ページにそのルールを追加し た、/csp/samples CSP ページに使用した方法を使用することをお勧めします。既存のページにわたってループし、新 しいカスタム・タグを追加するルーチンを記述することは簡単です。 8.9 <csr> %CSP.AbstractAtom Write メソッドの使用 ルール・クラスの RenderStartTag メソッドおよび RenderEndTag メソッドで使用される write メソッドは、ルール定義によ り生成されたコードを CSP ページ・クラスに記述します。これにより、CSP ページ・クラスは、そのページが要求された時 に、指定された動作を実行するうえで必要な適切なコマンドを含むことができます。%CSP.AbstractAtom クラスは、これ らの write メソッドの定義を指定します。 • WriteText • WriteCSPText 102 Caché Server Pages (CSP) の使用法 <csr> %CSP.AbstractAtom Write メソッドの使用 • WriteExpression • WriteServer • WriteCSPServer 8.9.1 WriteText メソッド 8.9.1.1 構文 WriteText(line As %String, crlf As %Boolean = 0) WriteText コマンドは、CSP ページ・クラスに Write コマンドを生成し、行のコンテンツを記述します。これには、2 つの 引数、つまり記述する文字列と、新しい行を記述するかどうかを示すキャリッジ・リターン/改行ブーリアンが含まれます。 8.9.2 WriteCSPText メソッド 8.9.2.1 構文 WriteCSPText(line As %String, crlf As %Boolean = 0) WriteCSPText コマンドは Write コマンドを CSP ページ・クラスに生成し、 ##()##、 ##''##、#server, #url、お よび #()# 式の処理を使用して行の内容を書き込みます。これには、2 つの引数、つまり記述する文字列と、新しい行 を記述するかどうかを示すキャリッジ・リターン/改行ブーリアンが含まれます。例えば、.csr ルール・ファイルの <csr:action> タグの本文にある以下の行を考えます。 <B><I>##(##this.GetAttribute("VALUE"))##</I></B> これは、コンパイル時に以下の文をルール・クラスに生成します。 Do ..WriteCSPText("<B><I>##(##this.GetAttribute(""VALUE""))##</I></B>",0) 8.9.3 WriteExpressionText メソッド 8.9.3.1 構文 WriteExpressionText(expr As %String, crlf As %Boolean = 0) WriteExpressionText コマンドは、CSP ページ・クラスに write コマンドを生成し、Caché ObjectScript 式によって返され るテキストを記述します。返されるテキストは、既に適切に引用符で囲まれています。これには、2 つの引数、つまり記述 する文字列と、新しい行を記述するかどうかを示すキャリッジ・リターン/改行ブーリアンが含まれます。 8.9.4 WriteServer メソッド 8.9.4.1 構文 WriteServer(line As %String, keepTogether As %Boolean = 0) WriteServer コマンドは、行内にある CSP ページ・クラスに Caché ObjectScript コマンドを生成します。これには、2 つの 引数、つまり記述する文字列と、その文字列をその前の文に加えるかどうかを示すブーリアンが含まれます。 Caché Server Pages (CSP) の使用法 103 カスタム・タグの開発 8.9.5 WriteCSPServer メソッド 8.9.5.1 構文 WriteCSPServer(line As %String, keepTogether As %Boolean = 0) WriteCSPServer コマンドは、評価された ##()##、#()#、および ##''## に対応する CSP ページ・クラスに Caché ObjectScript コマンドを生成します。これは、2 つの引数、つまり記述する文字列と、その文字列をその前の文に加えるかどうかを示 すブーリアンを持ちます。例えば、.csr ルール・ファイル内の以下の Caché ObjectScript コードを考えます。 <script language="Cache" runat=server> Set myfile="c:\temp.txt" Open myfile:(80:"C":"|") Use myfile:() Read ^client(3,1,1) Close myfile </script> これは、コンパイル時に以下の文をルール・クラスに生成します。 Do Do Do Do Do ..WriteCSPServer(" ..WriteCSPServer(" ..WriteCSPServer(" ..WriteCSPServer(" ..WriteCSPServer(" Set myfile=""c:\temp.txt""",0) Open myfile:(80:""C"":""|"") ",1) Use myfile:()",1) Read ^client(3,1,1)",1) Close myfile",1) 8.10 <csr> %cspQuote メソッドの使用 %cspQuote ルーチン定義には、2 種類の quoting メソッドに対する定義があります。 • Quote • QuoteCSP 8.10.1 Quote メソッド 8.10.1.1 構文 $$Quote^%cspQuote(line As %String) 出力文字列を、引用符で囲みます。 8.10.2 QuoteCSP メソッド 8.10.2.1 構文 $$QuoteCSP^%cspQuote(line As %String) 入力文字列を引用符で囲み、#()#、##()##、##''##、#server、および #url の各呼び出しを評価します。 104 Caché Server Pages (CSP) の使用法 テーブルを表示する <grid> タグの作成 8.11 テーブルを表示する <grid> タグの作成 ここでは、GridExample というルールの例を示します。このルールは、CSP ページに情報のテーブルを作成する次の 2 つのタグを作成します。 • <GRID> タグ • <GRIDDATA> タグ 8.11.1 Grid ルール定義 <csr:rule name="GridExample" match="GRID"> <csr:action> <script language =Cache runat=compiler> Set maxrows=##this.GetAttribute("COLS") Set maxcols=##this.GetAttribute("ROWS") Do ..WriteText("<TABLE>",1) Set GRIDDATA="" ;Get Grid Data Set count=##this.Children.Count() For i=1:1:count { Set el=##this.Children.GetAt(i) Set tagname=el.TagName If tagname="GRIDDATA" { Set value=el.GetAttribute("VALUE") Set col=el.GetAttribute("COL") Set row=el.GetAttribute("ROW") Set GRIDDATA(row,col)=value } } ; Write Grid Elements For row=1:1:maxrows { Do ..WriteText("<TR>",1) For col=1:1:maxcols { Set d=$G(GRIDDATA(row,col)) Do ..WriteCSPText("<TD>"_d_"</TD>",1) } } Do ..WriteText("</TR>",1) Do ..WriteText("</TABLE>",1) </SCRIPT> </csr:action> </csr:rule> <GRIDDATA> 属性は <GRID> のルール定義で扱われますが、<GRIDDATA> タグをインスタンス化するためには空の ルールも引き続き必要です。 <csr:rule name="GridDataExample" match="/GRID/GRIDDATA"> <csr:description> This purpose of this empty rule is to instantiate the GRIDDATA tag into the Document Object Model. </csr:description> <csr:action> <csr:default> </csr:action> </csr:rule> 8.11.2 生成された Grid クラス 上記のルール定義は、以下の 2 つのクラスにコンパイルされます。 • Grid • GridData Caché Server Pages (CSP) の使用法 105 カスタム・タグの開発 8.11.2.1 Grid クラス Import User Class csr.csp.GridExample Extends %CSP.Rule { Parameter CSRURL = "/csp/user/GRIDEXAMPLE.CSR"; Method CompilerMethod1() [ Language = cache ] { Set maxrows=##this.GetAttribute("COLS") Set maxcols=##this.GetAttribute("ROWS") Do ..WriteText("<TABLE>",1) Set GRIDDATA="" ;Get Grid Data Set count=##this.Children.Count() For i=1:1:count { Set el=##this.Children.GetAt(i) Set tagname=el.TagName If tagname="GRIDDATA" { Set value=el.GetAttribute("VALUE") Set col=el.GetAttribute("COL") Set row=el.GetAttribute("ROW") Set GRIDDATA(row,col)=value } } ; Write Grid Elements For row=1:1:maxrows { Do ..WriteText("<TR>",1) For col=1:1:maxcols { Set d=$G(GRIDDATA(row,col)) Do ..WriteCSPText("<TD>"_d_"</TD>",1) } } Do ..WriteText("</TR>",1) Do ..WriteText("</TABLE>",1) } Method RenderStartTag() As %Status { New element Set element=##this Set %statuscode=$$$OK Do ..CompilerMethod1() Quit:$$$ISERR(%statuscode) %statuscode Quit $$$SKIPCHILDREN } } 8.11.2.2 GridData クラス Import User Class csr.csp.GridDataExample Extends %CSP.Rule { Parameter CSRURL = "/csp/user/GRIDEXAMPLE.CSR"; Method RenderEndTag() As %Status { New element Set element=##this Do ..RenderDefaultEndTag() Quit $$$OK } Method RenderStartTag() As %Status { New element Set element=##this Do ..RenderDefaultStartTag() Quit $$$PROCESSCHILDREN } } 8.11.3 グリッド・ルールの使用 グリッド・ルールは、CSP ページの本文内で使用できるようになりました。 106 Caché Server Pages (CSP) の使用法 テーブルを表示する <grid> タグの作成 <html> <head> <title>Grid Example</title> </head> <body> <grid cols="5" rows="5"> <griddata value="Cell-1-1" col="1" </griddata> <griddata value="Cell-2-1" col="2" </griddata> <griddata value="Cell-2-2" col="2" </griddata> <griddata value="Cell-2-3" col="2" </griddata> <griddata value="Cell-2-4" col="2" </griddata> <griddata value="Cell-2-5" col="2" </griddata> <griddata value="Cell-3-1" col="3" </griddata> <griddata value="Cell-4-1" col="4" </griddata> <griddata value="Cell-4-3" col="4" </griddata> <griddata value="Cell-5-1" col="5" </griddata> <griddata value="Cell-5-5" col="5" </griddata> </grid> </body> </html> row="1"> row="1"> row="2"> row="3"> row="4"> row="5"> row="1"> row="1"> row="3"> row="1"> row="5"> 8.11.4 グリッド・ルール表示ページ CSP ページは、以下を表示します。 Cell-1-1 Cell-2-1 Cell-3-1 Cell-4-1 Cell-5-1 Cell-2-2 Cell-2-3 Cell-4-3 Cell-2-4 Cell-2-5 Cell-5-5 Caché Server Pages (CSP) の使用法 107 A CSP エラーの注釈 この章では、CSP エラーをいくつか選択し、その原因や解決法について説明します。 テーブル I–1: CSP エラー・コード、エラー・メッセージ、およびエラー発生条件 エラー・ コード エラー・メッセージ エラー発生条件 5902 ルール %1 は存在しません。 %apiCSP を呼び出してルールに属性を追加するときに、存 在しないルール名を指定すると発生します。 5903 ルール名が必要です。 ルールを追加または削除するときに、そのルールの名前を 指定していない場合に発生します。 5904 行番号 %3 のタグ '<%1>' には属性 '%2' が必要です。 CSP ページのタグに必須属性を指定しなかった場合に発生 します。この必須属性を指定しないとページをコンパイルで きません。 5905 行番号 %3 にある属性 %1 の値 %2 は無 効です。 CSP ページ内の属性値が無効である場合に発生します。 例えば、<script language="Cache" runat="XXXXX"> を定義すると、runat 値は無効です。 CSP コンパイラはこのページをコンパイルすることはできず、 このエラーを報告します。 5906 セッション ID が見つかりません。 %New メソッドでセッション ID を指定せずに %CSP.Session のインスタンスを作成しようとした場合に発生します。例え ば、Set session=##class(%CSP.Session).%New() を指定すると、このエラーが発生しますが、Set session=##class(%CSP.Session).%New(1234) を 指定すると、セッション ID 1234 が渡されるのでエラーは発 生しません。 5907 セッション ID %1 は存在しません。 既存の %CSP.Session をロードするときに、Caché に格納さ れていないセッション ID を %OpenId に渡そうとすると発生 します。 5908 クラス %1: %2 の作成に失敗しました。 CSP ページに対応するクラスが生成できない場合、CSP コ ンパイラによってこのエラーが報告されます。 5909 行番号 %2 のタグ <%1> に終了のタグが ありません。 ルール定義で終了タグが要求されているタグを開いた後、 終了タグを記述していないと発生します。 Caché Server Pages (CSP) の使用法 109 CSP エラーの注釈 エラー・ コード エラー・メッセージ エラー発生条件 5911 文字セット %1 がインストールされていな いため、文字セットの変換を実行できま せん。 このページを出力するために CSP ページで指定された文 字セットが、Caché にインストールされていない場合に報告 されます。これは、OnPreHTTP メソッドの %response.CharSet プロパティに指定された文字セット、または <csp:content charset="xxx"> タグまたは <meta http-equiv="Content-Type" content="text/html; charset=xxx"> タグを使用し て目的のページで指定した文字セットです。クラス %CSP.Page の charset プロパティを参照してください。エラー で報告された文字セットを使用するかどうかを確認し、使用 する場合は、その文字セットを Caché にインストールする か、OnPreHTTP メソッドの %response.CharSet プロパティ を設定します。 5912 CSP ページ %1 は存在しません。 存在しない CSP ページを要求すると発生します。URL のス ペルが間違っているか、他の CSP ページへのリンクが正し くありません。このページがサーバに存在するかどうかを確 認し、存在しない場合はリンク元を確認します。ページが存 在する場合は、CSP アプリケーションが正しいディレクトリを 指すように設定されているか、また CSP ファイルがディスク に存在するかを確認します。このエラーは、autocompile オプションがオンの状態で、CSP エンジンがこのページにア クセスしてコンパイルしようとしてもファイルが見つからない 場合に発生します。 5914 CSP アプリケーション %1 は存在しませ ん。 URL のアプリケーション部分が CSP アプリケーション・リス トで見つからない場合に発生します。例え ば、/cspx/samples/menu.csp というページをロードすると きに、csp ではなく cspx と入力すると、Caché は正しい CSP アプリケーションを見つけることができません。管理 ポータルの [ウェブアプリケーション] ページ ([システム] > [セキュリティ管理] > [ウェブアプリケーション]) でアプリケー ションのリストを確認し、コマンドに誤りがないかを確認しま す。 5915 ライセンスを割り当てることができませ ん。 ライセンス数が上限に達しているので、CSP セッションに対 する新しい要求が許可されない場合に発生します。CSP ア プリケーション構成で指定されている、CSP セッションの既 定のタイムアウトを減らすか、ライセンスを追加購入する必 要があります。 5916 不正な CSP 要求です。 プライベート・ページにアクセスする際に、このページにアク セスできる暗号化されたトークンを持つ CSP ページからの リダイレクトではなく、URL の直接指定でアクセスしようとす ると、このエラーが発生します。また、暗号化されたトークン が無効である場合も、このメッセージが報告されます。 110 Caché Server Pages (CSP) の使用法 CSP エラーの注釈 エラー・ コード エラー・メッセージ エラー発生条件 5917 CSP は HTTP メソッド %1 をサポートし ていません。 サポートされていない HTTP メソッドを使用しようとすると発 生します。サポートされる HTTP メソッドは GET、POST、 HEAD の 3 つです。現在、他の HTTP メソッドは CSP サー バではサポートされていません。また、CSP サーバと通信し ている CSP ゲートウェイのバージョンが適合しない場合も、 このメッセージが得られます。 5918 ログアウトされているため、動作を実行 できません。 CSP 要求には暗号化されたデータが含まれていても、セッ ションが新規であるため、解読キーが暗号化されたデータ に一致しない場合に発生します。普通は、セッションがタイ ムアウトしていることが原因です。ユーザは引き続いて、ブ ラウザでもう一度要求を発生させるような何らかの操作を実 行します。セッションのタイム・アウト値を増やしたり、ユーザ を初期ページに転送するエラー・メカニズムを使用して、ア クションを再開することができます。 5919 要求した動作は無効です。 一般的に、暗号化された文字列を CSP ページから Caché に渡すとき、データを暗号化する際に使用したキーと解読 キーが一致しない場合に発生します。これは、ユーザが URL を手作業で変更したり、暗号化された文字列が Caché で生 成された後、次の HTTP メッセージで Caché に返送される までの間に文字列の値が何らかの形で変更された場合に 発生します。 5920 ネームスペース %1 からこの CSP ペー ジを実行する必要があります。 各 CSP アプリケーションは、Caché の特定のネームスペー スと連携しています。例えば、/csp/samples が SAMPLES ネームスペースに結び付けられているにもかかわらず、USER ネームスペースの /csp/samples/loop.csp からページをコ ンパイルしようとしたときなどに、このエラーが発生します。 5921 CSP アプリケーション %1 は実行先ネー ムスペースを指定する必要があります。 CSP アプリケーションの構成にネームスペースが指定され ていない場合に発生します。管理ポータルではネームスペー スを指定せずに CSP アプリケーションを作成することはで きないので、一般的にこのエラーは、CPF ファイルが手動で 不正に改変されていることを示します。 5922 返答待ち時間のタイムアウトです。 通信中の HTTP サーバからの応答を待機している %Net.HttpRequest オブジェクトがタイムアウトになると発生 します。 5923 %1 回リダイレクトされました。リダイレク ションループと考えられます。 1 つのページで 5 個以上のリダイレクトが検出された場合 に発生します。この場合、コンパイラはループが存在するも のと見なします。CSP ページで他のページに移動するため に ServerSideRedirect を使用している場合、A.csp ページ が B.csp にリダイレクトされていて、そこから A.csp にリダイ レクトされていると、ループが発生します。 Caché Server Pages (CSP) の使用法 111 CSP エラーの注釈 エラー・ コード エラー・メッセージ エラー発生条件 5924 エラーが発生しましたが指定されたエ ラーページが表示できませんでした Web マスタに通知してください。 CSP ページ内で実行中にエラーが発生した場合、CSP エン ジンはユーザが指定したエラー・ページにリダイレクトされま す。このエラー・ページでは、柔軟にエラーを処理できます。 しかし、ユーザが指定したエラー・ページが存在しない場合、 またはそのエラー・ページを生成する過程でエラーが発生し た場合、CSP エンジンは BACK^%ETN を使用して、何らか の問題が発生したという事実をログに記録し、このエラー・ メッセージを表示します。ユーザが作成したエラー・ページ にバグがあると、プロダクション・システムでもこのエラーが 発生することもあるので、このメッセージは故意にあいまい な表現になっています。このエラーを解決するためには、ま ず CSP アプリケーションで指定されたエラー・ページが存在 することを確認し、次にそのエラー・ページにバグがないか 検証します。"付録のよくある質問" で、このエラーに関する 質問も参照してください。 5925 <SCRIPT LANGUAGE=Cache> タグの行 番号 %1 に、RUNAT または METHOD のいずれかの属性がありません。 このコードを実行するタイミングを CSP コンパイラに指示す るために必要な runat 属性、または新規メソッドを作成する method メソッドが、<script language="Cache"> タグ にない場合に発生します。 5926 HTTP ヘッダが記述されフラッシュされた ため、転送できません。 データがブラウザに書き込まれた後で、サーバ側のリダイレ クト機能を使おうとすると発生しま す。%response.ServerSideRedirect 機能を使用して他のペー ジにリダイレクトする場合は、ブラウザに何らかのデータが 返送される前に実行する必要があります。つまり、通常は ページの OnPreHTTP() メソッド内で実行する必要がありま す。 5927 ページ %1 のクラス名と既にロードされて いるクラス %2 とが競合するため、この ページをロードできません。 別々のアプリケーションから、同じネームスペースに同じ名 前を持つ 2 つの CSP ファイルを設定すると発生します。例 えば、USER ネームスペースに /test と /anothertest という 2 つの CSP アプリケーションがあり、それぞれは Caché サーバの異なるディレクトリに存在し、それぞれの ディレクトリに test.csp ファイルがあるとします。 autocompile をオンにして URL /test/test.csp を入力す ると、CSP コンパイラはこのページをクラス csp.test にコン パイルします。URL /anothertest/test.csp を入力すると、 コンパイラはクラス csp.test を作成するためにこのページを ロードしようとしますが、別のアプリケーションで既に存在す るので、このエラーが発生します。エラーが発生しない場合 は、要求が発生するたびにページ全体をリコンパイルする といった、低機能の動作をします。同じネームスペースで同 じファイル名を使用することを避けるか、CSP アプリケーショ ンに定義されたパッケージを変更します。このパッケージは、 既定では csp に設定されます。例えば、パッケージ名 package を使用するように /anothertest を変更します。 これで test.csp をコンパイルすると、csp.test を使用する他 のアプリケーションと競合しないクラス名 package.test が生 成されます。 112 Caché Server Pages (CSP) の使用法 CSP エラーの注釈 エラー・ コード エラー・メッセージ エラー発生条件 5931 ページが表示される前にのみ、 OnPreHTTP() にこのメソッドを呼び出す か、値を設定できます。 何らかのデータがブラウザに出力される前にいくつかのパ ラメータを変更できるようにページの OnPreHTTP() メソッド で呼び出すことになっている関数を直接呼び出した場合に 発生します。これを解決するには、この呼び出しを OnPreHTTP メソッドに移動します。 5932 Web サーバ上のこの CSP ゲートウェイ・ バージョンで、動作は無効です。 使用している CSP ゲートウェイが、この動作をサポートして いないバージョンである場合に発生します。この機能を使用 しないか、CSP ゲートウェイのバージョンを新しいものにアッ プグレードしてください。 5933 CSP サーバに内部エラーがあります: %1 CSP エンジンで、予期しないエラー状況が発生した場合に 発生します。インターシステムズのサポート窓口に連絡して ください。 5954 CSP ページのロックに失敗しました。 CSP ページが自動コンパイルされるとき、2 つのジョブが同 時に同じページをコンパイルしないように、最初にこれをロッ クします。片方のジョブによって 60 秒以内にロックが解除さ れない場合、何らかの原因でコンパイルに失敗したと見なさ れ、このエラーメッセージが表示されます。Caché スタジオ からこのページをリコンパイルして、エラーが発生するかど うかを確認します。 5955 CSPAppList クエリ : Fetch() に無効な データがあります。 CSP アプリケーションのリストを決定するための問い合わせ が無効である場合に表示されます。このエラーは、実行中 のシステム上では発生しません。 5956 CSP アプリケーション %2 のディレクトリ %1 は存在しません。 CSP アプリケーションで指定されたディレクトリがファイルシ ステムに存在しない場合に発生します。 5961 文字セット %1 を変換できません。 ブラウザから要求を受け取ったときに発生します。ブラウザ から送信された情報がCaché の現在の既定のロケールに 変換されたときにエラーが発生しました。変換をデバッグす るには、ブラウザから送信された情報を切り離し、テストプロ グラムの中で手動でその文字セットを変換します。 5962 新規セッションを割り当てることができま せん。 このセッション ID に新規スロットが存在しないときに %session.ForceNewSession() を呼び出すと発生します。 5963 無効な SysLog レベルです: %1 内部ログ・レベルを設定するとき、レベルが許容範囲外に設 定されている場合に発生します。 Caché Server Pages (CSP) の使用法 113 B CSP に関するよくある質問 トラブルシューティング zenutils.js などの js ファイルに関する Zen エラーは、どのように解決すればよいでしょうか? CSP ゲートウェイを介して .js ファイルを処理するように Web サーバを構成する必要があります。これは、セキュリティ上 の問題により、外部 Web サーバを構成するオプションが選択されている場合でも、Caché インストーラでは実行されませ ん。詳細は、"CSP ゲートウェイ構成ガイド" を参照してください。オペレーティング・システムおよびユーザ構成オプショ ンのセクションを見つけてください。次にユーザ・オプション内で、“CSP ファイル拡張子のマップセクション” と “CSP へ のファイルの種類の追加登録” という 2つのセクションの片方または両方を (オプションに応じて) 見つけてください。 Apache Web サーバで、以下のコードを httpd.conf ファイルに追加します (他の方法もありますが、これが最も簡単で す)。 <Location /csp> CSP On SetHandler csp-handler-sa </Location> IIS7 では、以下の操作を行います。 1. コントロール パネルを開きます。[管理ツール]→[IIS マネージャ] を選択します。 2. 左側のメニューで、ご使用のコンピュータ名→[サイト]→[既定の Web サイト] の順に展開して、[csp] をクリックしま す。 3. 画面の右側で、[ハンドラー マッピング] をダブルクリックします。 4. 既存のマッピングをスクロールして、パス列に *.js と表示されているマッピングがあることを確認します。 *.js がない場合は、以下のようにして追加します。 1. [モジュール マップの追加] をクリックします。 Request Path: *.js Module: CSPms Name: CSP_js (or whatever else you want – any unused name works) 2. [要求の制限] をクリックします。 Mapping: Uncheck Invoke handler only if request is mapped to Verbs: Select All verbs Access: Select Script 3. *.gif、*.jpg、および *.svg について、以上の手順を繰り返します。 Caché Server Pages (CSP) の使用法 115 CSP に関するよくある質問 IIS6 では、以下の操作を行います。 1. コントロール パネルを開きます。[管理ツール]→[IIS マネージャ] を選択します。 2. 左のメニューで、ご使用のコンピュータ名→[Web サイト]→[既定の Web サイト] の順に展開して、[csp] をクリックし ます。 3. [CSP] を右クリックして、[プロパティ] を選択します。 4. [仮想] タブで [構成] をクリックします。 5. リストをスクロールして、*.js が含まれていることを確認します。 *.js がない場合は、以下のようにして追加します。 1. [モジュール マップの追加] をクリックします。 Request Path: *.js Module: CSPms Name: CSP_js (or whatever else you want – any unused name works) 2. [要求の制限] をクリックします。 Mapping: Uncheck Invoke handler only if request is mapped to Verbs: Select All verbs Access: Select Script 3. *.gif、*.jpg、および *.svg について、以上の手順を繰り返します。 CSP ページをデバッグするには、どのようにすればいいでしょうか? ドキュメント "Caché スタジオの使用法" の "スタジオ・デバッガの使用" の章で説明されている組み込みのスタジオ・デ バッガを使用します。 デバッグ, ブレークポイントの表示 を使用してブレークポイントを設定しないでください。エラーの原因になりやすいようで す。 1. CSP ページをデバッグするには、ツール, オプション, コンパイラ, 生成されたソースコードを保存 オプションにチェッ クを付ける必要があります。 2. [ワークスペース] ウィンドウを開いて、CSP フォルダに CSP ページがない場合は追加します。 3. CSP をコンパイルして、ツールバーの [他のコードを表示] アイコンをクリックします (または 表示, 他のコードを表示 を選択します)。これにより .cls ファイルおよび .int ファイルが表示されるようになります。例えば、ファイル A.CSP によって CSP.A.CLS および CSP.1.INT が生成されます。 4. .cls または .int ファイルで、ブレークポイントを設定したいコード行を右クリックし、デバッグ, ブレークポイント, ブレー クポイント切り替え を選択します (または行を選択して F9 を押します)。 5. デバッグ, デバッグターゲット, ZEN または CSP ページ を選択します。ドロップダウン・リストから、デバッガを実行す るターゲットの CSP ページを選択して、[OK] をクリックします (CSP ページを [ワークスペース] ウィンドウにドラッグ すると、ドロップダウン・リストに表示されます)。 6. [デバッグ] ツールバーの [進む] ボタンをクリックします。 例えば、「A から B」のようなフローを使用している場合、ページ A を表示して、ページ B へのリンクをクリックします。 ページ B にバグがある場合は、以下のように実行します。 1. A.CSP および B.CSP が [ワークスペース] ウィンドウに表示されていることを確認します。 2. 両方のファイルをコンパイルします。 3. 表示, ツールバー, デバッグ を選択して、[デバッグ] ツールバーを開きます。 116 Caché Server Pages (CSP) の使用法 CSP に関するよくある質問 4. デバッグ, デバッグターゲット, ZEN または CSP ページ を選択します。ドロップダウン・リストから、A.CSP を選択して、 [OK] をクリックします。 5. B.CSP を開いて、表示, 他のコードを表示 を選択し、csp.B.CLS を開きます。 6. csp.B.CLS で、OnPageBODY() メソッドの最初の行を右クリックして、デバッグ, ブレークポイント, ブレークポイント切 り替え を選択します。 7. [デバッグ] ツールバーの [進む] ボタンをクリックします。 8. ページ A が表示されます。 9. ページ B を表示するリンクをクリックします。 10. ページ B のブレークポイントでデバッガが停止します。 なぜ、以下のコードはコンパイルしないのですか? <script language="Cache" runat="server"> write "<script language=javascript>", ! write "int x = 10; alert(x);", ! write "</script>" </script> スクリプト・タグで runat="server" を使用して CSP ページをコンパイルするとき、コンパイラは Caché ObjectScript を実行し、それを HTML に変換してページに表示します。ただし、<script language="cache" runat="server"> タグを読み取った後は、Caché ObjectScript コードの最後を示すために </script> 終了タグを検索し、この場合、 write 文を検出します。これをコンパイルするために取得するには、</script> タグを以下のように 2 つの write 文 に分割します。 <script language="Cache" runat="server"> write "<script language=javascript>", ! write "int x = 10; alert(x);", ! write "</script",">", ! </script> &js<alert(“Error!”);> を使用して警告ボックスを表示する場合、警告ボックスではなく、テキスト alert(“Error!”) が表示されます。なぜでしょうか? この行を runat="server" コード・セクション、または runat="server" ブロックから呼び出されるメソッド内に記述 したことが原因である可能性があります。ページをロードするときに JavaScript を実行するには、前の回答で示した <script language="javascript"> タグを追加します。 &js<alert("Error!")> コードは、ロードされたページから JavaScript イベントを経由して、サーバ側メソッド内部で 動作します。 警告ボックスに Caché ObjectScript 変数を含めるには、どのようにすればよいでしょうか? #()# 構文を使用します。ご使用の Caché ObjectScript メソッド内部から、以下を実行します。 s error = "Bad password" &js<alert(#(..QuoteJS(error))#);> %CSP.Page クラスから提供されている QuoteJS は、適切に引用符が付いた JavaScript 文字列を返します。また、返され た結果に含まれるすべての引用符を適切にエスケープします。 Caché Server Pages (CSP) の使用法 117 CSP に関するよくある質問 以下のエラーが発生しました。 HTTP Request failed.Unable to process hyperevent. これはどういう意味ですか? ハイパーイベント・エラーは、ブラウザが CSP ブローカ・アプレットと通信しようとするけれども通信できない場合に発生し ます。これは、コード、または構成の問題に関係します。問題が自分のコードかどうか判断するには、http://localhost:57772/csp/samples/zipcode.csp をロードします (ここで、57772 は、Caché Web サーバのポート番号です。必要 に応じて 57772 を実際の Web サーバ・ポートで置き換えます。外部 Web サーバを実行している間は、これを除外しま す (http://localhost/csp/samples/zipcode.csp)。Caché がリモートでインストールされている場合は、localhost を IP アドレスまたはマシン名で置き換えます)。 郵便番号のページで、[#server] をクリックし 02142 などの郵便番号を [Zip] ボックスに入力し、Tab キーを押します。ハ イパーイベント・エラーが発生しない場合は、構成は適切に行われており、発生したハイパーイベント・エラーの原因は コードにあると考えられます。 問題がコードにあると考えられる場合、以下の 2 点を確認します。ページがロードされているときに、絶対に #server 呼 び出しを使用しないでください。<body> タグの OnLoad イベントで、直接的に、または OnLoad で呼び出される JavaScript メソッドから、#server を呼び出さないでください。また、runat="server" コード・ブロックの &js<> 行内部からの呼び 出しも実行しないでください。ページをロードするときにメソッドを呼び出す必要がある場合は、runat="server" ブロッ ク内部で Caché ObjectScript 構文を使用します。 <script language="cache" runat="server"> // if method is located in the page or in a class the page inherits from d ..mymethod() // if class cannot be called using dot syntax d ##class(User.MyClass).mymethod() </script> ルーチンでの問題を指摘するエラー・メッセージを受け取りましたが、INT ルーチンを見つけることができません。どこ にあるのでしょうか? 現在の設定によって、CSP ページのコンパイル時にソース・コードを保存しない場合があります。Caché でこのソース・ コードを保存するようにするには、以下の 2 つのうち 1 つを実行します。 • スタジオから、[ ] にチェックを付けて、CSP ページをコンパイルします。スタジオで、[ツール]→[オ プション]→[コンパイラ]→[一般フラグ] をクリックします。[生成されたソース・コードを保存] チェック・ボックスに、チェッ クを付けます。次に、[ビルド]→[コンパイル] をクリックして、CSP ページをコンパイルします。 • Caché ターミナルから、 するために k フラグを使用して、CSP ページをコンパイルします。ター ミナル で、適切なネームスペースにいることを確認します。適切なネームスペースにいない場合は、Zn “<namespace>” を入力してネームスペースを変更します。CSP ページをコンパイルするには、「Do $System.CSP.LoadPage(“/csp/<namespace>/<pagename>.csp”, “ck”)」を入力します。次に例を示します。 Do $System.CSP.LoadPage("/csp/samples/james.csp", "ck") 生成されたソース・コードを検索するには、以下の操作を実行します。 Caché スタジオ を開き、適切なネームスペースにいることを確認します。[ファイル]→[開く] をクリックします。[ファイルの 種類] の一覧から、[中間ルーチン (*.int)] をクリックします。csp.<csp_page_name>.x.INT を検索します。x は、一連のこの ルーチンの番号を示しています。容量の大きい CSP ページは、複数の INT ルーチンに分割されます。エラーを含む ファイル数は、最初に受け取ったエラー・メッセージに表示されています。 LoadPage コマンドに追加することのできるフラグのリストについては、“フラグおよび修飾子とは?” の回答を参照して ください。 118 Caché Server Pages (CSP) の使用法 CSP に関するよくある質問 CSP ページを実行すると、ブラウザに #(variable)# が表示されます。なぜ、変数のデータと置換されていないの でしょうか? これは、ご使用の CSP ページが Caché CSP コンパイラによって適切に解析されていないことを示しています。 http://localhost/csp/<namespace>/page.csp にアクセスして、Web サーバを介してページを実行していることを確認 してください。 CSP ページをロードしようとすると、Invalid Character というエラー・メッセージが表示されます。なぜでしょうか? Web サーバを使用してページをロードしていない場合、ブラウザは CSP 構文を表す方法を知らないため、このエラーが 発生しても不思議ではありません。ユーザの URL が C:/install-dir/csp/user/mypage.csp などと表示される場合、Web サーバを使用してページをロードしていません。 URL は http://localhost:57772/csp/user/mypage.csp または http://localhost/csp/user/mypage.csp のようなものに なるはずです。 これらのメッセージは、#server()# 呼び出しが、Caché ObjectScript メソッド呼び出しに適切に変換されなかったために 生じた可能性もあります。ご使用のブラウザで右クリックして、ページのソースを表示します。ソースに #server が含ま れている場合、ユーザの構文に誤りがある可能性があります。#server(...methodname())# のように、適切な構文 になるようにしてください。 文字列をメソッドに渡している場合、文字列は二重引用符 (“ ”) に囲まれる必要があります。一度 CSP ページが HTML にコンパイルされると、すべての #server()# 呼び出しは csprunservermethod() への呼び出しに変換されます。 なぜ CSP タグは解析されないのでしょうか? Web サーバが、CSP ページを解析用の CSP ゲートウェイに適切に渡していないためです。 CSP はエラーを記録しますか。ログに記録される内容を増やすにはどうすればよいでしょうか。また、ログの保存場所 はどこですか。 • カスタム・エラー・ページ内でのエラーなどの内部エラーがある場合は、BACK^%ETN エラー・ログにログが記録され ます。このログでカスタム・エラー・ページに関係しない内部エラーを受け取った場合、コアの CSP エンジンに問題 がある可能性が高いため、インターシステムズのサポート窓口にお問い合わせください。 • ユーザが独自のログ機能を追加するユーザ定義のエラー・ページを呼び出すことで、他のエラーも記録されます。 CSP ページをロードするとき、以下のエラーが表示されます。 ERROR #5924 : エラーが発生しましたが指定された エラーページが表示できませんでした。Web マスタに通知してください。 これはどういう意味で、どうすればいいので すか? このエラーは、多数の異なる問題が原因で発生する可能性があります。エラー・ログから、実際のエラーに関する具体的 な情報を入手してください。Caché ターミナル で、以下のコマンドを入力します。 d ^%ER 結果のエラー・ログを表示するには、管理ポータルの [アプリケーションエラーログの表示] ページ ([システム] > [システ ムログ] > [アプリケーションエラーログの表示]) に進み、適切なネームスペースに対するエラーにチェックを付けます。 エラーは、日付別のフォルダに保存されています。 カスタム・エラー・ページを設定している場合、このエラー・メッセージは、ご使用のカスタム・エラー・ページには呼び出 しているページのエラーを処理する機能がないことを示している可能性があります。また、カスタム・エラー・ページ自体 Caché Server Pages (CSP) の使用法 119 CSP に関するよくある質問 が、エラーを生成している可能性もあります。このエラーを追跡するには、カスタム・エラー・ページを一時的に停止して、 CSP ページをロードしてみてください。 CSP ページがローカルで正常に動作しても、他のコンピュータから呼び出されると正常に動作 しない 場合は、ユーザ が Caché のシングル・ユーザ・バージョンを使用しているか、Caché のライセンスを持っていない可能性があります。リ モート・マシンから CSP ページを呼び出す場合は、Caché の完全なバージョンと、ライセンスが利用できる有効なキーの 両方が必要です。インターネットでダウンロードしたバージョンに、Caché キーを追加しても、すべての機能を使用するこ とはできません。完全なバージョンを入手する必要があります。"付録 B エラーの注釈" のエラー 5924 も参照してくださ い。 CSP ページを表示しようとしても、何も表示されないか、ログイン画面が表示され、有効なユーザ名とパスワードを入 力してもログインできません。何が問題でしょうか?CSP ゲートウェイが、適切な Caché インスタンスと通信するように 構成されている、または、事前に構成されるように Caché に同梱のプライベート Apache インストールを使用している ことは確かです。 セキュリティ・イベントの監査を %SYS ネームスペースからオンにしていることを確認してください。少なくとも、Login、 Logout、および LoginFailure を監査する必要があります。 1. ターミナルで、$SYS ネームスペースに「Do ^SECURITY」と入力します。 2. [ ]、[ ]、および [ ] を選択します。 3. 「%SYSTEM/%Login/Login」、「%SYSTEM/%Login/Logout」、および「%SYSTEM/%Login/LoginFailure」を 入力します。 再び CSP ページへのアクセスを試み、監査ログをチェックして、エラーがあるか確認します。通常、これによって問題が 何なのかがわかります。例えば、サービスが無効化されている、パスワードが間違っている、あるいは、この CSP アプリ ケーションを実行する権限がない、などです。監査についての詳細は、"Caché システム管理ガイド" の “監査” の章を 参照してください。 セッションとライセンス 頻繁にログインしなければならないのはなぜですか? 以前のリリースでは、アプリケーションでセッションを共有する場合、アプリケーションではセッション・オブジェクトを介し てのみ認証とデータを共有できました。 セッションを共有するには、以下の 2 つの方法があります。 • セッション Cookie パス経由。 • アプリケーションのページへのリンクに CSPSHARE=1 を配置。 タイムアウトしたセッションは破棄され、その認証は失われます。既存のページを再ロードする場合、ユーザは再度ログ インする必要があります。セッション Cookie パス経由で接続されているアプリケーションも "ログイン" されます。これは、 ユーザがこれらのアプリケーションのうちの、いずれかのアプリケーションのページに移動するときに、そのユーザは新し くログインしたセッションを取得するためです。 CSPSHARE=1 を使用してセッションを共有している場合はそうではありません。例えば、セッション X にログインされる SMP というアプリケーションを起動するとします。次に EMP という別のアプリケーションへのリンクをクリックします。このリ ンクには CSPSHARE=1 が含まれています。EMP は認証済みのセッション X に配置されるため、ログインする必要があ りません。しばらくすると、セッション X はタイムアウトし、破棄されます。SMP と EMP はセッションを失います。 120 Caché Server Pages (CSP) の使用法 CSP に関するよくある質問 ここで、SMP のページが含まれるタブをクリックすると、前のように再度ログインするように求められます。SMP は認証済 みのセッション Y に配置されます。次に、EMP のページが含まれるタブをクリックします。ここで SMP と EMP の間には 接続がありません。EMP は再度ログインするように求められ、認証済みのセッション Z に配置されます。 CSPSHARE は、セッションを共有する方法としては不安定で、簡単に切断されます。一度切断されると、複数のログイン が続く可能性があります。 このリリースでは、セッション・オブジェクトを介してデータを共有する必要があると判断した場合にのみ、セッション共有 を使用します。認証の共有のみが必要 (データ共有は不要) な場合は、他のオプションを使用してください。 セッションの共有 : セッションの共有が必要な場合、最善の方法は、すべてのアプリケーションに、同一のセッション Cookie パス (完全に一致する必要があります) を使用して名前を付けることです。アプリケーションの名前を /csp/sys/tool/smp や /csp/sys/tool/emp などに変更することが必要になる場合があります。 セッションの共有が必要な場合に、すべてのアプリケーションに同一のセッション Cookie パスを使用して名前を付けら れないときは、CSPSHARE 要素を使用します。ただし、タイムアウト後の複数のログインなど、以前の特異性が現れるこ とになります。CSPSHARE は、最後の手段として使用してください。 認証の共有 : 認証情報の共有が必要な設計になっていても、セッション・データの共有は必要ない場合は、新規認証 機能のいずれかを使用します。 • ログイン Cookie (アプリケーションに入ったときに認証を共有) ログイン Cookie には、最後にログインしたユーザに関する情報が保持されています。ログイン Cookie が有効な場 合、新しくアクセスされたアプリケーションは、その認証を使用しようとします。 ログイン Cookie の場合、各アプリケーションは別々のセッションに配置されます。これらのセッションは、一度認証さ れたら独立したセッションになります。このため、1 つのセッションでログアウトやタイムアウトが行われても、他のセッ ションに影響を与えることはありません。 非認証のログインは、ログイン Cookie に保存されません。アプリケーション A がユーザ Q にログインし、アプリケー ション B が非認証としてログインし、アプリケーション C でログイン Cookie が使用されると、アプリケーション C は Q としてログインされます。 • ブラウザ単位のグループ (認証を継続して共有) アプリケーションのグループが認証クラスタとして機能するようにする場合は、ブラウザ単位のグループを使用しま す。 すべてのアプリケーションの認証が同期されます。1 つのアプリケーションがログアウトすると、すべてのアプリケー ションがログアウトされます。1 つのアプリケーションがユーザ Q にログインすると、すべてのアプリケーションがユー ザ Q にログインされます (唯一の例外として、いずれかのアプリケーションが非認証であると、それらのアプリケー ションは認証に関する限り、考慮されず無視されます)。 CSP セッションを終了するには、どのようにすればいいのでしょうか? CSP セッションを終了するには、Caché ObjectScript メソッドで %session.EndSession プロパティを 1 に設定します。CSP アプリケーションがタイムアウトした場合、ご使用の CSP クラスが自動的にセッションを終了します。 CSP セッションを閉じましたが、Caché により、まだライセンスを使用している状態であると報告されています。なぜで しょうか? ユーザが単にブラウザを終了しただけなら、CSP セッションはタイムアウトまで有効です。したがって、ライセンスはセッ ションが無効になるまで解放されません。タイムアウトに関する詳細は、タイムアウトの変更に関する次の回答を参照して ください。 Caché Server Pages (CSP) の使用法 121 CSP に関するよくある質問 1 ページだけを表示して、ログアウトした、またはセッションがタイムアウトした場合、CSP は、5 ~ 10 分の猶予期間を提 供し、その間は、ライセンスが留保され、迅速に戻れば、同じライセンスを再取得できます。猶予期間は、以下のうちで長 い方です。 • セッションの終了 (タイムアウトまたはログアウト) から 5 分、または • セッションの開始から 10 分を保証する時間 (10 分の最小セッションの保証) 以下のテーブルは、ライセンスの解放方法およびタイミングをまとめたものです。 状況 ユーザが 1 ページを訪れた ユーザが複数ページを 訪れた コードが明示的に %session.EndSession を 1 に設定す る (例えば、ユーザが Logout をクリックするとき) セッションが、猶予期間を受け 取る。ライセンスは、猶予期間 の期限が切れた時に解放され る。 ライセンスが直ちに解放 される ブラウザが開いており、セッションがタイムアウトになって いない ライセンスが保持される ライセンスが保持される ユーザがブラウザを終了したが、セッションがタイムアウ トになっていない ライセンスが保持される ライセンスが保持される セッションがタイムアウトになっている セッションが、猶予期間を受け 取る。ライセンスは、猶予期間 の期限が切れた時に解放され る。 ライセンスが直ちに解放 される ここで、1 ページのみを表示した場合に猶予期間が機能するしくみを表す例を示します。 • ユーザは 12:00 にログインし、12:15 にログアウトします。猶予期間は 5 分間なので、ライセンスは 12:20 に解放さ れます。 • ユーザは 12:00 にログインし、12:03 にログアウトします。猶予期間は 10 分間なので、ライセンスは 12:10 に解放さ れます。 • ユーザは 12:00 にログインし、12:10 にブラウザを終了します。タイムアウトは 15 分に設定されるので、セッションは 12:25 に終了します。猶予期間は 5 分なので、ライセンスは 12:30 に解放されます。 アプリケーションのタイムアウトを変更するには、どのようにすればいいのでしょうか? アプリケーションの既定のタイムアウトは、各ネームスペースで 900 秒 (15 分) と設定されています。 • 特定のネームスペースで、すべての CSP ページに対する タイムアウト を変更する方法は以下のとおりです。 1. Caché キューブから [管理ポータル] をクリックします。必要な場合は、ログインします。 2. 管理ポータルのメイン・ページで、[システム] > [セキュリティ管理] > [ウェブアプリケーション] を選択します。 3. [ウェブ・アプリケーション] ページで、構成対象の CSP アプリケーションに対して [編集] をクリックします。 4. [デフォルトタイムアウト] フィールドに、新規の値を入力し (単位は秒)、[保存] をクリックします。 • 特定のアプリケーションに対する Timeout を変更するには、ページ内で以下を入力します。x はタイムアウトの秒数 です。 s %session.AppTimeout = x 122 Caché Server Pages (CSP) の使用法 CSP に関するよくある質問 ユーザ CSP セッションがタイムアウトになるとき、クリーンアップ、またはロギングを実行したいと思っています。どのよ うにすればいいのでしょうか? 1. OnTimeout クラス・メソッドを持つイベント・クラスを作成します。 2. 以下のうちの 1 つの方法で、アプリケーションに対するイベント・クラスとして、これを指定します。 • 管理ポータルの [ウェブアプリケーション] ページ ([システム] > [セキュリティ管理] > [ウェブアプリケーション]) で、構成対象の CSP アプリケーションに対して [編集] をクリックします。[イベントクラス] フィールドに、 User.MyEventClass など、使用するクラス名を入力します。 • CSP ページで、%session.EventClass プロパティを使用して、以下を実行します。 <script language="cache" runat="server"> s %session.EventClass = "User.MyEventClass" </script> 3. OnTimeout メソッドで、保存したいすべての情報を記録します。 注釈 ここで、ユーザは情報(警告やリダイレクト)をブラウザに返送することはできません。 ページ間で情報を渡すには、どのようにすればよいでしょうか? 情報を渡すには、多くの方法があります。 • 追加のパラメータとして、次のページへのリンクに情報を入れます。この追加のパラメータは、%request オブジェクト からアクセス可能です。 http://myserver/csp/user/mypage.csp?id=3&name=bill 情報にアクセスするには、%request.Get("id") を使用します。 ページに直接、情報を表示するには、#(%request.Get("name"))# を使用します。 • %response.Context 多次元プロパティを使用して、CSP エンジンによりすべてのリンクとフォームに自動的に追加さ れる、一連の名前値の組み合わせを定義します。 • %session オブジェクト内に、データを配置します。ユーザが 1 つのアプリケーションを同時に 2 つのブラウザで開く と、問題が発生します。 セッションがタイムアウトになったとき、他の Web ページをユーザに送信したいのですが、どのようにすればいいので しょうか? 一番簡単な方法は、タイムアウト後に発生するように metatag でリダイレクトの設定を行うことです。 <html> <head> <META HTTP-EQUIV="REFRESH" CONTENT="910; URL=youhavetimedout.csp"> </head> <body> <script language="cache" runat="server"> %session.AppTimeout = 900 </script> </body> </html> ページを 60 秒ごとに自動的に更新したいのですが、どのようにすればいいのでしょうか? CSP ページの最初で、以下の metatag を使用します。 Caché Server Pages (CSP) の使用法 123 CSP に関するよくある質問 META HTTP-EQUIV="REFRESH" CONTENT="60; URL=mypage.csp"> コマンドと構文 Caché 変数や式を CSP ページで表示するには、どうすればいいのでしょうか? “#(var)#” や “#(expression)#” を使用して、変数や式を実行時にページに組み込むことができます。次に例を示しま す。 #(name)# : name は設定されています。 #($G(%request.Get("Username")))# : URL から Username を取得します。 #(2+7+3)# : Web ページ上で 12 を表示します。 “#(var)#” と “##(var)##” の違いは何でしょうか? 構文 “#()#” は、括弧内の式をその実行時値と置換します。構文 “##()##” は、ページがコンパイルされるときに変数 や式をその値と置換します。 この違いを示すため、以下のコード・サンプルを CSP ページに配置してみましょう。 Runtime: #($P($H,",",2))# Compile Time: ##($P($H,",",2))## ブラウザでページを開き、何度かこのページを更新します。ページを更新するたびに、Runtime 値が変更されることに注 意してください。Compile Time 値はページがコンパイルされる時間を保持します。ページがリコンパイルされたときにの み、変更されます。 “#include” と “CSP:Include” の違いは何でしょうか? #include 指示文を使用すると、JavaScript、html、プレーン・テキスト、CSP などの任意のテキストをページに含めることが できます。 <csp:include> タグには、適切にフォーマットされた CSP ページが含まれます。このタグは ServerSideRedirect を使 用してこのページを挿入し、元のページの処理に戻ります。 CSP ページをコンパイルするには、どうすればいいのでしょうか? 既定で、CSP ページが (タイムスタンプに基づいて) 変更されている場合、ブラウザはロード時に自動的に CSP ページ をコンパイルします。また、Caché スタジオや Caché ターミナルを使用して、CSP ページを手動でコンパイルすることもで きます。いずれの場合でも、生成されたソース・コードを保持するかどうかを制御できます。 スタジオを使用して CSP ページをコンパイルする方法は、以下のとおりです。 1. [ツール] メニューで [オプション] を選択し、[コンパイル] タブをクリックします。 2. [生成されたソース・コードを保存] チェック・ボックスにチェックを付け、[OK] をクリックします。 3. [ビルド] メニューで [コンパイル] を選択して、CSP ページをコンパイルします。 ターミナルから CSP ページをコンパイルする方法は、以下のとおりです。 1. ターミナルで、現在適切なネームスペースにいることを確認します。適切なネームスペースでない場合は、以下を入 力してネームスペースを変更します。 zn "<namespace>" 124 Caché Server Pages (CSP) の使用法 CSP に関するよくある質問 2. 「do $System.CSP.LoadPage(“/csp/<namespace>/<pagename>.csp", "ck")」と入力します。 次に例を示します。 SAMPLES> do $System.CSP.LoadPage("/csp/samples/james.csp", "ck") 注釈 “k” フラグは、“生成されたソース・コードを保存” するようにコンパイラに指示します。 フラグおよび修飾子とは何ですか? フラグのリストを表示するには、ターミナルで以下のコマンドを実行します。 Do $System.OBJ.ShowFlags() 注釈 f フラグを使用すると、既存のオブジェクトは、コンパイル後には無効になります。クラスのコンパイル後もオブ ジェクトを有効にしたい場合は、v フラグを使用してください。 修飾子のリストを表示するには、ターミナルで以下のコマンドを実行します。 Do $System.OBJ.ShowQualifiers() 頻繁に使用するユーティリティ・メソッドがいくつかあります。##class(Package.Class).method() を使用せずに呼び出す ことはできますか? それらのメソッドを特定のクラスに配置して、使用する CSP ページがそのクラスから継承されるようにします。そうすると、 CSP ページはドット構文を使用してこれらのメソッドにアクセスできます。これを行うには、以下のように <csp:class> タグを使用します。 <csp:class super="%CSP.Page,App.Utils"> プライベート・ページとは何ですか? プライベート・ページは、適切なトークンを使用して他の CSP ページから呼び出されたときにのみ表示できます。プライ ベート・ページにブックマークを付けることはできず、ブラウザに URL を入力するだけでは表示することはできません。 ページをプライベート・ページとして設定するには、以下のように <csp:class> タグを使用します。 <csp:class private=1> すべてのページで使用したい JavaScript 関数とヘッダがあります。これをページに組み込むには、どのようにすれば いいのでしょうか? 新しい #include 構文を使用します。 <!--#include file="mystuff.inc"--> これはテキスト形式のインクルード・ファイルで、Caché 5 の新機能です。ファイルのテキストは、ページがコンパイルされ る前に自動的にページに組み込まれます。したがって、#()# 変数や <csp:query> クエリの結果、runat="server" コードなど、コンパイルする必要があるコードを組み込むことができます。 <csp:search> タグを使用し、ユーザが ID 以外でもフィールドを検索できるようにもしたいのですが、これは可能で しょうか? <csp:search> タグには WHERE 属性があります。この属性を使用して、検索するフィールドをコンマ区切りのリストで 指定することができます。 Caché Server Pages (CSP) の使用法 125 CSP に関するよくある質問 <csp:search name=mySearch where="Name,Gender" CLASSNAME="Sample.Person"> 他にも、<csp:search> 機能をカスタマイズするために使用できる複数の属性があります。詳細は、"CSP HTML タグ・ リファレンス" の "<CSP:SEARCH>" エントリを参照してください。 構成 サブディレクトリ内のページを提供する CSP アプリケーションは、どのように構成するのですか? 以下のように Caché 管理ポータルを使用して構成します。 1. Caché キューブから [管理ポータル] をクリックします。必要な場合は、ログインします。 2. 管理ポータルの [ウェブアプリケーション] ページ ([システム] > [セキュリティ管理] > [ウェブアプリケーション]) で、 構成対象の CSP アプリケーションに対して [編集] をクリックします。 3. [ウェブ・アプリケーション] ページで、構成対象の CSP アプリケーションに対して [編集] をクリックします。 4. [ウェブ・アプリケーション編集] ページで、[繰り返し] を [はい] に設定します。 5. [保存] をクリックします。 ユーザがブラウザで http://mydomain.com/banking/login.csp をポイントすると、CSP アプリケーションがロードされる ようにしたいです。この場合、URL には /csp/ を含めたくありません。どのようにすればいいのでしょうか? 管理ポータルを使用して、新規の CSP アプリケーション (例えば /myapp) を設定します。このプロセスは、"Caché Server Pages (CSP) の使用法" の "CSP 構成" の章の “CSP サーバの新規アプリケーションの定義” のセクションで詳細に説 明しています。 Web サーバとは異なるマシンで Caché を起動しています。どのように構成すればいいのでしょうか? "Caché システム管理者ガイド" の “リモート・サーバへの接続” の章を参照してください。 その他 CSP アプリケーションでフレームを使用することはできますか? はい。しかし、フレームセット・ページには、.csp 拡張子を持つ名前を付ける必要があります。index.html というページを 作成し、CSP ページを左フレームと右フレームにロードする場合、2 つのセッションを使用することとなるので、各 CSP ページに 1 つずつ、計 2 つの Caché ライセンスが必要となります。これは、セッション・オブジェクトを使用して情報を保 存する場合に混乱を招く可能性があります。また、不必要なライセンスを使用することになります。 index.csp フレームセット・ページを呼び出すと、セッションもそのアプリケーションのライセンスも 1 つで済みます。フレー ム内の両方の CSP ページは、このセッションと、セッションに保存されているすべての情報を共有します。 CSP で文字セットを使用するには、どうすればいいのでしょうか? "Caché 専用のシステム/ツールおよびユーティリティ" の “各国言語サポートのシステム・クラス” のセクションを参照し てください。 126 Caché Server Pages (CSP) の使用法 CSP に関するよくある質問 どの HTTP ヘッダ情報がブラウザに送信されるのでしょうか? ヘッダ情報を表示するには、以下の 2 つの方法があります。 • ターミナル で Show メソッドを使用して、ページを表示します。 D $System.CSP.Show("/csp/user/mypage.csp") これにより、このページに対して生成された HTML ソースと HTTP ヘッダが表示されます。 • %Net.HttpRequest クラスの Head メソッドを使用します。 set http = ##class(%Net.HttpRequest).%New() set http.server = "localhost" set http.Port = 57772 do http.Head("csp/samples/loop.csp") do http.HttpResponse.OutputToDevice() set http = "" CSP に加え、.csp 拡張子を使用する Crystal Reports も実行しています。Caché Server Pages を使用するには、どの ようにすればいいのでしょうか? CSP と Crystal Reports は両方とも .csp ファイル拡張子を使用するため、Web サーバを介して両方を実行すると競合が 発生します。後にインストールされたアプリケーションは正常に動作しますが、先にインストールされたアプリケーションは 正常に動作しません。このような競合を回避するには、Web サーバ構成で CSP 用に 1 つの仮想ディレクトリを、Crystal Reports には別の仮想ディレクトリを作ります。 インターネット・サービス・マネージャ を使用して仮想ディレクトリを構成する方法は、以下のとおりです。 1. [スタート] メニューから [設定]、[コントロール パネル]、[管理ツール] を選択し、[インターネット サービス マネージャ] をクリックします。 2. 最初のノードを拡張し、[既定の Web サイト] を展開します。 3. CSP が後にインストールされている場合、[Crystal] 仮想ディレクトリを右クリックし、[プロパティ] を選択します。 Crystal Reports が後にインストールされている場合、[csp] 仮想ディレクトリを右クリックし、[プロパティ] を選択しま す。 4. [プロパティ] ダイアログ・ボックスの [仮想ディレクトリ] タブで、右下にある [構成] ボタンをクリックします。 5. [アプリケーションのマッピング] タブをクリックし、スクロール・ダウンしてリストの下方にある .csp マッピングを検索し ます。 6. CSP を後にインストールした場合は、.csp 拡張子マッピングの [実行ファイル] を Crystal Reports の DLL である WSCInSAPI.dll に変更します。この DLL は Crystal のインストール・ディレクトリの WCS ディレクトリにあります (例え ば、C:\Program Files\Seagate Software\WCS)。 Crystal Reports を後にインストールした場合は、.csp 拡張子マッピングの [実行ファイル] を Caché のインストール・ ディレクトリの /csp/bin にある CSPms.dll の位置に変更します (例えば、C:\CacheSys\CSP\bin)。 7. [OK] をクリックします。 Caché Server Pages (CSP) の使用法 127
© Copyright 2024 ExpyDoc