jsspRpc タグ

<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から上記関数を実行することができます。
  1. HTMLファイル内に<IMART type="jsspRpc"> タグを以下のように記述します。
  2. <IMART type="jsspRpc" name="serverLogic" page="sample/test1" >
    
  3. CSJS内に以下を記述することで、サーバサイドのロジックを実行します。
  4. serverLogic.testFunction();


JSSP-RPC 通信エラーに関して
<IMART type="jsspRpc"> タグを利用したサーバサイドとの通信でエラーが発生した際、 そのエラー内容を格納したオブジェクトが伝達されます。

通信エラーが発生するのは以下の場合です。

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オブジェクト、または、テキスト)


注意事項:
内部タグ:
なし

属性一覧
属性名必須説明
nametrue CSJS内でサーバロジックを参照する際のオブジェクト名
(エスケープ対象の属性です)
pagetrueサーバロジックが記述されているページパス(拡張子なし)
callbackfalse サーバサイドの処理結果を非同期で受け取る際のコールバック関数名(CSJS関数名)
省略した場合は、同期通信を行い、サーバサイドから結果が返却されるまで待ちます。
(エスケープ対象の属性です)
onErrorCallbackfalse 非同期通信時にエラーが発生した場合に呼び出される関数名(CSJS関数名)
省略した場合は、関数「ImJsspRpc#defaultOnErrorCallback() 」が実行されます。
(ImJsspRpc#defaultOnErrorCallback()は、csjs/im_jssp_rpc.js 内に定義されています)
なお、同期通信の場合(=属性 callback が未指定の場合)は、
属性 onErrorCallback に指定された関数は無視されます。
(エスケープ対象の属性です)
escapeXmlfalse XMLエスケープの有効・無効を指定します。

「true」の場合、エスケープ対象の属性値が XMLエスケープされて出力されます。
「false」の場合、エスケープ対象の属性値の XMLエスケープ処理は行われません。
未指定の場合は、「現在実行中の プレゼンテーション・ページ に紐づくescapeXmlの値」に則ってXMLエスケープ処理行われます。

詳しくは、「エスケープ処理に関して」を参照してください。
escapeJsfalse 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