独自ボタンで外部コマンドを呼び出す
最終更新日: 2023年7月31日
R8 | R9
新規登録画面に「バッチ起動」というボタンを配置した例です。
今回の例では、このボタンを押すと、Tomcatコンソールに「Wagbyをインストールしたフォルダの内容」が出力されるようにしています。
「画面 > その他 > Javaソースコードの設定」欄で、ボタンを用意します。
ボタン名は任意ですが、イベント名は接頭語 "Original" とします。この例では Original1 と、数字1を加えたイベント名としています。
上の設定によってボタンが用意されますが、このボタンを押したときの処理は Java ソースコードまたはスクリプトによって記述します。ここではスクリプトによる記述方法を説明します。
スクリプト名は「画面種別 + モデルID + "_" + イベント名」になります。
画面種別は SCREENTYPE 関数の戻り値です。ただし先頭は大文字となります。具体的には Show,Insert,Update などです。
モデルIDの先頭は大文字とします。customer モデルの場合、Customer になります。
イベント名は図3で設定した記載を使います。
以上をまとめます。図3の場合、スクリプト名は InsertCustomer_Original1.js になります。
「呼び出されるスクリプトファイル名を確認する」方法を使うことで、簡単に知ることができます。
ビルド済みのアプリケーションに対して直接、スクリプトファイルを上書き保存することで、すぐに動作を確認できます。(ボタンを押すとスクリプトが実行されます。)
動作確認できたスクリプトファイルは、customize/webapp/WEB-INF/script/モデルID フォルダに保存してください。(script/モデルIDフォルダは開発者で作成します。)次回以降のビルド処理で、このファイルが含まれるようになります。
開発者が作成するスクリプトは「業務ロジック > 生成されるスクリプトファイルの詳細 > 基本テンプレート」の雛形を使うとよいでしょう。
オリジナルボタン押下時、スクリプトで使うことができるモデル(ストアモデルなど)は制限されます。暗黙変数 __status を使って、どのオブジェクトが利用できるかを確認するとよいでしょう。
Wagbyが提供する関数 ExcelFunction.EXEC を使います。引数などの詳細は"関数 > EXEC"をお読みください。
Wagbyが提供するクラス jp.jasminesoft.jfc.job.ProcessExecTask を使います。これは"外部コマンドを実行するジョブ"で用いられているものです。
このクラスを使って外部コマンドを実行するサンプルスクリプトは次のとおりです。
上のサンプルスクリプトは外部コマンドがコンソールに出力する値が result に格納されました。これとは別に、外部コマンドの終了コードを取得したい場合は executeWithExitcode メソッドを使います。
詳細表示画面に独自ボタンを定義し、ボタン押下後に再び自画面(同じデータの詳細表示画面)を開く場合は、スクリプトを次のように記述します。
ここではモデル customer とし、主キー項目を customerid とします。スクリプトファイルを ShowCustomer_Original1.js とします。
returnで自分自身の詳細画面に戻す際に、主キーを指定します。
例
定義方法
スクリプトを用意する
スクリプト名
ワンポイント
配置場所
この場合は wagbyapp/webapps/プロジェクト識別子/WEB-INF/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");
...ここに開発者独自のコードを記述する...
}
参照できるオブジェクトは制限されます
外部コマンドを実行するスクリプト
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);
}
環境変数を指定したい場合
提供されるメソッド 説明 例
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);
}
終了コードを取得する9.2.2
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);
}
ボタン押下後に再び自画面に戻る
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;
}
customer
は利用できません。そのためcustomer.customerid
といった記述はエラーになります。上のスクリプトではp.request.getParameter()
を使って Web フォーム上に用意された主キーを使っています。