<IMART type="jsspRpc"> タグ。
このタグを利用すると、JavaScriptで記述されたサーバサイドのロジックを、 クライアントサイドJavaScript(以下 CSJS)からシームレスに呼び出すことが可能となります。
属性 name には、CSJS内でサーバロジックを参照する際のオブジェクト名を指定します。
属性 page には、サーバロジックが記述されているページパス(拡張子なし)を指定します。
ここで指定するパスは、スクリプト開発モデルプログラムのソースディレクトリからの相対パス形式になります。 (デフォルトはインストールディレクトリ/pages/src からの相対パス形式になります)
サーバサイドの処理結果を非同期で受け取りたい場合は、属性 callback を指定します。
属性 callback には、CSJS関数名を指定します。 属性 callback が指定されている場合、サーバサイドの処理結果が 属性 callback で指定されたCSJS関数の引数に渡されます。
属性 onErrorCallback には、非同期通信時にエラーが発生した場合に呼び出される関数名を指定します。
属性 onErrorCallback で指定された関数の引数には、 JSSP-RPC 通信エラーオブジェクトが渡されます。
例:サーバサイドに「sample/test1.js」が存在し、 そのJSファイル内に「testFunction()」という関数が定義されている場合、 以下を行うことによって、CSJSから上記関数を実行することができます。
- HTMLファイル内に<IMART type="jsspRpc"> タグを以下のように記述します。
<IMART type="jsspRpc" name="serverLogic" page="sample/test1" >- CSJS内に以下を記述することで、サーバサイドのロジックを実行します。
serverLogic.testFunction();
JSSP-RPC 通信エラーに関して
<IMART type="jsspRpc"> タグを利用したサーバサイドとの通信でエラーが発生した際、 そのエラー内容を格納したオブジェクトが伝達されます。
通信エラーが発生するのは以下の場合です。
- レスポンスのHTTPステータスコードが「200」以外の場合 (サーバサイドで実行時エラーが発生した場合を含みます)
- セッションタイムアウトが発生した場合
- Debug.browse()を実行した場合
JSSP-RPCの通信方式(同期通信 または 非同期通信)によって、エラーオブジェクトの伝達方法が異なります。
同期通信の場合(=属性 callback が未指定の場合)、
通信エラーの内容が例外として投げられます。
その為、同期通信を行う場合は、サーバサイドとの通信部分を try / catchで囲み、例外処理を記述してください。
投げられる例外オブジェクトの構成は、JSSP-RPC 通信エラーオブジェクトと同一です。
非同期通信の場合(=属性 callback が指定されている場合)、
属性 onErrorCallback で指定された関数の引数に、 JSSP-RPC 通信エラーオブジェクトが渡されます。
属性 onErrorCallback が未指定の場合は、関数「ImJsspRpc.defaultOnErrorCallback() 」が実行されます。
JSSP-RPC 通信エラー オブジェクト
JSSP-RPC 通信エラー
オブジェクト (Object)httpStatus HTTPステータスコード (Number) code エラーコード (String) message エラーメッセージ (String) contentType レスポンスデータのコンテントタイプ (String)
data レスポンスデータ(JavaScriptオブジェクト、XMLオブジェクト、または、テキスト)
注意事項:
- <IMART type="jsspRpc"> タグでは、 ブラウザとサーバ間の通信に XMLHttpRequest を利用しています。
- ブラウザとサーバ間通信のデータ形式は JSON です。
- 本タグで指定されたサーバロジック内では、以下の関数を利用することは出来ません。
- forward()
- redirect()
- secureRedirect()
- transmission()
- HTTPResponse#sendMessageBody()
- HTTPResponse#sendMessageBodyString()
- <IMART type="jsspRpc"> タグでは、 プレゼンテーションページ(=HTMLファイル)とファンクションコンテナ(=JSファイル)が対になっている必要はありません。
任意のプレゼンテーションページ内で、任意のファンクションコンテナを呼び出すことが可能です。
内部タグ:なし
属性一覧 | ||
属性名 | 必須 | 説明 |
---|---|---|
name | true |
CSJS内でサーバロジックを参照する際のオブジェクト名
(エスケープ対象の属性です) |
page | true | サーバロジックが記述されているページパス(拡張子なし) |
callback | false |
サーバサイドの処理結果を非同期で受け取る際のコールバック関数名(CSJS関数名) 省略した場合は、同期通信を行い、サーバサイドから結果が返却されるまで待ちます。 (エスケープ対象の属性です) |
onErrorCallback | false |
非同期通信時にエラーが発生した場合に呼び出される関数名(CSJS関数名) 省略した場合は、関数「ImJsspRpc#defaultOnErrorCallback() 」が実行されます。 (ImJsspRpc#defaultOnErrorCallback()は、csjs/im_jssp_rpc.js 内に定義されています) なお、同期通信の場合(=属性 callback が未指定の場合)は、 属性 onErrorCallback に指定された関数は無視されます。 (エスケープ対象の属性です) |
escapeXml | false |
XMLエスケープの有効・無効を指定します。 「true」の場合、エスケープ対象の属性値が XMLエスケープされて出力されます。 「false」の場合、エスケープ対象の属性値の XMLエスケープ処理は行われません。 未指定の場合は、「現在実行中の プレゼンテーション・ページ に紐づくescapeXmlの値」に則ってXMLエスケープ処理行われます。 詳しくは、「エスケープ処理に関して」を参照してください。 |
escapeJs | false |
JavaScriptエスケープの有効・無効を指定します。 「true」の場合、エスケープ対象の属性値が JavaScriptエスケープされて出力されます。 「false」の場合、エスケープ対象の属性値の JavaScriptエスケープ処理は行われません。 未指定の場合は「現在実行中の プレゼンテーション・ページ に紐づくescapeJsの値」に則ってJavaScriptエスケープ処理行われます。 詳しくは、「エスケープ処理に関して」を参照してください。 |
使用例;
- サーバサイドの「jssp_rpc_test/sample1.js」に定義されている 「getNow()」関数を実行後、
「Now = (現在日付)」をアラート表示します。
クライアントサイドのHTMLソース <html> <head> <IMART type="jsspRpc" name="jsSample" page="jssp_rpc_test/sample1"> </IMART> <script language="JavaScript"> /** * 「jssp_rpc_test/sample1.js」の関数「getNow()」を実行します。 */ function execute(){ try{ var result = jsSample.getNow("Now = "); alert(result); } catch(ex){ alert(ex.message); return; } } </script> <head> <body> <input type="button" value="実行(同期)" onclick="execute();"> </body> </html>
サーバサイドの「jssp_rpc_test/sample1.js」 function getNow( args ){ return args + (new Date()).toString(); }
- サーバサイドの「jssp_rpc_test/sample2.js」に定義されている 「getObject()」関数を実行し、
その結果オブジェクトをコールバック関数「callBackFunction」にて取得します。
クライアントサイドのHTMLソース <html> <head> <IMART type = "jsspRpc" name = "jsSample" page = "jssp_rpc_test/sample2" callback = "callBackFunction"> </IMART> <script language="JavaScript"> /** * 「jssp_rpc_test/sample2.js」の関数「getObject()」を実行します。 */ function execute(){ // 引数作成 var obj = new Object(); obj.stringProp = "value1"; obj.booleanProp = true; obj.numberProp = -15; obj.arrayProp = new Array(); obj.arrayProp[0] = "ary0"; obj.arrayProp[1] = "ary1"; obj.arrayProp[2] = "ary2"; obj.dateProp = new Date(); // 内容を確認 var str = ""; str += "コールバック関数を確認するために" + "\n"; str += "サーバサイドで5秒間スリープします。" + "\n"; str += "\n"; str += "実行前" + "\n"; str += "--------------------------------------" + "\n"; str += "obj.stringProp = " + obj.stringProp + "\n"; str += "obj.booleanProp = " + obj.booleanProp + "\n"; str += "obj.numberProp = " + obj.numberProp + "\n"; str += "obj.arrayProp[0] = " + obj.arrayProp[0] + "\n"; str += "obj.arrayProp[1] = " + obj.arrayProp[1] + "\n"; str += "obj.arrayProp[2] = " + obj.arrayProp[2] + "\n"; str += "obj.dateProp = " + obj.dateProp + "\n"; str += "--------------------------------------" + "\n"; alert(str); // サーバロジック実行 jsSample.getObject(obj); } /** * コールバック関数 */ function callBackFunction( result ){ // 内容を確認 var str = ""; str += "実行後" + "\n"; str += "--------------------------------------------" + "\n"; str += "result.stringProp = " + result.stringProp + "\n"; str += "result.booleanProp = " + result.booleanProp + "\n"; str += "result.numberProp = " + result.numberProp + "\n"; str += "result.arrayProp[0] = " + result.arrayProp[0] + "\n"; str += "result.arrayProp[1] = " + result.arrayProp[1] + "\n"; str += "result.arrayProp[2] = " + result.arrayProp[2] + "\n"; str += "result.dateProp = " + result.dateProp + "\n"; str += "--------------------------------------------" + "\n"; alert(str); } </script> <head> <body> <input type="button" value="実行(非同期)" onclick="execute();"> </body> </html>
サーバサイドの「jssp_rpc_test/sample2.js」 function getObject( args ){ // 受け取ったオブジェクトの内容を表示 for(var prop in args){ if (args.hasOwnProperty(prop)) { Debug.print(prop + " : " + args[prop] + " [" + typeof args[prop] + "]") } } // コールバック関数を確認するために遅延処理を入れています。(5秒間) Client.sleep(5 * 1000); // 受け取ったオブジェクトの内容を加工 args.stringProp = args.stringProp + " (modified !)"; args.booleanProp = false; args.numberProp = args.numberProp + 10000; args.arrayProp[0] = args.arrayProp[0] + " (modified !)"; args.arrayProp[1] = args.arrayProp[1] + " (modified !)"; args.arrayProp[2] = args.arrayProp[2] + " (modified !)"; args.dateProp.setFullYear(2100); args.dateProp = args.dateProp; // 結果を返却 return args; }
バージョン:1.0
導入されたバージョン:6.1