ShowTable of Contents
アプリケーションの概要
ここで紹介するアプリケーションでは、ユーザーが新規に XPage のページを開き、コンボボックスの都道府県名を選んで検索ボタンを押すと、選択された都道府県の県庁所在地の都市名が結果用のフィールドに設定されます。全ての処理は文書の保存なしに行われます。
アプリケーションにはすでに都道府県名と県庁所在地を保存できるフォームがあると仮定します。都道府県名は 「name」 フィールド、県庁所在地は 「city」 フィールドにあります。すでにいくつかの県について、このフォームで文書が作成されているとします。
XPages での実装の準備
本題の JavaScript の実装の前に、必要な XPages のコンポーネントを用意します。
適当な XPages を新規に作成し、以下のようなコントロールを作成します。
|
|
コントロール名 |
コントロールタイプ |
説明 |
|
1
|
comboBox1 |
コンボボックス |
選択肢として適当な都道府県名を設定する |
|
2
|
inputText1 |
編集ボックス |
結果が設定されるフィールド |
|
3
|
inputText2 |
編集ボックス |
結果が設定されるフィールド |
|
4
|
inputText3 |
編集ボックス |
結果が設定されるフィールド |
XPagesに埋め込んだサーバーサイド JavaScript での実装
最も単純な正攻法です。XPage にボタンなどを作成し、その onClick イベントで 「Execute Script」 を選択し、以下のコードを記載します。
var input = getComponent("comboBox1");
var name = input.getValue();
var dc = database.search("name=\"" + name + "\"");
var match = dc.getCount();
var city = "Not Found";
if (match > 0) {
var doc = dc.getFirstDocument();
city = doc.getItemValueString("city");
} else {
print ("No prefecture was found.")
}
var output = getComponent("inputText2");
output.setValue(city);
スクリプトライブラリのサーバーサイド JavaScript の利用
先の例とほとんど同じ内容ですが、複数のページで処理の内容が重複するといったときには、処理の内容をスクリプトライブラリによって共通化することができます。
まず、共通化できる部分をスクリプトライブラリにします。このとき作成するスクリプトライブラリはサーバーサイド JavaScript のスクリプトライブラリです。スクリプトライブラリの内容は以下の様になります。
function myfunc(name) {
var dc = database.search("name=\"" + name + "\"");
var match = dc.getCount();
var city = "Not Found";
if (match > 0) {
var doc = dc.getFirstDocument();
city = doc.getItemValueString("city");
} else {
print ("No prefecture was found.")
}
var output = getComponent("inputText3")
output.setValue(city);
}
つぎにこのスクリプトを使用する XPage のリソース・プロパティでこのスクリプトライブラリを使用する宣言を追加します。
そしてボタンの onClick イベントなどに以下の様に実装します。
var input = getComponent("comboBox1");
var name = input.getValue();
myfunc(name);
エージェントの利用
同じような処理をエージェントを使って実装してみましょう。
このとき、新規作成した文書を保存することなくエージェントに渡すことはできません。そこで少々複雑な処理をします。
ここで紹介する方法は、 以下の記事がもとになっています。
XPages and Calling Agents Using an In-Memory Document
この例では Java エージェントとして処理を実装しています。新規に 「jaInMemory」 という名前の Java エージェントを作成します。このエージェントは実行方法としてアクションメニューからの選択実行として、ターゲットは 「なし」 にします。
Java のコードは以下の様になります。
import lotus.domino.*;
public class JavaAgent extends AgentBase {
public void NotesMain() {
try {
Session session = getSession();
AgentContext agentContext = session.getAgentContext();
// (Your code goes here)
Document doc = agentContext.getDocumentContext();
String name = doc.getItemValueString("Name");
// search prefecture
String city = "Not Found";
Database db = agentContext.getCurrentDatabase();
DocumentCollection dc = db.search("name=\"" + name + "\"");
int match = dc.getCount();
if (match > 0) {
Document prefDoc = dc.getFirstDocument();
city = prefDoc.getItemValueString("city");
} else {
System.out.println("No prefecture was found.");
}
doc.replaceItemValue("City", city);
} catch(Exception e) {
e.printStackTrace();
}
}
}
これを呼び出すサーバーサイド JavaScript は以下になります。これをボタンの onClick イベントなどに実装します。
var agentName:String = "jaInMemory";
var compInput = getComponent("comboBox1");
var compOutput = getComponent("inputText1");
// get the input parameter
var paramIn = compInput.getValue();
// create In Memory Document
var doc = database.createDocument();
doc.appendItemValue("Name",paramIn);
var agent:NotesAgent = database.getAgent(agentName);
if (agent != null) {
agent.runWithDocumentContext(doc);
compOutput.setValue(doc.getItemValueString("City"));
doc.recycle();
} else {
compOut.setValue("Can not find Java Agent");
}
この処理では、呼び出し元の JavaScript で database.createDocument() によって新規に文書が作成され doc 変数に格納されます。そして、エージェントの実行に必要な情報が文書に設定されます。
次に Java エージェントが呼び出されますが、doc 変数はは runWithDocumentContext() の引数として渡されます。この時点で文書 doc は保存されていません。そしてエージェントの中で処理が行われ、その結果が doc のアイテムとして設定されます。
エージェントの処理が終わると JavaScript に処理が戻ります。JavaScript では doc から処理結果を取り出し、表示している XPage のフィールドに設定しています。そしてデータ受け渡し用に使用された文書 doc はそのまま破棄されています。