独自ボタンで外部コマンドを呼び出す

最終更新日: 2023年7月31日
R8 | R9

新規登録画面に「バッチ起動」というボタンを配置した例です。

図1 「バッチ起動」ボタンを用意する

今回の例では、このボタンを押すと、Tomcatコンソールに「Wagbyをインストールしたフォルダの内容」が出力されるようにしています。

図2 ボタン押下の例

定義方法

「画面 > その他 > Javaソースコードの設定」欄で、ボタンを用意します。

ボタン名は任意ですが、イベント名は接頭語 "Original" とします。この例では Original1 と、数字1を加えたイベント名としています。

図3 オリジナルボタンを用意する

スクリプトを用意する

上の設定によってボタンが用意されますが、このボタンを押したときの処理は Java ソースコードまたはスクリプトによって記述します。ここではスクリプトによる記述方法を説明します。

スクリプト名

スクリプト名は「画面種別 + モデルID + "_" + イベント名」になります。

画面種別は SCREENTYPE 関数の戻り値です。ただし先頭は大文字となります。具体的には Show,Insert,Update などです。

モデルIDの先頭は大文字とします。customer モデルの場合、Customer になります。

イベント名は図3で設定した記載を使います。

以上をまとめます。図3の場合、スクリプト名は InsertCustomer_Original1.js になります。

ワンポイント

呼び出されるスクリプトファイル名を確認する」方法を使うことで、簡単に知ることができます。

配置場所

ビルド済みのアプリケーションに対して直接、スクリプトファイルを上書き保存することで、すぐに動作を確認できます。(ボタンを押すとスクリプトが実行されます。)
この場合は wagbyapp/webapps/プロジェクト識別子/WEB-INF/script/モデルID フォルダに保存します。

動作確認できたスクリプトファイルは、customize/webapp/WEB-INF/script/モデルID フォルダに保存してください。(script/モデルIDフォルダは開発者で作成します。)次回以降のビルド処理で、このファイルが含まれるようになります。

スクリプトの基本形

開発者が作成するスクリプトは「業務ロジック > 生成されるスクリプトファイルの詳細 > 基本テンプレート」の雛形を使うとよいでしょう。

function process() {
var ExcelFunction = Java.type("jp.jasminesoft.util.ExcelFunction");
var Jfcerror = Java.type("jp.jasminesoft.jfc.error.Jfcerror");
var Jfcwarn = Java.type("jp.jasminesoft.jfc.error.Jfcwarn");
var Jfcinfo = Java.type("jp.jasminesoft.jfc.error.Jfcinfo");
...ここに開発者独自のコードを記述する...
}

参照できるオブジェクトは制限されます

オリジナルボタン押下時、スクリプトで使うことができるモデル(ストアモデルなど)は制限されます。暗黙変数 __status を使って、どのオブジェクトが利用できるかを確認するとよいでしょう。

外部コマンドを実行するスクリプト

EXEC関数を利用する

Wagbyが提供する関数 ExcelFunction.EXEC を使います。引数などの詳細は"関数 > EXEC"をお読みください。

function process() {
  var ExcelFunction = Java.type("jp.jasminesoft.util.ExcelFunction");
  var Jfcerror = Java.type("jp.jasminesoft.jfc.error.Jfcerror");
  var Jfcwarn = Java.type("jp.jasminesoft.jfc.error.Jfcwarn");
  var Jfcinfo = Java.type("jp.jasminesoft.jfc.error.Jfcinfo");
  var result = ExcelFunction.EXEC("../..", "cmd", "/C", "dir");/*Windows OS用*/
  print(result);
}

環境変数を指定したい場合

Wagbyが提供するクラス jp.jasminesoft.jfc.job.ProcessExecTask を使います。これは"外部コマンドを実行するジョブ"で用いられているものです。

提供されるメソッド説明
setCmd(String cmd) 実行したい処理を記述します。 cmd /C \"dir C:\"
setDir(String dir) 実行するときのフォルダを指定します。省略時は wagbyapp/bin です。
カレントフォルダは "." で表現します。
フォルダの区切り文字 "/" で終わらないようにしてください。例えば "../" ではなく "../." と記述します。
C:\work
.
../..
setMap(Map<String,String> map) 環境変数をjava.util.Mapに格納して渡すことができます。Mapのキーが環境変数名、値が環境変数の値として解釈されます。 (省略)
execute(ActionParameter p) setCmd で渡された処理を実行します。当該処理がコンソールに出力した文字が、戻り値となります。 (省略)

このクラスを使って外部コマンドを実行するサンプルスクリプトは次のとおりです。

function process() {
  var ExcelFunction = Java.type("jp.jasminesoft.util.ExcelFunction");
  var Jfcerror = Java.type("jp.jasminesoft.jfc.error.Jfcerror");
  var Jfcwarn = Java.type("jp.jasminesoft.jfc.error.Jfcwarn");
  var Jfcinfo = Java.type("jp.jasminesoft.jfc.error.Jfcinfo");
  var ProcessExecTaskClass = Java.type("jp.jasminesoft.jfc.job.ProcessExecTask");
  var processor = new ProcessExecTaskClass();
  processor.setCmd("cmd /C \"dir C:\"");
  processor.setDir("../..");
  var result = processor.execute(p);
  print(result);
}
  • setCmd メソッドの引数に、実行したい処理(バッチファイル名)を記述します。ここでは Windows OS が標準で提供する、ディレクトリリストを返すコマンドを記述しています。
  • setDir メソッドに、実行時のフォルダを指定します。省略時は wagbyapp/bin であるため、上の例のように相対パス指定することで、Wagby インストールフォルダを指定することもできます。
  • execute メソッドの引数「p」はスクリプト内で暗黙的に利用できます。そのままご利用ください。

終了コードを取得する9.2.2

上のサンプルスクリプトは外部コマンドがコンソールに出力する値が result に格納されました。これとは別に、外部コマンドの終了コードを取得したい場合は executeWithExitcode メソッドを使います。

function process() {
...
  var ProcessExecTaskClass = Java.type("jp.jasminesoft.jfc.job.ProcessExecTask");
  var processor = new ProcessExecTaskClass();
  processor.setCmd("cmd /C \"dir C:\"");
  processor.setDir("../..");
  var result = processor.executeWithExitcode(p);
  print(result);
}

ボタン押下後に再び自画面に戻る

詳細表示画面に独自ボタンを定義し、ボタン押下後に再び自画面(同じデータの詳細表示画面)を開く場合は、スクリプトを次のように記述します。

ここではモデル customer とし、主キー項目を customerid とします。スクリプトファイルを ShowCustomer_Original1.js とします。

function process() {
  var ExcelFunction = Java.type("jp.jasminesoft.util.ExcelFunction");
  var Jfcerror = Java.type("jp.jasminesoft.jfc.error.Jfcerror");
  var Jfcwarn = Java.type("jp.jasminesoft.jfc.error.Jfcwarn");
  var Jfcinfo = Java.type("jp.jasminesoft.jfc.error.Jfcinfo");
  ...(開発者が行う処理)...
  var id = p.request.getParameter("customerid");
  return "redirect:showCustomer.do?customerid="+id;
}

returnで自分自身の詳細画面に戻す際に、主キーを指定します。

※ 詳細画面に独自ボタンを用意したとき、独自ボタン押下時は詳細画面を表示する処理は実行されません。つまりデータベースアクセスも発生しないため、スクリプト中で暗黙変数customerは利用できません。そのためcustomer.customeridといった記述はエラーになります。上のスクリプトではp.request.getParameter()を使って Web フォーム上に用意された主キーを使っています。