lotus notes開発者向けxpagesのサーバーサイド...

64
© 2012 IBM Corporation ® Lotus Notes開発者向けXPagesのサーバーサイド JavaScript(SSJS)ガイド

Upload: others

Post on 22-Sep-2020

5 views

Category:

Documents


0 download

TRANSCRIPT

Page 1: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

© 2012 IBM Corporation

®

Lotus Notes開発者向けXPagesのサーバーサイドJavaScript(SSJS)ガイド

Page 2: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

2

当ガイドの内容

Lotus Notes/Dominoのアプリケーションを式言語/LotusScript(以下、LS)を用いて開発してきた開発者向けに、XPagesのサーバーサイドJavascript(以下、SSJS)の理解を助けることを目的とする

– 目的

• SSJSの概要の紹介

• SSJSの開発、またはSSJSのサンプルコードを参照する際の理解の補佐

– 対象

• Lotus Notes/Dominoのアプリケーション開発に熟練し、XPages/Webの開発経験は少ない開発者

– 記載内容

• SSJSのコーディング方法

• LS/式言語とSSJSの差異

• SSJSでコーディングを行うときの考慮点

Page 3: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

3

目次

– Notes開発者向けXPagesのサーバーサイドJavaScript(SSJS)解説

• SSJS概説

– “サーバーサイド”とは

– SSJSの概要

– SSJSの制約

• SSJSの主要なコンポーネント

– グローバルオブジェクト

> スコープ変数

– XSPライブラリ

– Dominoライブラリ

– グローバル関数

– @関数(SSJS)

– 参考.SSJSのその他のライブラリ

• SSJSでJava/JSFのオブジェクトを扱う

• SSJSのデバッグ

• エラーハンドリング

Page 4: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

4

“サーバーサイド”とは①

“サーバーサイド”とは

– Webサーバー側で処理を行うこと

サーバーサイドスクリプトとは

– Webサーバー側で動作するプログラミング言語のこと

Webのプログラミングでは、サーバー側で動作するプログラムとクライアント側で動作するプログラムの両方が必要

• 実行環境が異なるため、サーバー/クライアントそれぞれのプログラムで利用される技術は異なる

ブラウザ

JavaScript(Jquery/prototype.js/Dojo

など)

サーバーサイドJava PHPASP.NET PythonWebサーバー

Webアプリケーション

Flash

SSJS概説

Page 5: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

5

“サーバーサイド”とは②

Lotus Notesのネイティブアプリケーションの場合、サーバーサイドとクライアントサイドで同様の言語でコーディング可能

– クライアントとサーバーで同様の実行環境が用意されているため

XPagesの場合は、他のWebアプリケーションと同様に、サーバーサイドとクライアントサイドで異なる技術を用いて開発する必要がある

– XPagesでサーバーサイドに使用する言語が”サーバーサイドJavaScript”

Lotus Notesクライアント Lotus Dominoサーバー

式言語LotusScript

Notesネイティブアプリケーション

式言語LotusScript

ブラウザ Lotus Domino Webサーバー

JavaScript(Dojo含む)

XPagesサーバーサイド

JavaScript(SSJS)

SSJS概説

Page 6: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

6

参考. XPagesのサーバーサイドとクライアントサイドの違い

クライアントサイド サーバーサイド

使用する言語 ・JavaScript

・ブラウザにDLしたJavaScriptライブラリ

 Dojoなど

サーバーサイドJavaScript

UIに関する操作 可 不可

使用可能なデータ ・ブラウザにダウンロードしたデータ

・Webサービスから動的に取得するデータ

・ブラウザから送信されたデータ

・サーバーに保持しているデータ

Page 7: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

7

SSJSの概要

XPagesのSSJSとは

– 前述のとおり、Lotus Domino Webサーバー上で動作するサーバーサイドスクリプト

– 主に下記を用いてコーディングする

• SSJS独自のライブラリ

• LSのバックエンドクラスと同等のライブラリ

• @関数(SSJS)– @関数(SSJS)は式言語の@関数とは異なる(後述)

> 以後、当資料では式言語の@関数を「@関数(式言語)」、SSJSの@関数を「@関数(SSJS)」と記述する

• Javaのオブジェクト(後述)

– 文法/ビルドインオブジェクト(配列など)のみJavaScriptを使用すると考えたほうがわかりやすい

– “サーバーサイドJavaScript”自体はXPages特有のものではない

• 他に、node.js/Rhino/Aptana Jaxerなどがある

SSJS概説

Page 8: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

8

SSJSの制約

サーバーサイドで動作するため、 BOM(Browser Object model)※1のオブジェクトは使用できない

XPagesではhtml/DOM(Document Object Model)※2はレンダリング時のみ生成されるため、SSJSでDOMは扱えない

上記の制約のため、既存のJavaScriptライブラリをインポートしても動作しないことが多い

サーバサイドとクライアントサイドで共通のロジックは使用できない

– 設計要素のスクリプトライブラリの種類も異なる

• クライアントサイド:JavaScript

• サーバーサイド:サーバー JavaScript

※クライアントサイドのスクリプトライブラリをSSJSにインポートすることはできない

※1 ブラウザ構成要素のオブジェクト(windowやdocumentなど)※2 HTML,XMLでマークアップされた文書をJavaScriptのオブジェクトとして扱う仕様

SSJS概説

Page 9: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

9

参考.なぜJavaScriptなのか?

開発経緯

– Lotus Notes/Dominoと同様のRADをJ2EE上で実現するモデルで開発されたテクノロジーを援用

• 「IBM Lotus Workplace Designer(EoS)」/「IBM Lotus Component Designer」の製品で採用されたテクノロジー

  参考.XPages:history

   http://en.wikipedia.org/wiki/XPages#History

サーバサイドJavaScriptのメリット

– Javaとの親和性

– JavaScriptのデータ形式であるJSONとの親和性

– 複数言語を使用せずにすむ

• 現状、どのようなWebアプリケーションでもクライアントサイドでJavaScriptの使用は必須

SSJS概説

Page 10: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

10

SSJSの主要なコンポーネント

SSJSは下記の特殊なオブジェクトとライブラリ群/関数で構成される

– グローバルオブジェクト

• プログラムのどこからでも参照可能なオブジェクト

• 各ライブラリへのエントリポイントや、ページを超えて共有する変数を提供

– XSPライブラリ

• 現在表示しているXPage※1やブラウザコンテキスト(ブラウザやログインユーザーの情報など)へのアクセスを提供

– Dominoライブラリ

• LSのバックエンドクラスへのアクセスを提供

– グローバル関数

• プログラムのどこからでも呼び出し可能な関数

– @関数(SSJS)

• Lotus Notes/Domino上の@関数(式言語)をエミュレートする

• SSJS内に直接記述する

SSJSの主要なコンポーネント

※1 XPageはXPagesのページを表す単一の設計要素。XPages(Webアプリ開発技術の総称)とはまったく異なるので注意。

Page 11: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

11

グローバルオブジェクト

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

– プログラムのどこからでも参照可能なオブジェクト

• LSの宣言(Dim/New/Set)にあたる操作を行わなくても、直接メソッドをコールしたり、プロパティにアクセスできる

SSJSでは、各ライブラリのへエントリポイントとなるグローバルオブジェクトが用意されている

– XSPライブラリのグローバルオブジェクト

• context/dominoDocument1(NotesXspDocument)

– Dominoライブラリのグローバルオブジェクト

• database/session

– JSFのオブジェクト

• facesContextなど

– スコープ変数(ライブラリではなく変数、後述)

• applicationScope/sessionScope/requestScope/viewScope

上記のグローバルオブジェクト名はすべて予約語(dominoDocument1を除く、後述)

SSJSの主要なコンポーネント>グローバルオブジェクト

Page 12: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

12

LSとSSJSのエントリポイントの比較

LSとSSJSのエントリポイントの違い

– LSではエントリポイントになる任意のオブジェクト名を定義し、あらかじめNewを用いて宣言する必要がある

• Dim session as New NotesSession

• Dim ws as New NotesUIWorkspace

– SSJSではLSの上記Newメソッドにあたるメソッドはなく、直接エントリポイントとなるグローバルオブジェクトへアクセスする

• オブジェクト名は予約語

• 例.現在のユーザーの階層名を取得するロジック

Dim session As New NotesSessionDim user As Stringuser = session.EffectiveUserName

//session(予約語)がNotesSessionクラスの//グローバルオブジェクトvar user = session. getEffectiveUserName();

SSJSLS

SSJSの主要なコンポーネント>グローバルオブジェクト

Page 13: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

13

スコープ変数①

スコープ変数を使うと、ページ内、またはページを超えて値を保持することができる

スコープ変数の種類

• applicationScope・・・アプリケーションの範囲。アプリケーションが存在する限り有効。異なるセッション間でも保存される

• sessionScope・・・セッションの範囲。1回のセッションを通じて有効。異なるセッション間では保存されない

    ※sessionScopeはアクセスしているDBに保存されるため、複数DBで共有はできない。

• requestScope・・・要求の範囲。1回のリクエスト(サーバーへのサブミットとそのレスポンス)の間のみ有効

• viewScope・・・表示の範囲。1つのページ内でのみ有効。ページを遷移すると無効となる

SSJSの主要なコンポーネント>グローバルオブジェクト

Page 14: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

14

スコープ変数②

使用方法

– [使用するスコープ変数] + “.”+“任意の変数名”]という形式で使用する。

  ※事前に変数名の定義/宣言などを行う必要はない

• 例.値を格納する場合

• 例.値を呼び出す場合

var userName = "IBM User";sessionScope.name = userName;

var userName = sessionScope.name;

SSJSの主要なコンポーネント>グローバルオブジェクト

Page 15: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

15

XSPライブラリ

現在表示しているXPageやブラウザコンテキストにアクセスする6つのクラス

– DirectoryUser

• ログイン中のユーザ情報を取得する。

– NotesXspDocument

• XPageのデータソース(文書)へのアクセスを提供する。

– NotesXspViewEntry

• XPage上のビュー/表などの行のデータへのアクセスを提供する。

– XSPContext

• 現在のコンテキストを表す。ページ遷移や他のオブジェクトへのアクセスポイント。

– XSPUrl

• URL を表す。

– XSPUserAgent

• ブラウザの情報へのアクセスを提供する。

SSJSの主要なコンポーネント>XSPライブラリ

Page 16: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

16

XSPライブラリの主なクラスとアクセス方法①

NotesXspDocument

• データソースで指定した文書へのアクセスを提供

• オブジェクト名は、[プロパティ]-[データソース]で指定した名前

– デフォルトではdocument1

– グローバルオブジェクトであるため直接オブジェクト名で呼べる

• 使用できるメソッド/プロパティはNotesDocumentクラスに近い

– 主なメソッド・・・getItemValue/replaceItemValue/getNoteID/saveなど

– 主なプロパティ・・・isNewNote/isResponse/isEditable/hasItemなど

• DominoライブラリのNotesDocumentオブジェクトへのアクセスを提供

– getDocumentメソッドで取得する(後述)

SSJSの主要なコンポーネント>XSPライブラリ

Page 17: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

17

XSPライブラリの主なクラスとアクセス方法②

XSPContext

– 現在へのコンテキストへのアクセス

– オブジェクト名は”context”(予約語)

• グローバルオブジェクトであるため直接オブジェクト名で呼べる

– ページを遷移するメソッドや他のXSPライブラリへのアクセスポイントを提供

– 主なメソッドの例

• redirectToPageメソッド・・・新規XPageを開く

• reloadPageメソッド・・・ページを再ロードする

• getUserメソッド・・・現在のユーザーをDirectoryUserオブジェクトとして取得する

• getUserAgentメソッド・・・XSPUserAgentオブジェクトを取得する

• getURLメソッド・・・XSPUrlオブジェクトを取得する

DirectoryUser

– 現在のユーザー情報へのアクセス

– 主なメソッドの例

• getRolesメソッド・・・現在のユーザーのロールを取得する

 ※SSJSで直にロールを取得できるメソッドは上記のみ

 ※戻り値はJavaのjava.util.vector型(後述)

SSJSの主要なコンポーネント>XSPライブラリ

Page 18: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

18

XSPライブラリの主なクラスとアクセス方法③

NotesXSPViewEntry

– 現在表示しているXPageのビューコントロール/繰り返しコントロール/データ表コントロールの行へのアクセスを提供

• データソースが”Dominoビュー”の場合のみ

– オブジェクト名はプロパティの”var”に指定した名前(コレクション名)

• 指定する箇所は次ページ参照

– 主なメソッド

• getColumnValue・・・列のプログラム名を指定し、ビューエントリ内の列の値を取得

• getDocument・・・ビューエントリに関連付けられた文書を取得

– ビュー/繰り返しコントロール/データ表のコンテンツを書き出すために使用される

• サンプルコード 『NotesXSPViewEntry sample JavaScript code for XPages』

 http://goo.gl/NMFPP

SSJSの主要なコンポーネント>XSPライブラリ

Page 19: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

19

参考.NotesXSPViewEntryのオブジェクト名の指定

下記のいずれかから指定する

• ビューコントロール/繰り返しコントロール/データ表の場合

– [プロパティ]-[すべてのプロパティ]-[データ]-[var]

• 繰り返しコントロール/データ表コントロールの場合

– [繰り返し/データ表]-[オプション]-[コレクション名]

SSJSの主要なコンポーネント>XSPライブラリ

Page 20: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

20

参考.XSPライブラリを使用したSSJSサンプル

//現在のユーザー名をDirectoryUserオブジェクトから取得する//グローバルオブジェクトであるcontext(XSPContextオブジェクト)は直接オブジェクト名で呼べるvar loginUser = context.getUser();var loginUserName = loginUser.getFullName();

//現在の使用されているブラウザの名前を取得するvar browser = context.getUserAgent().getBrowser();

//文書に値をセットする//グローバルオブジェクトであるdocument1(NotesXSPDocument)は直接オブジェクト名で呼べる//”Browser”フィールドへブラウザの共通名をセットdocument1.replaceItemValue("Browser",browser);//”UserFullName”フィールドへブラウザの共通名をセットdocument1.replaceItemValue("UserFullName",loginUserName);

//現在の文書を保存するdocument1.save();

//home.xspへリダイレクトするcontext.redirectToPage("home.xsp");

現在のユーザー名とブラウザ名を取得し、文書に保存するスクリプト

SSJSの主要なコンポーネント>XSPライブラリ

Page 21: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

21

Dominoライブラリ

LSのバックエンドクラスへのアクセスを提供

– 実際には、SSJSのDominoライブラリはLotus Notes/DominoのJavaのクラスをコールしている

• SSJSのアクセス順序

 

• 参考.LSのアクセス順序

 

– Javaクラスと同様のこと実装可能であるとともに、同様の考慮点がある

• Dominoライブラリのオブジェクトはrecycle()メソッドでメモリを解放することを推奨(詳細は後述)

SSJSの主要なコンポーネント>Dominoライブラリ

SSJS Lotus Domino Javaクラス

LotusScript Back engine

Lotus Dominoのオブジェクト

LS LotusScript Back engine

Lotus Dominoのオブジェクト

Page 22: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

22

LSとSSJSのクラスの差異

DominoライブラリとLSのクラスと比較した場合の差異は下記

– LSの77クラス中、SSJSで使用できるクラスは48クラス

• SSJSで使用できないクラス– フロントエンドのクラス

> NotesUIWorkspace、NotesUIDocument、NotesUIVIew、NotesUIDatabase、NotesUISchedulerの5クラス

> NotesTimerクラス

– DXL(Domino XML Language)に関するクラス

> NotesDOMNode、NotesXMLProcessor, NotesDOMParserクラスなど23クラス

  ※SSJSでは、DominoライブラリにNotesDxlExporter クラス/NotesDxlImporterクラスのみがある

  ※SSJSのDOMライブラリは使用できない(後述)

• SSJS独自のクラス

– NotesAgentContextクラス

> 実行中のエージェントの環境を表す。

– NotesBaseクラス

> recycleメソッドのみ提供

  無条件にオブジェクトを破棄し、そのメモリをシステムに返す。

SSJSの主要なコンポーネント>Dominoライブラリ

Page 23: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

23

LSとSSJSのメソッド/プロパティの差異①

メソッド/プロパティのほとんどが使用可能

• 例1.LSのNotesDocumentクラスの77のメソッド・プロパティのうち、SSJSでは74が使用可能

• 例2.LSのNotesDatabaseクラスの109のメソッド・プロパティのうち、SSJSでは101が使用可能

– 使用できないメソッドがあったとしても基本的に代替の手段は用意されている

まったく同一ではないため、都度ヘルプを確認する必要あり

LSとSSJSの主な差異

• Newメソッドがない(後述)

• NotesDatabaseクラスのUnprocessedDocumentsプロパティがない(対応方法はp33参照)

• 一部のプロパティ/メソッドの名称が異なる– Javaのネーミングルールに従うため

– プロパティは先頭に”Is”が追加される場合がある

> 例.LSのNotesDocumentクラスのEncryptedOnSendプロパティはSSJSではIsEncryptedOnSend

– プロパティを取得するメソッド名はget + プロパティ名

> 例. NotesDatabaseクラスのACLプロパティを取得する場合

var acl:NotesACL = database.getACL();

SSJSの主要なコンポーネント>Dominoライブラリ

Page 24: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

24

LSとSSJSのメソッド/プロパティとの差異②

– プロパティをセットするメソッド名はset + プロパティ名

> 例. .NotesDocumentクラスのEncryptedOnSendプロパティにtrueをセット

• Javaクラス独自のメソッド/プロパティを追加

– 例.NotesDatabaseクラスにFTDomainSearchメソッドが追加されている

• 一部のメソッドを異なるクラス/@関数(SSJS)に付け替え

– 例1.LSのNotesDatabaseクラスの下記メソッドは、SSJSでは、 NotesAgentContextクラスに同様のメソッドがある

> UnprocessedFTSearchメソッド/UnprocessedFTSearchRangeメソッド/UnprocessedSearchメソッド

– 例2.LSのNotesDatabaseクラスのIsDB2プロパティは@関数(SSJS)に@IsDB2がある

var doc:NotesDocument = document1.getDocument();doc.setEncryptOnSend(true);

SSJSの主要なコンポーネント>Dominoライブラリ

Page 25: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

25

LSとSSJSのgetItemValueメソッドの違い

SSJSではNotesDocumentクラスのgetItemValueメソッドの使用方法が異なる

– LSのGetItemValueメソッドの場合

• 戻り値は文字列/数値/日時値の配列

– SSJSのgetItemValueメソッドの場合

• 戻り値は文字列/数値/日時値のjava.util.Vector型

  ※javaオブジェクトの扱い方については後述

• SSJSでは戻り値の型を指定したメソッドをよく使用する

– getItemValueString・・・文字列値を 1 つだけ持つアイテムの値を返す。 もっとも使用頻度が高い。

– getItemValueDouble・・・数値を 1 つだけ持つアイテムの値を返す。

– getItemValueInteger・・・数値を 1 つだけ持つアイテムの値を返す。

SSJSの主要なコンポーネント>Dominoライブラリ

Page 26: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

26

Dominoライブラリへのアクセス方法①

Dominoライブラリのグローバルオブジェクト

– グローバルオブジェクトであるため、特に宣言などせずにアクセス可能

• session・・・現在のLotus Dominoセッション(NotesSessionクラス)。予約語。

• database・・・現在のデータベース(NotesDatabaseクラス)。予約語。

• view1・・・XPageのデータソースとして指定しているビュー。オブジェクト名はデータソースで指定した名前”view1”がデフォルト(NotesViewクラス)

SSJSの主要なコンポーネント>Dominoライブラリ

Page 27: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

27

Dominoライブラリへのアクセス方法②

現在の文書データソースへのアクセス

– docment1(NotesXspDocument)のgetDocument()メソッドを使用する(p16参照)

• 引数 True・・・XPage上の変更を反映する

• 引数 False・・・XPage上の変更を反映しない

その他のDominoライブラリは上記オブジェクトをエントリポイントとし、そのメソッドを使用してアクセスする

– SSJSではLSのNewメソッドに対応するメソッドがないため、上位のオブジェクトのcreateメソッドなどを使用する(詳細は次ページ)

SSJSの主要なコンポーネント>Dominoライブラリ

Page 28: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

28

LSのNewメソッドとDominoライブラリのメソッドの対応

LSでNewメソッドを持つクラスSSJSで対応するメソッド

クラス名 メソッド名

NotesACLEntry クラス NotesACL createACLEntry

NotesDatabase クラス NotesSession getDatabase

NotesDateTime クラス NotesSession createDateTime

NotesDbDirectory クラス NotesSession getDbDirectory

NotesDocument クラス NotesDatabase createDocument

NotesItem クラス NotesDocument replaceItemValue

NotesLog クラス NotesSession createLog

NotesName クラス NotesSession createName

NotesNewsletter クラス NotesSession createNewsletter

NotesRegistration クラス NotesSession createRegistration

NotesRichTextItem クラス NotesDocument createRichTextItem

NotesSession クラス なし。グローバルオブジェクトであるため最初からアクセス可能。

SSJSの主要なコンポーネント>Dominoライブラリ

Page 29: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

29

LSとSSJSの文法の差異

大文字小文字を区別する

– SSJSでは最初の単語を小文字で始め、以後の単語の先頭文字は大文字(Camel記法)

宣言

– JavaScriptで宣言は必須ではないが、SSJSでは下記のように宣言することが多い

• Var 変数名:型

文末にセミコロン”;”を記述する

オブジェクトを割り当てる場合に”Set”は必要ない

メソッドを呼ぶときにCallは必要ない

一部の比較演算子は異なる

– LSで等価は”=“、SSJSでは等価は”==“

引数を必要としない場合もメソッド/プロパティの末尾に”()”を記述する

詳細は「Notes/Domino開発者向けJavaScript入門」p9-p19参照http://www.ibm.com/developerworks/jp/lotus/ldd_tech/2011apr_nd_js.html

SSJSの主要なコンポーネント>Dominoライブラリ

Page 30: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

30

Dominoライブラリを使用する上での考慮点

Dominoライブラリのオブジェクト(Lotus Notesのオブジェクト)を使用した場合、recycleメソッドで明示的にメモリを解放することを推奨

• 呼び出し方は[オブジェクト名.recycle()]

下記のLotus Notes における Java APIの考慮点がSSJSでもあてはまるため

– JVM では、ガベージコレクションが不要になったオブジェクトを定期的に解放する

• そのためJavaのオブジェクトのメモリ管理について意識する必要はない

– Lotus Notes/DominoのオブジェクトはJVMのガベージコレクションの対象外でメモリが解放されない

• Lotus Notes/Domino のメモリ管理下に置かれるオブジェクトが生成されるため

• メモリを解放するためにはrecycle() メソッドの実行が必要

– 詳細は『Lotus Notes/Domino における Java 実行環境とその問題判別について 』参照

SSJSの主要なコンポーネント>Dominoライブラリ

var doc:NotesDocument =document1.getDocument();//処理doc.recycle();

Page 31: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

31

参考.Dominoライブラリを使用したSSJSサンプル

Dim session As New NotesSession

Dim ndb As NotesDatabase

Dim nvw As NotesView

Dim ndoc As NotesDocument

Dim loginUsrName As String

Dim nam As NotesName

Dim key As String

Dim ws As New NotesUIWorkspace

Dim doc As NotesDocument

Dim companyname,jobtitle As Variant

Set db = session.CurrentDatabase

loginUsrName = session.EffectiveUserName

Set nam = New NotesName(loginUsrName)

key = nam.Abbreviated

Set ndb = session.getdatabase(db.Server,"names.nsf")

Set nvw = ndb.GetView("($Vimpeople)")

Set ndoc = nvw.GetDocumentByKey(key,True)

companyname = ndoc.GetItemValue("CompanyName")

jobtitle = ndoc.GetItemValue("JobTitle")

Set doc = ws.CurrentDocument.Document

Call doc.ReplaceItemValue("KaisyaMei",companyname)

Call doc.ReplaceItemValue("YakushokuMei",jobtitle)

Call doc.Save(True,True,True)

var loginUsrName =session. getEffectiveUserName() ;

var nam:NotesName = session.createName(loginUsrName);

var key = nam.getAbbreviated();

//databaseは現在のDBをあらわすグローバルオブジェクト

var ndb:NotesDatabase = session.getDatabase(database.getServer(),"names.nsf");

var nvw:NotesView = ndb.getView("($Vimpeople)");

var ndoc:NotesDocument = nvw.getDocumentByKey(key,true);

var companyName = ndoc.getItemValue("CompanyName");

var jobTitle = ndoc.getItemValue("JobTitle");

var doc:NotesDocument = document1.getDocument(true);

doc.replaceItemValue("KaisyaMei",companyName);

doc.replaceItemValue("YakushokuMei",jobTitle);

doc.save(true,true,true);

//Dominoライブラリのオブジェクトは明示的にメモリを解放

nam.recycle();ndb.recycle();nvw.recycle();ndoc.recycle();doc.recycle();

SSJS

参考.LS Dominoディレクトリのユーザー文書

から現在のユーザーの役職名と会社名を取得し、現在の文書に保存するサンプル

  ※赤字が異なる箇所(大文字小文字の違いを除く)

SSJSの主要なコンポーネント>Dominoライブラリ

Page 32: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

32

グローバル関数

プログラムのどこからでも呼び出し可能な関数

各コントロールへのアクセスする関数などがある

– 主な関数

• getComponent

– XPage上のコントロールを直接オブジェクトとして取得する

– オブジェクトはsetValue/getValueメソッドを持つため、値の取得/セットが可能

> 例.編集ボックス(inputText1)の値を取得する

– 詳細な各オブジェクトのプロパティ/メソッドはXPages Extensiblity APIのJavadoc参照(8.5.2以降)

> ヘルプには記載されていない

> “UI”や”XSP”の接頭辞がついているオブジェクトが各コントロールのオブジェクト

  XPages Extensibility API Documentation

  http://www-10.lotus.com/ldd/ddwiki.nsf/dx/XPages_Extensibility_API_Documentation

var temp = getComponent("inputText1").getValue();

SSJSの主要なコンポーネント>グローバル関数

Page 33: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

33

参考.グローバル関数を使用したサンプル

XPageのビューで選択された文書を取得する例

– LSのエージェントで、NotesDatabaseクラスのUnprocessedDocumentsを使用した場合に該当

※実行時の対象はデフォルトの”すべての選択文書”の場合

– ビューの選択文書を取得するロジック

• ①getComponentを用いてビューコントロールをオブジェクトとして取得

• ②ビューコントロールのメソッドであるgetSelectedIds()を用いて、選択文書のNoteIDを取得– 参考.Class UIViewPanel (XPages Extensibility API)– http://public.dhe.ibm.com/software/dw/lotus/Domino-

Designer/JavaDocs/XPagesExtAPI/8.5.2/com/ibm/xsp/component/UIViewPanel.html#getSelectedIds%28%29

• ③NoteIDをキーに、databaseオブジェクト(NotesDatabaseクラス)から文書を取得する 参考.Notes/Domino 8.5.1における XPages 新機能 http://www.ibm.com/developerworks/jp/ysl/library/lotus/y-lot-xpages851newfunction/ 参考. XPages Tutorial Part 48 : チェックボックスをアクションにリンクさせる http://notesdominoliaison.blogspot.com/2010/01/xpages-tutorial-part-48.html

 

var viewPanel=getComponent("viewPanel1"); var docIDs=viewPanel.getSelectedIds(); for(i=0 ; i < docIDs.length ; i++){

var docId = docIDs[i]; var doc:NotesDocument = database.getDocumentByID(docId);

// Process selected documents here doc.recycle();}

SSJSの主要なコンポーネント>グローバル関数

Page 34: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

34

@関数(SSJS)

SSJSはLotus Notes/Dominoの@関数(式言語)をエミュレートする

– 基本的に@関数(式言語)と同様の引数/オプションが使用可能

• 特殊な引数/オプションは使用できない(後述)

– @関数(式言語)274個中、@関数(SSJS)で対応する関数は94個

• 主な使用できる関数– ビューの列値取得(@DbColumn)

– ビューの検索・値取得(@DbLookup)

– 条件式(@If)

– 名前取得・処理(@Name/@UserName)

– 日時取得・処理(@Now/@Today/@Yesterday/@Year/@Monthなど)

– 文字列処理(@Right/@RightBack/@Left/@LeftBack/@Middle/@MIddleBack/@Trimなど)

– SSJS独自の関数も追加されている

– @Element/@List/@Null

– 使用できない関数一覧

• List of Formula Not Supported In XPages

  http://www-10.lotus.com/ldd/ddwiki.nsf/dx/List_of_Formula_Not_Supported_In_XPages

SSJSの主要なコンポーネント>@関数(SSJS)

Page 35: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

35

利用可能な@関数(SSJS)一覧

@Abs @Do @IsNull @Name @Sum

@Abstract @Element @IsNumber @NewLine @Text

@Adjust @Elements @IsResponseDoc @No @TextToNumber

@AttachmentLengths @Ends @IsText @Now @TextToTime

@AttachmentModifiedTimes @Error @IsTime @Null @Time

@AttachmentNames @Explode @IsUnavailable @ProperCase @Today

@Attachments @Failure @Left @Random @Tomorrow

@Author @False @LeftBack @Repeat @Trim

@Begins @GetField @Length @Replace @True

@Char @Hour @List @ReplaceSubstring @Unique

@ClientType @If @LowerCase @ReplicaID @UpperCase

@Contains @Implode @Max @Return @UserName

@Count @Integer @Member @Right @Weekday

@Created @IsAvailable @Middle @RightBack @Word

@Date @IsDocBeingLoaded @MiddleBack @Round @Year

@Day @IsDocBeingSaved @Min @Second @Yes

@DbColumn @IsError @Minute @Select @Yesterday

@DbLookup @IsMember @Modified @SetField  

@DbName @IsNewDoc @Modulo @Subset  

@DbTitle @IsNotMember @Month @Success  

SSJSの主要なコンポーネント>@関数(SSJS)

Page 36: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

36

@関数(式言語)と@関数(SSJS)の差異①

SSJSで使用できない主な@関数(式言語)

– UIを直接操作するもの

• @Command(@Commandで指定できるパラメータは388個)

• @PickList/@Prompt/@Dialogboxなど

– UIにある文書にアクセス/操作するもの

• @MailSend/@DocumentUniqueID

– Notesクライアント環境にアクセスするもの

• @SetEnvironment/@Environment/@Version/RegqueryValueなど

– プロフィール文書にアクセスするもの

• @GetProfileField/@SetProfileField

– ブラウザのコンテキストにかかわるもの

• @URLHistory/@UrlQueryString/@BrowserInfoなど  ※補足.ブラウザコンテキストにはSSJSのXSPライブラリを使用する(p15) 算術演算に関するもの

• @Tan/@Signなど  ※補足.SSJSのStandardライブラリ、Mathクラスで代替可能

厳密な傾向はなく、都度ヘルプの確認が必要

– @UserNameは使えるが、@UserRolesは使えない

– @Uniqueは使えるが、@Sortは使えない

SSJSの主要なコンポーネント>@関数(SSJS)

Page 37: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

37

@関数(式言語)と@関数(SSJS)の差異②

特殊なオプションを使用するものは使用できない

– @Contains

• @関数(式言語)では2つの複数値を引数とし、個々の値をすべて比較して判定する

• @関数(SSJS)では、2つの引数はストリング。複数値同士の比較はできない。

– @Text

• format-string(日時構成要素)の指定はできず、ストリング形式に変換するのみ– 例. @Text(@Now;“D3T1”) の “D3T1”などは指定できない

– @DbColumn/@DbLookup

• ODBCデータソースは使用できない。– 引数の数も異なる。@関数(SSJS)では@関数(式言語)の”class:cache”はパラメータにない。

– @Name

• 一部のオプション([HIERARCHYONLY]や[PHRASE]など)が指定できない。

  ※Lotus Notes/Dominoでよく使用する[CN]/[ABBREVIATE]/[CANONICALIZE]は使用可能

– @Explode

• @関数(式言語)では日時範囲の指定が可能だが、@関数(SSJS)では不可– 例. @関数(式言語)では@Explode([2011/10/01 - 2011/10/03])は、範囲を展開し

た”2011/10/01”,”2011/10/02”,2011/10/3”の文字列リストを返す

SSJSの主要なコンポーネント>@関数(SSJS)

Page 38: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

38

@関数(式言語)とSSJSの文法の差異

大文字と小文字を正確に区別する

パラメータはセミコロンではなくカンマで区切る

フォーム上では直接フィールド名で値にアクセスできるが、SSJSではNotesXSPDocumentクラスを用いて変数の値を取得する

オプションもストリングであるため""で囲って指定する

比較演算子の記述

– 式言語で等価は”=“、SSJSでは等価は”==“など

配列の記述

– 式言語では”:”で区切って記述可能。SSJSではArrayオブジェクトや@List関数を使用する必要がある

引数を必要としない場合も”()”の記述が必須

– ()を記述しなくてもスクリプトエディタ上エラーにはならないが、戻り値が下記の固定の文字列になる

• “function:IBMJS built-in function”

SSJSの主要なコンポーネント>@関数(SSJS)

Page 39: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

39

@関数(SSJS)を使用したSSJSサンプル

ユーザー名を略称形式で表示する(計算結果フィールドに記述、以下同様)

Statusフィールドの値に応じて表示する文字列を変更するサンプル

Dominoディレクトリの($VIMPeople)ビューの1列目(FullName)を取得する

var Status=document1.getItemValueString("Status");@If(

Status=="0","作成中",Status=="1","承認依頼中",

"");

SSJS@If(

Status="0";"作成中";Status="1";"承認依頼中";

"")

参考.式言語

@Text(@Name("[Abbreviate]",@UserName()));

SSJS

@Text(@Name([Abbreviate];@UserName))

参考.式言語

SSJSの主要なコンポーネント>@関数(SSJS)

var svrname = session.getServerName();var dbpath = new Array(svrname,"names.nsf");@DbColumn(dbpath,"($VIMPeople)",1);

SSJS

dbpath := @ServerName:"names.nsf";@DbColumn("":"";dbpath;"($VIMPeople)";1)

参考.式言語

Page 40: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

40

参考.SSJSのその他のライブラリ

Standardライブラリ

– クライアントサイドのJavaScriptのビルトインオブジェクトと同様

• Array/Boolean/Date/Math/Number/Object/RegExp/String

Runtimeライブラリ

– 国際化対応のためのクラス群を提供

• タイムゾーンやロケールの操作など

DOMライブラリ

– XML Document Object Model 形式の文書を表す

– データストアが XML ベースではないため、現時点(Lotus Notes/Domino 8.5.3)では使用されていない

参考.ヘルプ『サーバーサイドのスクリプト』

SSJSの主要なコンポーネント>その他のライブラリ

Page 41: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

41

SSJSでJava/JSFのオブジェクトを扱う①

SSJSではJava/JSFの標準のオブジェクトを用いてロジックを記述する場合がある

– Java/JSFの標準のオブジェクトはヘルプには記載されていない(詳細は次項)

– 使用するケース

• SSJSのXSPライブラリ/Dominoライブラリのメソッドの戻り値が配列の場合

– 戻り値の型はjava.util.Listかjava.util.Vectorになる(扱い方は後述)

• SSJSのライブラリで行えない処理を行う場合

– グローバルオブジェクトのfacesContextなどを使用する(後述)

Javaのオブジェクトを直接組み込むことも可能

– ヘルプ『JavaScript への Java の組み込み』参照

SSJSでJava/JSFのオブジェクトを扱う

Page 42: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

42

SSJSでJava/JSFのオブジェクトを扱う②

Lotus Notes/DominoのJava/JSFのJavadocは標準では提供されていない

– Is it possible to get JavaDoc files for Domino Designer Java agents?

 https://www-304.ibm.com/support/docview.wss?uid=swg21258816

Lotus Notes/DominoのJava/JSFのバージョンにあわせ、他から取得・または生成し、それぞれのJavadocを参照する必要がある

• Lotus Notes/Domino における Java 実行環境とその問題判別について

 http://www-01.ibm.com/support/docview.wss?uid=swg21466201

当資料では、参考としてオラクル社のJavadocへリンクする

– サポートされるドキュメントではない

SSJSでJava/JSFのオブジェクトを扱う

Page 43: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

43

SSJSでjava.util.Listを扱う

java.util.Listとは

– Javaの順序つきのリストのインターフェース

SSJSでjava.util.Listが戻り値の型であるメソッド

• DirectoryUserクラスのgetRolesメソッド/getGroupsメソッド

• NotesXspDocumentクラスのgetAttachmentListメソッド– getAttachmentListメソッドの場合、各要素はNotesEmbeddedObject 型

java.util.Listのメソッドの例

– getメソッド・・・リスト内の指定された位置にある要素を返す

– indexOfメソッド・・・指定された要素がリスト内で最初に検出された位置のインデックスを返す

– containsメソッド・・・リストに指定の要素がある場合に true を返す

– sizeメソッド・・・ リスト内にある要素の数を返す

– 詳細は下記参照> http://java.sun.com/javase/ja/6/docs/ja/api/index.html?java/util/List.html

SSJSでJava/JSFのオブジェクトを扱う

Page 44: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

44

SSJSでjava.util.Listを使用したサンプル

ログインユーザーが、”Admin”または”Manager”ロールを持つか否かを判定するロジック(コントロールの[可視]/[表示]プロパティの[値の計算]に記述)

• ①DirectoryUserクラスのgetRolesメソッドを使用してロールを取得する

– 戻り値の型がjava.util.List

• ② java.util.Listのcontainsメソッドを使用して、”[Manager]”または”Admin”の文字列を含むかどうかを判定する

– containsメソッド

– http://java.sun.com/javase/ja/6/docs/ja/api/java/util/List.html#contains(java.lang.Object)

var roleList = context.getUser().getRoles();roleList.contains("[Manager]") || roleList.contains("[Admin]");

SSJSでJava/JSFのオブジェクトを扱う

Page 45: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

45

SSJSでjava.util.Vector型を扱う

java.util.Vectorとは

– 可変長の配列を実現する

SSJSでjava.util.Vectorが戻り値の型である主なメソッド

– NotesXspDocumentクラスのgetItemValueメソッド

– NotesDocumentクラスのgetItemValueメソッド

– NotesViewクラスのgetColumnValuesメソッド

– NotesSessionクラスのevaluateメソッド

java.util.Vectorのメソッド

– java.util.Listインターフェースを実装しているため、 java.util.Listのメソッド(p42)が使用可能

– 詳細は下記参照

• http://java.sun.com/javase/ja/6/docs/ja/api/java/util/Vector.html

SSJSでJava/JSFのオブジェクトを扱う

Page 46: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

46

SSJSでfacesContextを扱う

facesContextとは

– JSFのオブジェクトで、JSFの現在の状態を保持する。JSFの状態を取得するための出発点

• 詳細は下記のJSFのJavaDoc参照

http://docs.oracle.com/cd/E17824_01/dsc_docs/docs/jscreator/apis/jsf/javax/faces/context/FacesContext.html

– SSJSでは、 facesContextはグローバルオブジェクトであり、”facesContext”は予約語

– SSJSのXSPライブラリやDominoライブラリで行えない処理を行うときなどに使用する。

• XPage以外のページにリダイレクトする(次項)

• JSONを返すWebサービスを実装する(p48)

SSJSでJava/JSFのオブジェクトを扱う

Page 47: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

47

SSJSでfacesContextを使用したサンプル①

XPage以外のページにリダイレクトするロジック

– XSPライブラリの「redirectToPage」メソッドはXPageにリダイレクトする仕様。XPage以外のページにリダイレクトするにはfacesContextを使用する必要がある

– Xpageから”http://www-10.lotus.com/ldd/ddwiki.nsf“にリダイレクトするロジック

• ①グローバルオブジェクトのfacesContextを使用する

• ②他のコンテキストのラッパーである「ExternalContext」を取得

– http://docs.oracle.com/cd/E17802_01/j2ee/javaee/javaserverfaces/1.2_MR1/docs/api/javax/faces/context/ExternalContext.html

• ③ExternalContextのredirectメソッドを使用する

– http://docs.oracle.com/cd/E17802_01/j2ee/javaee/javaserverfaces/1.2_MR1/docs/api/javax/faces/context/ExternalContext.html#redirect(java.lang.String)

var extContext = facesContext.getExternalContext();extContext.redirect("http://www-10.lotus.com/ldd/ddwiki.nsf");

SSJSでJava/JSFのオブジェクトを扱う

Page 48: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

48

参考. SSJSでfacesContextを使用したサンプル②

JSONでデータを返すWebサービスの作成

– 下記の技術文書参照

• XPagesでDojoウィジェットを利用する

 http://www.ibm.com/developerworks/jp/ysl/library/lotus/y-lot-dojoonxpages/

SSJSでJava/JSFのオブジェクトを扱う

Page 49: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

49

参考.その他のJSFのグローバルオブジェクト

JSF1.2のオブジェクト。保持する値の詳細はヘルプ『グローバルオブジェクトおよびグローバル関数 (JavaScript)』参照

オブジェクトの型については下記参照

– Mojjarra-2.0.1 com.sun.faces.context

   http://www.docjar.com/docs/api/com/sun/faces/context/package-index.html

 ※MojjarraはJSFの実装のひとつ

 ※上記もサポートされるドキュメントではない

グローバルオブジェクト名 JSFのオブジェクトの型

cookie com.sun.faces.context.RequestCookieMap オブジェクト

header com.sun.faces.context.RequestHeaderMap オブジェクト

headerValues com.sun.faces.context.RequestHeaderValuesMap オブジェクト

initParam com.sun.faces.context.InitParameterMap オブジェクト

param com.sun.faces.context.RequestParameterMap オブジェクト

paramValues com.sun.faces.context.RequestParameterValuesMap オブジェクト

SSJSでJava/JSFのオブジェクトを扱う

Page 50: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

50

SSJSのデバッグ①-エラーページの有効化-

XPagesでは、XPageの出力がエラーで失敗した際に、エラー内容を表示する機能がある

– この機能が無効の場合、単に「エラー500(Internal Server Error)」ページが表示される(次項参照)

XPagesのエラーページの出力を有効にするには

– アプリケーションのプロパティ > XPages タブ > デフォルトのエラーページを表示にチェックを入れる

SSJSのデバッグ

Page 51: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

51

参考.XPagesの標準のエラーページの出力画面

無効時(デフォルト)の例

有効時の例

SSJSのデバッグ

Page 52: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

52

SSJSのデバッグ②-変数/オブジェクトの値の確認-

デバッグのために、変数/オブジェクトの値を確認する方法

– 一時的にXPage上に計算結果フィールドを配置する

• [プロパティ]-[値]を[JavaScript]とし、確認したい変数の値を記述する

print

– ストリングをログに書き出す

– 書き出し場所はLotus Dominoサーバーのコンソール(log.nsf)

• デザイナー上のプレビューで実行した場合、クライアントのlog.nsfに書き出される

SSJSのデバッグ

Page 53: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

53

SSJSのデバッグ②

_dump

– オブジェクトのストリング表現をログファイルに書き出す

• ストリング表現・・・オブジェクトの型と入っている値

– _dumpの出力例.匿名ユーザーでログインしているときに、現在のユーザー名をNotesSessionクラスのgetEffectiveUserNameメソッドで書き出す

– 書き出し結果

– 書き出し場所はprintと同様

SSJSのデバッグ

var name = session.getEffectiveUserName();_dump(name);

Page 54: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

54

エラーハンドリング①

try…catchステートメントやthrow ステートメントを使用する

– エラーチェックのサンプル

• サーバー・サイド XPages JavaScript での単純なエラー・チェック

   http://www.ibm.com/developerworks/jp/lotus/library/2011xpages_check/

エラーハンドリングのロジックを記述する上での考慮点

– LSの”Nothing”/”Empty”はSSJSでは”null”にあたる

• JavaScriptで”null”はオブジェクト

• LotusScriptで使用するnullに該当するものはSSJSでは存在しない

• SSJSの”IsEmpty”は、空ストリング(“”)か否かを判定する

エラーハンドリング

Page 55: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

55

エラーハンドリング②

エラーハンドリングのロジックを記述する上での考慮点(続き)

– JavaScriptに”Exit”は存在しない

• returnで処理を中断できる

– @関数(式言語)ではヌル値と空ストリング(””)は同義

• SSJSでも同様

– @関数(SSJS)で戻り値の有無を判定する場合、SSJSのnullオブジェクトではなく空ストリング(“”)と比較を行う

– @IsNull()はnull値ではなく、空ストリングと等しいかどうかを判定する

エラーハンドリング

Page 56: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

56

参考資料

Page 57: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

57

参考.サーバーサイドJavaScriptの記述箇所

XPagesでは[イベント]タブで、クライアントサイドで記述するのか、サーバーサイドへ記述するのかを選択する

Page 58: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

58

参考.SSJSのスクリプトエディタ画面

メソッド/クラスは先読みで表示

– 引数の有無/型/戻り値の型も表示

[参照]タブの[ライブラリ]を切り替えることで現在アクセス可能なグローバルオブジェクト/グローバル関数/DOM/Domino/XSP/@関数(SSJS)をすべて参照できる

Page 59: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

59

Standard版のみ参照可能

Lotus Domino Designer User Guideの一部とLotus Domino Designer XPageのリファレンスに記載

参考.XPagesのヘルプ

Page 60: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

60

参考.ヘルプ以外の情報源①

Lotus Notes and Domino Application Development wiki

– XPagesの情報はwikiに多く掲載されている。

• Notes 開発者のための XPages SSJS 解説   http://goo.gl/QHTZ6

• SSJSサンプルコード(英語)– “クラス名” + “sample JavaScript code for XPages ” というタイトルで各クラスのサンプルコードがある

    http://goo.gl/qk4Bv    ※ページを開いたタイミングでエラーが表示される場合は、各ページをタイトルで検索し

なおしてください

• 日本語のカテゴリ    http://goo.gl/2kg8l

• XPages リンク集– 各コントロールやOneUIの解説などへのリンク集

    http://goo.gl/ZD6sp

• Domino Designer XPages Extension Library(英語)   http://goo.gl/engyS

• API Documentation(英語)   http://goo.gl/wzqjz

• XPages開発のお供に「Demonstration Application for XPages」    http://goo.gl/cMg2k

Page 61: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

61

参考.ヘルプ以外の情報源②

Developer Works Lotus/Notes Domino

– 主にアプリケーション開発の項目に多くのXPagesの情報を掲載

http://www.ibm.com/developerworks/jp/lotus/products/lnd/

– Lotus Domino 8.5.1 を使用した Domino Web アプリケーションの構築

  http://goo.gl/Am2fa

– チュートリアル

• XPages入門

    http://www.ibm.com/developerworks/jp/lotus/education/xpages/

• 新人SEが学ぶ XPages

   http://goo.gl/S4uwc

• Lotus Domino Designer での XPages 機能の活用

http://www.ibm.com/developerworks/jp/lotus/education/ls-ddxpages/

Page 62: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

62

参考.ヘルプ以外の情報源③

XPages技術者コミュニティー

– ディスカッションやwiki/ファイルなどを共有

  http://goo.gl/ApvMS

XPages.Info

– サンプルアプリの操作が可能。一部のサンプルはDL可能

  http://xpages.info/XPagesHome.nsf/DemosJapan.xsp#

OpenNTF

– http://www.openntf.org/blogs/openntf.nsf/d6plinks/NHEF-8427T9

Page 63: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

63

参考.ヘルプ以外の情報源④

テクてく Lotusコミュニティー

– テクてくLotus 技術者夜会の資料を公開。デベロッパー編にはXPagesのハンズオンなどがある

  http://goo.gl/XH0mk

ICS Business Partner Technical Enablement team Japan Blog

– XPagesのTipsや製品の最新情報の提供など

   http://goo.gl/uCLNw

notes/domino liaison

– Teamstudio社のテクニカルディレクター、加藤氏のサイト

• XPagesのチュートリアル、Tipsなども掲載

  http://notesdominoliaison.blogspot.com/

Page 64: Lotus Notes開発者向けXPagesのサーバーサイド …public.dhe.ibm.com/software/dw/jp/lotus/ldd_tech/xpages... · 2012. 2. 3. · IBM Software Group | Lotus software 9 参考.なぜJavaScriptなのか?

IBM Software Group | Lotus software

64

© IBM Corporation 2012. All Rights Reserved.

ワークショップ、セッション、および資料は、IBMまたはセッション発表者によって準備され、それぞれ独自の見解を反映したものです。それらは情報提供の目的のみで提供されており、いかなる参加者に対しても法律的またはその他の指導や助言を意図したものではなく、またそのような結果を生むものでもありません。本プレゼンテーションに含まれている情報については、完全性と正確性を帰するよう努力しましたが、「現状のまま」提供され、明示または暗示にかかわらずいかなる保証も伴わないものとします。本プレゼンテーションまたはその他の資料の使用によって、あるいはその他の関連によって、いかなる損害が生じた場合も、IBMは責任を負わないものとします。 本プレゼンテーションに含まれている内容は、IBMまたはそのサプライヤーやライセンス交付者からいかなる保証または表明を引きだすことを意図したものでも、IBMソフトウェアの使用を規定する適用ライセンス契約の条項を変更することを意図したものでもなく、またそのような結果を生むものでもありません。

本プレゼンテーションでIBM製品、プログラム、またはサービスに言及していても、IBMが営業活動を行っているすべての国でそれらが使用可能であることを暗示するものではありません。本プレゼンテーションで言及している製品リリース日付や製品機能は、市場機会またはその他の要因に基づいてIBM独自の決定権をもっていつでも変更できるものとし、いかなる方法においても将来の製品または機能が使用可能になると確約することを意図したものではありません。本資料に含まれている内容は、参加者が開始する活動によって特定の販売、売上高の向上、またはその他の結果が生じると述べる、または暗示することを意図したものでも、またそのような結果を生むものでもありません。

パフォーマンスは、管理された環境において標準的なIBMベンチマークを使用した測定と予測に基づいています。ユーザーが経験する実際のスループットやパフォーマンスは、ユーザーのジョブ・ストリームにおけるマルチプログラミングの量、入出力構成、ストレージ構成、および処理されるワークロードなどの考慮事項を含む、数多くの要因に応じて変化します。したがって、個々のユーザーがここで述べられているものと同様の結果を得られると確約するものではありません。

記述されているすべてのお客様事例は、それらのお客様がどのようにIBM製品を使用したか、またそれらのお客様が達成した結果の実例として示されたものです。実際の環境コストおよびパフォーマンス特性は、お客様ごとに異なる場合があります。

IBM、IBM ロゴ、ibm.com、Lotus および Lotus Notes、Lotus Dominoは、世界の多くの国で登録されたInternational Business Machines Corporationの商標です。

他の製品名およびサービス名等は、それぞれIBMまたは各社の商標である場合があります。

現時点での IBM の商標リストについては、www.ibm.com/legal/copytrade.shtmlをご覧ください。

他の会社名、製品名およびサービス名などはそれぞれ各社の商標。