サポート > Wagby Developer Network(R8) > 高度な使い方 > 生成されるスクリプトファイルの詳細

Designerで入力したスクリプトはファイルとして生成されます。

開発者によって記述されたコードは、次に示すテンプレートコードの内部に埋め込まれます。process という名前の関数の中にコードが含まれます。

ExcelFunction, Jfcerror, Jfcwarn, Jfcinfo, JFCUtils, HolidayManager, stdout は後述する「利用できる変数」で説明します。
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 JFCUtils = Java.type("jp.jasminesoft.jfc.JFCUtils");
var HolidayManager = Java.type("jp.jasminesoft.util.HolidayManager");
var stdout = java.lang.System.out;

...ここに開発者独自のコードが埋め込まれる...

}
Java.type は特別な表記です。Java.type(FQCN形式のクラス名) と記述することで、Javaのクラスを表す変数を用意することができます。この変数を使って、オブジェクトを new 演算子で生成することができるようになります。

生成されるファイル

Designerで入力したスクリプトは、wagbyapp フォルダに存在するスクリプトファイル wagbyapp/webapp/$(APPNAME)/WEB-INF/script/<モデルID>/スクリプトファイル.js に上書き保存されます。

そのため再ビルドなしで、動作しているアプリケーションの挙動を確認することができます。

本番機のファイルは変更されません。同じ開発機上の wagbyapp フォルダのみ、変更されます。本番機へ反映させる場合は上のファイルを手動でコピーするか、改めてビルドを行ってから wagbyapp フォルダ全体を差し替えてください。

基本テンプレートを使わない

基本テンプレートを使わないようにすることもできます。例えば、独自の関数を用意する場合などです。

この場合、開発するコードは必ず function process() から開始してください。コードの先頭がこの記述で始まる場合、基本テンプレートは使わないと判断します。

例えば、次のように記述します。

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 JFCUtils = Java.type("jp.jasminesoft.jfc.JFCUtils");
var HolidayManager = Java.type("jp.jasminesoft.util.HolidayManager");
var stdout = java.lang.System.out;

...開発者独自のコードを記述する...

}

function foo() {...独自の関数を記述する...}
function bar() {...独自の関数を記述する...}

定義した関数を(別のファイルに保存されたスクリプトから)呼び出すことはできません。

スクリプトに関する詳細なルールは次のとおりです。

  • [基本テンプレート] 開発者が作成したスクリプトコードの先頭に "function process() {" が付与されます。また末尾に "}" が付与されます。Wagbyは、常にこの process 関数を呼び出します。
  • ただし開発者が直接、process 関数の宣言 "function process() {" を明示的に記述することもできます。この場合、いくつかの変数の宣言も省略されるため、開発者自身で再定義してください。
  • Designerでスクリプトを変更すると、同じ開発機上の wagbyapp フォルダに存在するスクリプトファイル wagbyapp/webapp/$(APPNAME)/WEB-INF/script/<モデルID>/スクリプトファイル.js が上書きされます。そのため、ビルドすることなく、動作しているアプリケーションの挙動を確認することができます。(注意:本番機のファイルは変更されません。同じ開発機上の wagbyapp フォルダのみ、変更されます。)

customizeフォルダとの関係

もし customize フォルダ (正確には customize/webapp/WEB-INF/script/<モデルID> フォルダ) にもスクリプトを保存していた場合は注意が必要です。Designerに用意された設定欄でスクリプトを編集したあとビルド処理を行うと、customize フォルダにあるスクリプトに上書きされます。すなわち、customizeフォルダにあるファイルが優先されます。

スクリプト中に、Javaが提供する標準クラスを利用することができます。これらは Java.type で再宣言する必要はありません。パッケージ名も含めたクラス名を使ってください。

var list = new java.util.ArrayList();
list.add("Apple");
list.add("Orange");
list.add("Banana");
stdout.println(list);

スクリプト内で利用できる変数をまとめます。

名前スクリプト内での表現説明
ストアモデル モデル名 customer データベースに保存されるオブジェクト
プレゼンテーションモデル モデル名_p customer_p Webフォームから入力された値。
すべて文字列型。
コンディションモデル モデル名_c customer_c 検索条件が格納されたオブジェクト。
リストモデル モデル名_l customer_l 一覧表示される値が格納されたオブジェクト
エラーメッセージ errorManager errorManager (エラーメッセージで解説)
SCREENTYPE if (SCREENTYPE == "copy") {...} SCREENTYPE関数と同じ。[例..]
UPLOADFILENAME (*1) UPLOADFILENAME UPLOADFILENAME アップロード更新の「ファイル名」が格納されている。アップロード更新のタイミングで動作するスクリプト内で利用できる。
UserElement (*1) $owner $owner.group().descendants().groupId(); 階層グループで解説。
ActionParameter p p p.appctxで(Springの)ApplicationContextを参照できるなどの使い方がある。
ExcelFunctionクラス (*2) var s = ExcelFunction.FIND(...); (Wagby関数の利用で解説)
Jfcerrorクラス (*2) var error = new Jfcerror; (エラーメッセージで解説)
Jfcwarnクラス (*2) var warn = new Jfcwarn; (エラーメッセージで解説)
Jfcinfoクラス (*2) var info = new Jfcinfo; (エラーメッセージで解説)
JFCUtilクラス (*2) var s = JFCUtils.Message(p, "M0001") (Wagby関数で解説)
HolidayManagerクラス (*2) var d = HolidayManager.getInstance().getEigyoDayAsSQLDate(model1.item1, 7) (Wagby関数で解説)
stdout (*2) java.lang.System.out stdout.println(...); Java 8 利用時のみ。
1. R8.1.0 以降の Wagby で利用できます。
2. ExcelFunction, Jfcerror, Jfcwarn, Jfcinfo, JFCUtils, HolidayManager, stdout は、基本テンプレートで宣言したものです。
ストアモデル以外のオブジェクトは、存在しない場合もあります。例えば検索画面の操作でない場合、コンディションモデルは含まれません。
状況によってはストアモデルの取得もできない場合があります。例えば削除処理の場合、ストアモデルは消えています。
トランザクションスクリプトでは、トランザクションの範囲内として指定された複数のストアモデルを扱うことができます。
トランザクションスクリプトでは、トランザクションの対象となる繰り返しコンテナもオブジェクトとして扱うことができます。

開発者は WEB-INF/script/myfunction.js を用意することができます。 このファイルが存在した時、その内容をスクリプトに含めます。

正確には、スクリプトの後にmyfunction.jsのコードがコピーされます。

利用例

スクリプトで、次のように記載します。

stdout.println(foo(1,2));

開発者は myfunction.js を用意し、関数 foo を定義します。

function foo(a1,a2) { 
  return a1+a2; 
}

スクリプトを実行すると、コンソールに 3.0 と表示されます。

作成した myfunction.js は、customize/webapp/WEB-INF/script フォルダに保存してください。(インストール直後の状態では、WEB-INF フォルダ内に script フォルダはありませんので、これも作成してください。)次回のビルドから反映されるようになります。

ヘルパの次のタイミングで、関数 preprocess を用意することができます。処理の前に呼び出されます。

実行タイミングファイル名
登録 モデルIDHelper_beforeInsert.js
登録(初期データ作成) モデルIDHelper_initialize.js
更新 モデルIDHelper_beforeUpdate.js
詳細画面表示 モデルIDHelper_beforeShow.js

開発者は WEB-INF/script/<モデルID> フォルダに作成された上記ファイルを直接、テキストエディタで修正し、関数 preprocess を用意してください。

function preprocess() {
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 stdout = java.lang.System.out;

...ここに開発者独自のコードを記述する...

}

function process() {
...
}
preprocess 関数を定義した場合は、修正したスクリプトファイルを customize フォルダ (正確には customize/webapp/WEB-INF/script/<モデルID> フォルダ) 以下に保存するとよいでしょう。関数 preprocess を作成したあと、WagbyDesigner で編集するとスクリプトファイルは上書きされ、preprocess 関数の定義が消去されてしまうためです。

Wagby Designer で記述するスクリプトは「呼び出されるタイミング」を指定します。これは「ヘルパ」と「コントローラ」に大別されます。この二つの役割は次のとおりです。

ヘルパ コントローラ
タイミング モデル(1件のデータ)を処理している間。 ユーザによるボタン操作(アクション)
記述する内容 主にモデルの操作。SQLを使わずにモデルの値を直接、操作することができる。 主にユーザから入力された値の取得と、画面遷移。
トランザクションとの関係 トランザクション境界の内部である。(トランザクションは開始されている。)更新系のヘルパでは、モデルへの値の変更は自動的にデータベースに反映される。 トランザクションは開始されていない、または終了後である。
SQLを使う場合 データベースとの接続を行うsessionオブジェクト(*3)が利用できる状態にあるため、SQL(*4)を利用できる。(*5) データベースとの接続を行うsessionオブジェクトをスクリプト内で用意し、使い終わったら必ずクローズ処理を行う必要がある。(*6)(*7)
3. その実体は HibernateSession です。
4. 正確には Hibernate に最適化された HQL (Hibernate Query Language) です。
5. ヘルパで更新系のSQLを使う場合、自モデルの値の変更は行わないようにしてください。スクリプトの終了後に、メモリ上のモデル(ストアモデル)の値でデータベースが更新されます。
6. 詳細はSQLを利用するをお読みください。
7. コントローラでは自モデル、他モデルを問わず更新系のSQLを使うことができます。ここでトランザクションは開始されていないか、または終了しているため、いったん更新されたデータに対して再度、更新を行うという動作になります。

スクリプトの内部で用意した変数は、このスクリプトの中だけで有効です。他のスクリプトから参照することはできません。

他のスクリプトにデータを渡す場合は、p.request オブジェクトを使います。p.request オブジェクトはユーザから要求のあった処理を行なっている間中、共通で利用できる「入れ物」です。

例 処理中の値によって画面遷移ルールを変更する

ヘルパのスクリプトで、p.request に何らかの制御フラグをセットします。

p.request.setAttribute("適当なキー名", 値);

コントローラのスクリプトでは、この値によって遷移先を変更することができます。

var flag = p.request.getAttribute("上のキー名");
if (flag === 求める値) {
  return 画面遷移先;
}
すでにあるキー名は使ってはいけません。値が上書きされてしまいます。開発者が独自のルールを決め、重複しないように配慮してください。例えばキー名の最初に "__プロジェクト名_" という接頭語を付与する、などは有効です。