機能説明

<IMART type=“jsspRpc”>タグ。

このタグを利用すると、JavaScriptで記述されたサーバサイドのロジックを、クライアントサイドJavaScript(以下 CSJS)からシームレスに呼び出すことが可能となります。

属性 name には、CSJS内でサーバロジックを参照する際のオブジェクト名を指定します。

属性 page には、サーバロジックが記述されているページパス(拡張子なし)を指定します。
ここで指定するパスは、スクリプト開発モデルプログラムのソースディレクトリからの相対パス形式になります。 (デフォルトはWEB-INF/jssp/src からの相対パス形式になります)

サーバサイドの処理結果を非同期で受け取りたい場合は、属性 callback を指定します。
属性 callback には、CSJS関数名を指定します。 属性 callback が指定されている場合、サーバサイドの処理結果が 属性 callback で指定されたCSJS関数の引数に渡されます。

属性 onErrorCallback には、非同期通信時にエラーが発生した場合に呼び出される関数名を指定します。
属性 onErrorCallback で指定された関数の引数には、 JSSP-RPC 通信エラーオブジェクト が渡されます。

例:
サーバサイドに「sample/test1.js」が存在し、 そのJSファイル内に「testFunction()」という関数が定義されている場合、以下を行うことによって、CSJSから上記関数を実行することができます。
1. HTMLファイル内に<IMART type=“jsspRpc”>タグを以下のように記述します。
  <imart type=“jsspRpc” name=“serverLogic” page=“sample/test1” /">

2. 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()
    • Debug.browse()
    • HTTPResponse.sendMessageBody()
    • HTTPResponse.sendMessageBodyString()
    • HTTPResponse.sendMessageBodyFile()
    • HTTPResponse.sendMessageBodyAsBinary()
    • HTTPResponse.sendMessageBodyAsText()
    • Module.download.send()
    • Module.alert.back()
    • Module.alert.link()
    • Module.alert.reload()
    • Module.alert.write()
    • PageManager.redirect()
  • <IMART type=“jsspRpc”>タグでは、 プレゼンテーションページ(=HTMLファイル)とファンクションコンテナ(=JSファイル)が対になっている必要はありません。任意のプレゼンテーションページ内で、任意のファンクションコンテナを呼び出すことが可能です。

属性一覧

注釈 属性名 説明 省略時の動作
callback サーバサイドの処理結果を非同期で受け取る際のコールバック関数名(CSJS関数名)
省略した場合は、同期通信を行い、サーバサイドから結果が返却されるまで待ちます。
(エスケープ対象の属性です)
-
escapeJs JavaScriptエスケープの有効・無効を指定します。

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

詳しくは、「 エスケープ処理に関して 」を参照してください。
-
escapeXml XMLエスケープの有効・無効を指定します。

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

詳しくは、「 エスケープ処理に関して 」を参照してください。
-
必須
name CSJS内でサーバロジックを参照する際のオブジェクト名
(エスケープ対象の属性です)
-
onErrorCallback 非同期通信時にエラーが発生した場合に呼び出される関数名(CSJS関数名)
省略した場合は、関数「ImJsspRpc#defaultOnErrorCallback() 」が実行されます。
(ImJsspRpc#defaultOnErrorCallback()は、csjs/im_jssp_rpc.js 内に定義されています)
なお、同期通信の場合(=属性 callback が未指定の場合)は、
属性 onErrorCallback に指定された関数は無視されます。
(エスケープ対象の属性です)
-
必須
page サーバロジックが記述されているページパス(拡張子なし) -

内部タグ

なし

サンプル

同期実行

サーバサイドの「jssp_rpc_test/sample1.js」に定義されている「getNow()」関数を実行後、
「Now = (現在日付)」をアラート表示します。
クライアントサイドのHTMLソース
<imart type="head">
  <imart type="jsspRpc" name="jsSample" page="jssp_rpc_test/sample1" />
  <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>
</imart>

<input type="button" value="実行(同期)" onclick="execute();">
サーバサイドの「jssp_rpc_test/sample1.js」
function getNow( args ){
  return args + (new Date()).toString();
}

非同期実行

サーバサイドの「jssp_rpc_test/sample2.js」に定義されている「getObject()」関数を実行し、
その結果オブジェクトをコールバック関数「callBackFunction」にて取得します。
クライアントサイドのHTMLソース
<imart type="head">
  <imart type="jsspRpc" name="jsSample" page="jssp_rpc_test/sample2" callback="callBackFunction" />
  <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>
</imart>

<input type="button" value="実行(非同期)" onclick="execute();">
サーバサイドの「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;
}