生成されるスクリプトファイルの詳細

最終更新日: 2022年11月10日
R8 | R9

基本テンプレート

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

ExcelFunction, Jfcerror, Jfcwarn, Jfcinfo, JFCUtils, HolidayManager は後述する「利用できる変数」で説明します。
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");
...ここに開発者独自のコードが埋め込まれる...
}
Java.type は特別な表記です。Java.type(FQCN形式のクラス名) と記述することで、Javaのクラスを表す変数を用意することができます。この変数を使って、オブジェクトを new 演算子で生成することができるようになります。

生成されるファイル

Designerで入力したスクリプトは、wagbyapp フォルダに存在するスクリプトファイル wagbyapp/webapps/$(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");
...開発者独自のコードを記述する...
}
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フォルダにあるファイルが優先されます。

ドキュメンテーションコメント

スクリプトエディタで、先頭にドキュメンテーションコメントを記述することができます。 この内容がスクリプト一覧表で抽出されます。

書式は次の通りです。

/**
 * タイトル
 * (空行)
 * 本文
 * 複数行にまたがってよい。
 */

例を示します。

/**
 * 受注明細自動作成処理
 *
 * 受注登録時に、受注明細を自動作成する。
 */
  • このドキュメンテーションコメントが未指定の場合、設計書出力ツールで作成されるスクリプト一覧表のタイトルと本文は空白になります。
  • タイトルが存在しない場合は「(スクリプト設定ずみ)」というタイトルのみ記載されます。
  • タイトルの最大文字列は50文字です。
  • タイトルが指定の最大文字列を超えた場合、超えた分は本文に含まれるようになります。
  • 本文中の改行はそのまま維持されます。
  • ドキュメンテーションコメントの有無でスクリプトの動作は変わりません。(スクリプト自体に影響を与えるものではありません。)

Java 標準クラスを利用する

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

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

利用できる変数

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

ワークフローのスクリプトはこちらをお読みください。

名前スクリプト内での表現説明
ストアモデル モデル名 customer データベースに保存されるオブジェクト
プレゼンテーションモデル モデル名_p customer_p Webフォームから入力された値。
すべて文字列型。
コンディションモデル モデル名_c customer_c 検索条件が格納されたオブジェクト。
リストモデル モデル名_l customer_l 一覧表示される値が格納されたオブジェクト
エラーメッセージ errorManager errorManager (エラーメッセージで解説)
SCREENTYPE if (SCREENTYPE == "copy") {...} SCREENTYPE関数と同じ。[例..]
UPLOADFILENAME UPLOADFILENAME UPLOADFILENAME アップロード更新の「ファイル名」が格納されている。アップロード更新のタイミングで動作するスクリプト内で利用できる。
UPLOADFILEPATH UPLOADFILEPATH UPLOADFILEPATH アップロード更新の「実ファイルのパス名」が格納されている。アップロード更新のタイミングで動作するスクリプト内で利用できる。
UPLOADFILEENTRY UPLOADFILEENTRY UPLOADFILEENTRY アップロード更新でzipファイルがアップロードされた時、UPLOADFILENAMEはzipファイルのファイル名となる。そこで展開後のzipファイルで、今、処理されている(zipファイル内の)ファイル名を保持するものとして UPLOADFILEENTRY を用意した。アップロード更新のタイミングで、zipファイルがアップロードしているときにスクリプト内で利用できる。
UserElement $owner $owner.group()
.descendants().groupId();
階層グループで解説。
ActionParameter p p p.appctxで(Springの)ApplicationContextを参照できるなどの使い方がある。
ExcelFunctionクラス (*1) var s = ExcelFunction.FIND(...); (Wagby関数の利用で解説)
Jfcerrorクラス (*1) var error = new Jfcerror; (エラーメッセージで解説)
Jfcwarnクラス (*1) var warn = new Jfcwarn; (エラーメッセージで解説)
Jfcinfoクラス (*1) var info = new Jfcinfo; (エラーメッセージで解説)
JFCUtilクラス (*1) var s = JFCUtils.Message(p, "M0001") (Wagby関数で解説)
HolidayManagerクラス (*1) var d = HolidayManager.getInstance()
.getEigyoDayAsSQLDate(model1.item1, 7)
(Wagby関数で解説)
ジョブパラメータ var dataMap = p.request.getAttribute("__jfcjob_dataMap"); (ジョブパラメータで解説)
__jfc_script_engine_filename - このスクリプトのファイルパス (WEB-INF/script以下の部分) が格納されている。例えば "/model1/Model1Helper_beforeShow.js" という文字列になる。
1. ExcelFunction, Jfcerror, Jfcwarn, Jfcinfo, JFCUtils, HolidayManager は基本テンプレートで宣言したものです。

スクリプトによって利用できる変数を確認する

スクリプトの実行タイミングによって、利用できるモデルは制限されます。例えば検索画面の操作でない場合、コンディションモデルは含まれません。削除処理の場合、ストアモデル自体が消えています。

またトランザクションスクリプトでは、トランザクションの範囲内として指定された複数のストアモデルを扱うことができます。トランザクションの対象となる繰り返しコンテナもオブジェクトとして扱うことができます。

この確認のためにデバッグ用の暗黙変数 __status が用意されています。次のように使います。

print(__status);

この情報から、利用できる暗黙変数(および型)を把握できます。例えば次のように表示されます。

errorManager                :jp.jasminesoft.jfc.JFCErrorManager
__jfc_script_engine_filename:java.lang.String
p                           :jp.jasminesoft.jfc.ActionParameter
SCREENTYPE                  :java.lang.String
session                     :org.hibernate.internal.SessionImpl
model1                      :jp.jasminesoft.wagby.model.model1.Model1
$rootGroup                  :jp.jasminesoft.jfc.core.group.GroupElementList
$allUsers                   :jp.jasminesoft.jfc.core.group.AllUserElementList

上の例では "model1" がストアモデルになります。ストアモデルかどうかは型の情報からパッケージ名をみて判断できます。もしプレゼンテーションモデルならパッケージ名は jp.jasminesoft.wagby.model.model1_p と、"_p" が付与されます。

※コントローラのスクリプトでも __status を利用できます。

共通して利用できる関数

"環境 > スクリプト" では「共通関数」を用意することができます。

環境>スクリプトの定義

「共通関数」の実体は WEB-INF/script/myfunction.js ファイルです。このファイルが存在した時、その内容を各スクリプトに含めます。

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

利用例

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

print(foo(1,2));

開発者は共通関数の定義で、関数 foo を用意することができます。

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

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

ワークフローのイベントスクリプト

共通関数の定義(myfunction.js) はワークフローのフローイベントスクリプトでも利用できます。

独自に拡張したスクリプトファイルを読み込む

独自に用意したスクリプトファイルを読み込むために load 関数を使うことができます。

load("wagby:xxx.js");

次のコードはいずれも /WEB-INF/script/sample/test.js を読み込みます。

load("wagby:sample/test.js");
load("wagby:/sample/test.js");
load("wagby:\\sample\\test.js");
load("wagby:../../WEB-INF/script/sample/test.js");
セキュリティの理由から、/WEB-INF/script より上位のフォルダにあるファイルを読み込むことはできません。例えば次のコードは実行時に IllegalArgumentException が発生します。
load("wagby:../test.js");//IllegalArgumentException が発生。

ファイルの区切り文字

"/" の利用を推奨します。Windows/Linux いずれの環境でも動作します。"\\" は Windows では動作しますが、Linux では動作しません。

ワークフローのイベントスクリプト

load 関数はワークフローのフローイベントスクリプトでも利用できます。

関数 preprocess を用意する

ヘルパの次のタイミングで、関数 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");
...ここに開発者独自のコードを記述する...
}
function process() {
...
}
preprocess 関数を定義した場合は、修正したスクリプトファイルを customize フォルダ (正確には customize/webapp/WEB-INF/script/<モデルID> フォルダ) 以下に保存するとよいでしょう。関数 preprocess を作成したあと、WagbyDesigner で編集するとスクリプトファイルは上書きされ、preprocess 関数の定義が消去されてしまうためです。

複数のスクリプト間でデータを受け渡す

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

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

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

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

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

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

var flag = p.request.getAttribute("上のキー名");
  if (flag === 求める値) {
    return 画面遷移先;
  }
  

重要

すでにあるキー名は使ってはいけません。値が上書きされてしまいます。開発者が独自のルールを決め、重複しないように配慮してください。例えばキー名の最初に "__プロジェクト名_" という接頭語を付与する、などは有効です。

ジョブパラメータ

ジョブパラメータをリクエストから取得することができます。

var dataMap = p.request.getAttribute("__jfcjob_dataMap");
  if (dataMap != null) {
      print("value="+dataMap.get("key"));
  } else {
      print("dataMap is null.")
  }
  • ヘルパ > アップロード更新(開始時)のタイミングで上記のようなスクリプトを用いて、ジョブパラメータを取得するといった使い方ができます。
  • スクリプトで null チェックは必ず行うようにしてください。例えばジョブではなく画面操作でのアップロード更新では、上記スクリプトの dataMap 変数は null となっています。

デバッグ

Webフォームから送信されるリクエストパラメータを確認する9.1.2

スクリプト中に次の記述を行うと、Webフォームから送信されたリクエストパラメータを確認できます。(ファイル型項目を含まない場合のみ)

Packages.jp.jasminesoft.jfc.JFCUtils.debug("param",p);

"param" の部分は "p" という省略表記も使えます。

Packages.jp.jasminesoft.jfc.JFCUtils.debug("p",p);

リクエストオブジェクトに格納されている内容を確認する9.1.2

スクリプト中に次の記述を行うと、リクエストオブジェクト (p.request) に setAttribute メソッドで格納した内容を確認できます。

Packages.jp.jasminesoft.jfc.JFCUtils.debug("attribute",p);

"attribute" の部分は "a" という省略表記も使えます。

Packages.jp.jasminesoft.jfc.JFCUtils.debug("a",p);

仕様・制約

暗黙オブジェクトrequestやsessionへ値を保存する場合の注意点

暗黙オブジェクト request や session には Wagby 本体がさまざまな値をセットしています。
例えば主キーの値や、ストアモデル、プレゼンテーションモデル、各種制御変数があります。

開発者は request.getAttribute(キー名) や session.getAttribute(キー名) で値を参照することができます。参照することは問題ありません。

ただし、request.setAttribute(キー名) や session.setAttribute(キー名) で値を保存する場合、キー名がすでに Wagby によって使われていないかどうかを考慮する必要があります。
誤って同じキー名で値を上書きしてしまうと、予想外の動作を引き起こします。

この対策として、開発者が内部で利用するキー名に prefix や suffix を付与するルールを設けることを推奨します。
例えば "local.customer" や "pkey.myapp" など、"local." や ".myapp" といった特定の文字列を付与するようにします。
こうすることで Wagby が内部で利用する値と重複せず、安全になります。