サーバーサイドのスクリプト

Server イベントの起動により、その JavaScript コードと XPage コンテキストが、Web サーバー上のインタープリタに送信されます。

サーバーサイドのインタープリタには次のような特性があります。

グローバルオブジェクトとグローバル関数

グローバルオブジェクトとグローバル関数は、サーバーサイドのスクリプトを記述する開始点となります。 このトピックでは、グローバルオブジェクトとグローバル関数についての概要を示します。 詳細については、グローバルオブジェクトおよびグローバル関数を参照してください。
  • requestScopesessionScopeapplicationScopeviewScope
    これらのオブジェクトを使用すると、グローバル変数を定義できます。それぞれのスコープは、1 回のサービス要求の期間、1 回のセッション (ユーザーがログアウトするまで) の期間、アプリケーションの存続期間、ビューページの存続期間です。 このオブジェクトのプロパティとして変数を定義します (例: requestScope.x)。 データソースのスコープと変数名を指定することによって、JavaScript の外部にあるコントロールにグローバル変数をバインドできます。 提供されるサンプルページには 3 つの編集ボックスがあり、それらの編集ボックスに xyz という名前の requestScope 変数がバインドされています。 最後の編集ボックスには、グローバル変数を使用して最初の 2 つの編集ボックスの合計を最後の編集ボックスに入れる onclick イベントがあります。
    <?xml version="1.0" encoding="UTF-8"?>
    <xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    <xp:inputText id="inputText1" value="#{requestScope.x}">
    	<xp:this.converter><xp:convertNumber type="number"></xp:convertNumber></xp:this.converter>
    </xp:inputText><xp:span> x</xp:span><xp:br></xp:br>
    <xp:inputText id="inputText2" value="#{requestScope.y}">
    	<xp:this.converter><xp:convertNumber type="number"></xp:convertNumber></xp:this.converter>
    </xp:inputText><xp:span></xp:span> y<xp:br></xp:br><xp:span></xp:span>
    <xp:inputText id="inputText3" value="#{requestScope.z}">
    	<xp:this.converter><xp:convertNumber type="number"></xp:convertNumber></xp:this.converter>
    	<xp:eventHandler event="onclick" submit="true" refreshMode="complete">
    		<xp:this.action>
    			<![CDATA[#{javascript:requestScope.z = requestScope.x + requestScope.y}]]>
    		</xp:this.action>
    	</xp:eventHandler></xp:inputText> x + y<xp:span></xp:span><xp:span></xp:span>
    </xp:view>
  • context
    この XSPContext タイプのオブジェクトは、実行時コンテキストを表します。指定されたページをクライアントに送信する、redirectToPage という便利なメソッドがあります。 この例では、page1 に 2 つの編集ボックスと 1 つのボタンが表示され、page2 に 1 つの編集ボックスが表示されます。 これらの編集ボックスは、xyz という名前の sessionScope 変数にバインドされています。 ユーザーは、page1 の編集ボックスに数値を入力して、ボタンをクリックします。このボタンの onclick イベントにより、xpage2 に合計が表示されます。
    <?xml version="1.0" encoding="UTF-8"?>
    <xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    <xp:inputText id="inputText1" value="#{sessionScope.x}">
    	<xp:this.converter><xp:convertNumber type="number"></xp:convertNumber></xp:this.converter>
    </xp:inputText><xp:span> x</xp:span><xp:br></xp:br>
    <xp:inputText id="inputText2" value="#{sessionScope.y}">
    	<xp:this.converter><xp:convertNumber type="number"></xp:convertNumber></xp:this.converter>
    </xp:inputText><xp:span></xp:span>	y	<xp:br></xp:br>
    <xp:button id="button1" value="x + y">
    	<xp:eventHandler event="onclick" submit="true"	refreshMode="complete">
    		<xp:this.action><![CDATA[#{javascript:sessionScope.z = sessionScope.x + sessionScope.y;
    		context.redirectToPage("xpage2.xsp")}]]></xp:this.action>
    	</xp:eventHandler>
    </xp:button>
    </xp:view>
    
    <?xml version="1.0" encoding="UTF-8"?>
    <xp:view xmlns:xp="http://www.ibm.com/xsp/core"><xp:span></xp:span>
    <xp:inputText id="inputText3" value="#{sessionScope.z}">
    	<xp:this.converter><xp:convertNumber type="number"></xp:convertNumber></xp:this.converter>
    		</xp:inputText> x + y<xp:span></xp:span>
    	<xp:span></xp:span>
    </xp:view>
  • sessionsessionAsSignersessionAsSignerWithFullAccess
    これらは NotesSession タイプのオブジェクトであり、文書サーバーへの接続を表します。セッションは以下のように制限されます。
    • session は、ユーザーに基づいて資格情報を割り当てます。 セッションは、アプリケーションの ACL と、サーバーの Domino ディレクトリエントリのセキュリティタブによる制限を受けます。
    • sessionAsSigner は、XPages 設計要素の署名者に基づく資格情報を割り当てます。 セッションは、アプリケーションの ACL と、サーバーの Domino ディレクトリエントリのセキュリティタブによる制限を受けます。
    • sessionAsSignerWithFullAccess は、XPages 設計要素の署名者に基づく資格情報を割り当て、アプリケーションデータに対するフル管理アクセスを許可します。 署名者がこのような権限を持っていないと、セッションを作成できません。
    このページには、現在のユーザーの共通名を表示する計算結果フィールドがあります。
    <?xml version="1.0" encoding="UTF-8"?>
    <xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    	<xp:text escape="true" id="computedField1" value="#{javascript:session.getCommonUserName()}">
    	</xp:text>
    </xp:view>
  • database
    これは、現在のアプリケーションのデータストアを表す、NotesDatabase タイプのオブジェクトです。このページでは、2 つのコントロールで database グローバル変数を使用しています。 まず、データベース内にある文書の数が計算結果フィールドに表示されます。 次に、ボタンをクリックすることにより、データベース内に文書が作成されます。 これをテストすると、ボタンをクリックするたびに文書数が増加することが分かります。
    <?xml version="1.0" encoding="UTF-8"?>
    <xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    <xp:text escape="true" id="computedField1"
    	value="#{javascript:database.getAllDocuments().getCount().toFixed()}">
    </xp:text>	<xp:br></xp:br>
    <xp:button id="button1" value="Create document">
    	<xp:eventHandler event="onclick" submit="true" refreshMode="complete">
    		<xp:this.action><![CDATA[#{javascript:var doc = database.createDocument();
    		doc.appendItemValue("Subject", "my subject");
    		doc.save()}]]></xp:this.action>
    	</xp:eventHandler>
    </xp:button>
    </xp:view>
  • currentDocumentdocument1document2
    グローバル変数 currentDocument は、現在のコントロールの影響を受けるデータソースを表す、NotesDocument タイプのオブジェクトです。データソースには、それに割り当てられている名前を使用してアクセスすることもできます。 文書データソースのデフォルト名は、document1document2 などのようになります。 このページには、currentDocument グローバル変数を使用してページの内容を文書に保存するボタンがあります。 この場合は、currentDocumentdocument1 に置き換えることができます。
    <?xml version="1.0" encoding="UTF-8"?>
    <xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    <xp:this.data>
    	<xp:dominoDocument var="document1" formName="form1"></xp:dominoDocument>
    </xp:this.data>
    <xp:table>
    	<xp:tr>
    		<xp:td><xp:label value="Subject:" id="subject_Label1" for="subject1"></xp:label></xp:td>
    		<xp:td><xp:inputText value="#{document1.subject}" id="subject1"></xp:inputText></xp:td>
    	</xp:tr>
    </xp:table>
    <xp:button id="button1" value="Create document">
    	<xp:eventHandler event="onclick" submit="true" refreshMode="complete">
    		<xp:this.action><![CDATA[#{javascript:currentDocument.save();
    		context.redirectToPage("xpage2")}]]></xp:this.action>
    	</xp:eventHandler>
    </xp:button></xp:view>
  • getComponent
    この関数は、コントロールの名前をパラメータとして受け取り、そのオブジェクトを返します。 オブジェクトは、クライアントから受け取る値とクライアントに送信する値にアクセスするために、getValuesetValue のメソッドを持っています。 このページには、3 つの編集ボックスがあります。 3 番目の編集ボックスには、最初の 2 つの編集ボックスの内容を連結する onclick イベントがあります。
    <?xml version="1.0" encoding="UTF-8"?>
    <xp:view xmlns:xp="http://www.ibm.com/xsp/core">
    <xp:inputText id="inputText1"></xp:inputText><xp:br></xp:br>
    <xp:inputText id="inputText2"></xp:inputText><xp:br></xp:br>
    <xp:inputText id="inputText3">
    	<xp:eventHandler event="onclick" submit="true" refreshMode="complete">
    		<xp:this.action>
    			<![CDATA[#{javascript:getComponent("inputText3").setValue(getComponent("inputText1").getValue() + getComponent("inputText2").getValue())}]]>
    		</xp:this.action>
    	</xp:eventHandler>
    </xp:inputText>
    </xp:view>

ユーザーの対話

通常は、コントロールを介してユーザーと対話します。 ユーザーが入力コントロールにデータを入力した後に、クライアントがサービス要求を送信します。 サーバーは、応答を送信する前に、クライアントで表示するデータをコントロールに入力できます。 このページには、編集ボックス、ボタン、計算結果フィールドが 1 つずつあります。 このボタンをクリックすると、編集ボックスの内容が文書に保存された後に、状況メッセージが計算結果フィールドに書き込まれます。
<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:this.data>
	<xp:dominoDocument var="document1" formName="form1"></xp:dominoDocument>
</xp:this.data>
<xp:table>
	<xp:tr>
		<xp:td><xp:label value="Subject:" id="subject_Label1" for="subject1"></xp:label></xp:td>
		<xp:td><xp:inputText value="#{document1.subject}" id="subject1"></xp:inputText></xp:td>
	</xp:tr>
</xp:table>
<xp:button id="button1" value="Create document">
	<xp:eventHandler event="onclick" submit="true" refreshMode="complete">
		<xp:this.action><![CDATA[#{javascript:document1.save();
		requestScope.status = "Document created"}]]></xp:this.action>
	</xp:eventHandler>
</xp:button><xp:br></xp:br>
<xp:text escape="true" id="computedField1" value="#{requestScope.status}"></xp:text>
</xp:view>

window.alert 機能はサーバースクリプトには使用できません。

コンソールログに書き込むには、これらの関数を使用します。
  • print(string) はストリングを書き込みます。
  • _dump(object) は、オブジェクトのストリング表現を書き込みます。
コンソールログには、以下のようにしてアクセスします。
  • ブラウザベースのアクティビティの場合、ログエントリにアクセスするには、サーバーの console.log (例えば、C:¥Notes¥Data¥IBM_TECHNICAL_SUPPORT¥console.log) を使用します。
  • Notes® クライアントベースのアクティビティの場合は、[ヘルプ] > [サポート] > [トレースを表示] をクリックしてログエントリにアクセスします。

この例は、システムログでアプリケーション出力をハイライトする 関数を示しています。

// Function for highlighting output to log
function printToLog(stuff) {
    _dump("¥r¥nPRINT START¥r¥n");
    _dump(stuff);
    _dump("¥r¥nPRINT END¥r¥n");
}
// Test call
printToLog("Here's some stuff for the log.");

例外処理

スクリプトでは、Java と同様に try 節、catch 節、finally 節を使用できます。 catch 節は例外が発生した場合に実行され、finally 節は常時実行されます。 このページのボタンでは、try ...catch メカニズムを使用して、計算結果フィールドにエラーを書き込んでいます。

<?xml version="1.0" encoding="UTF-8"?>
<xp:view xmlns:xp="http://www.ibm.com/xsp/core">
<xp:button id="button2" value="Create document">
	<xp:eventHandler event="onclick" submit="true" refreshMode="complete">
		<xp:this.action><![CDATA[#{javascript:try {
			doc.appendItemValue("Subject", "my subject");
		} catch(e) {
			requestScope.status = "Error: " + e;
		}}]]></xp:this.action>
	</xp:eventHandler>
</xp:button><xp:br></xp:br>
<xp:text escape="true" id="computedField1" value="#{requestScope.status}"></xp:text>
</xp:view>

このテストケースでは、doc を使用する前に定義していないため、例外が発生します。

例外をキャッチするように指定していない場合は、結果はランタイム環境によって異なります。 例えば、ブラウザや Notes クライアントでは、一般的なエラーメッセージを示すページが表示される場合があります。

検証については、message - エラー表示messages - 複数エラー表示 を参照してください。

JavaScript のサーバーライブラリ

これらの JavaScript ライブラリ (パッケージ) は、自動的にサーバーのスクリプトで使用可能になります。
ライブラリ 説明
Domino このライブラリは、ユーザーデータとユーザーサーバー環境を照会および操作する NotesSessionNotesDatabaseNotesDocument、その他のクラスを含みます。
DOM データストアが XML ベースではないため、現時点では使用されていません。
Runtime このライブラリは、 さまざまなユーティリティクラスを使用可能にします。
Standard このライブラリは、 さまざまなユーティリティクラスを使用可能にします。
XSP このライブラリは、実行コンテキストへのアクセスを許可します。
@Functions Notes @関数をエミュレートする関数。