サポート > リポジトリ > スクリプト > ヘルパとコントローラ、トランザクション境界の関係スクリプト

スクリプトはヘルパ系とコントローラ系に大別されます。実装したい処理の用途に応じて、適切なポイントにスクリプトを記述します。

「画面 > スクリプト」では実行タイミングを指定して、スクリプトを記述することができます。

図8 スクリプトの入力

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

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

ヘルパの詳細

入力したスクリプトから、拡張子 ".js" のファイルが生成されます。実ファイルは wagbyapp/webapp/$(APPNAME)/WEB-INF/script/モデルIDフォルダ の中に用意されます。

$(APPNAME) は、プロジェクト識別子です。標準は "wagby" となっています。
タイミング 説明 生成されるファイル
登録 「初期値 > 登録時」を行ったあとに呼び出されます。(*6) 登録直前のデータを修正することができます。この処理を行った後のデータが、データベースに保存されます。 <モデルID>Helper_beforeInsert.js
登録(初期データ作成) 「初期値 > 登録画面表示時」を行ったあとに呼び出されます。(*6) 新規登録用のデータを修正することができます。この処理を行った後のデータが、登録画面に表示されます。(このタイミングではデータベースへは保存されません。) <モデルID>Helper_initialize.js
更新 「初期値 > 更新時」を行ったあとに呼び出されます。(*6) 更新直前のデータを修正することができます。この処理を行った後のデータが、データベースに保存されます。 <モデルID>Helper_beforeUpdate.js
詳細画面表示 「初期値 > 詳細画面表示時」を行ったあとに呼び出されます。(*6) 表示直前のデータを修正することができます。この処理を行った後のデータが、詳細画面に表示されます。(データベースには反映されません。表示の直前で内部のデータを改変する必要がある場合に利用できます。例えば一部のデータを表示時に隠す、などです。)このスクリプトは複数回呼び出される場合がありますので、ここで値を更新するようなスクリプトを記述しないようにしてください。 <モデルID>Helper_beforeShow.js
詳細画面表示(登録) 登録画面を開くときに呼び出されます。 <モデルID>Helper_beforeShowInInsert.js
詳細画面表示(更新) 更新画面を開くときにデータベースの値を読み込みますが、そのあとにこのスクリプトが呼び出されます。 <モデルID>Helper_beforeShowInUpdate.js
詳細画面表示(一覧) 一覧画面を開くときにデータベースの値を読み込みますが、そのあとにこのスクリプトが呼び出されます。一覧表示の直前で内部のデータを改変する必要がある場合に利用できます。 <モデルID>Helper_beforeShowInShowList.js
詳細画面表示(アップロード更新) アップロード更新でデータを1件処理した直後に呼び出されます。 <モデルID>Helper_beforeShowInUploadUpdate.js
計算 定義済みの計算式を実行したあとに、このスクリプトが呼び出されます。 <モデルID>Helper_calc.js
一括更新 検索・一覧表示画面 > 一括更新ボタンを表示する の処理内容を記述します。 ShowList<モデルID>Controller_do_updateRule.js
帳票内容の編集 Excel/PDF帳票の前に呼び出されます。出力内容を修正することができます。 ReplaceMapHelper_remake.js
帳票出力後 Excel/PDF帳票出力後に呼び出されます。実際にはコントローラのスクリプトとなります。例えば出力後に "帳票出力日" を設定したいという場合、EntityService を使ってモデルを取得し、更新するようにしてください。 Show<モデルID>Controller_print.js
帳票出力後(一覧) Excel/PDF帳票出力後に呼び出されます。実際にはコントローラのスクリプトとなります。例えば出力後に "帳票出力日" を設定したいという場合、EntityService を使ってモデルを取得し、更新するようにしてください。 ShowList<モデルID>Controller_print.js
入力チェック 標準で用意している必須チェックや文字数チェックのあとに呼び出されます。独自のチェック処理を追加することができます。 <モデルID>PInputCheckHelper_input_check.js
入力チェック(一覧更新) 標準で用意している必須チェックや文字数チェックのあとに呼び出されます。独自のチェック処理を追加することができます。 <モデルID>UlpInputCheckHelper_input_check.js
入力フィルタ 標準で用意している入力フィルタ処理のあとに呼び出されます。独自のフィルタ処理を追加することができます。 <モデルID>PFilterHelper_filter.js
入力フィルタ(検索) 標準で用意している入力フィルタ処理のあとに呼び出されます。独自のフィルタ処理を追加することができます。 <モデルID>CpFilterHelper_filter.js
入力フィルタ(一覧更新) 標準で用意している入力フィルタ処理のあとに呼び出されます。独自のフィルタ処理を追加することができます。 <モデルID>UlpFilterHelper_filter.js
論理削除 判定ルールを独自に決めることができます。 <モデルID>Helper_logicalDelete.js
アップロード更新(開始時) アップロード更新処理の開始時に一回だけ呼び出されます。 UploadUpdate<モデルID>_processStart.js
アップロード更新(終了時) アップロード更新処理の終了時に一回だけ呼び出されます。 UploadUpdate<モデルID>_processEnd.js
アップロード更新(1件読み込み後) アップロード更新でデータを1件読み込んだ直後に呼び出されます。 UploadUpdate<モデルID>_AfterRead.js
検索 検索条件をカスタマイズするタイミングとして用意されています。 <モデルID>CriteriaConverter_convert.js
検索(前処理) 検索処理の直前に呼び出されます。 <モデルID>CHelper_beforeSearch.js
削除 削除処理の直前に呼び出されます。 <モデルID>Helper_beforeDelete.js
ストアモデルからプレゼンテーションモデルへの変換 ストアモデルからプレゼンテーションモデルへの変換の前に preprocess() を、変換の後に process() を呼び出します。(*6) 絞り込みで利用した例を紹介しています。 <モデルID>PHelper_s2p.js
プレゼンテーションモデルからストアモデルへの変換 プレゼンテーションモデルからストアモデルへの変換の前に preprocess() を、変換の後に process() を呼び出します。(*6) <モデルID>PHelper_p2s.js

トランザクション処理

トランザクション処理はモデル項目詳細定義で記述します。詳細は「モデルをまたがる計算(トランザクション)」で説明します。

図9 トランザクション制御時のスクリプト

トランザクションを設定した場合、生成されるファイル名は次の通りです。

モデルIDEntityService_doTransactionBy${トランザクションを設定した項目ID}InsertTransaction.js
モデルIDEntityService_doTransactionBy${トランザクションを設定した項目ID}UpdateTransaction.js
モデルIDEntityService_doTransactionBy${トランザクションを設定した項目ID}DeleteTransaction.js

画面に用意されたボタン押下のタイミングで実行されるスクリプトです。この詳細は「画面遷移」で説明します。

Wagby のトランザクション境界とは、外部データベースに対して "begin transaction" 命令を発行するタイミングをいいます。この命令が発行されてから、再びデータベースに対して "commit" または "rollback" 命令が発行されるまでは「1つのトランザクション」として扱われます。この間データベースに対して行われた変更処理はすべてコミットされるか、またはすべてロールバックされるかのどちらかになります。

新規登録・コピー登録画面、更新画面、一覧更新画面

コントローラクラス内の doInTransaction メソッドがトランザクション境界となります。

削除、アップロード更新画面

コントローラクラスから呼び出される EntityService がトランザクション境界となります。

doInTransaction メソッドと EntityService の関係

EntityService が提供するメソッドは、まだトランザクションが開始されていない場合は新しくトランザクションを開始するが、すでにトランザクションが開始されている場合は(新しいトランザクションを開始せず)現在のトランザクションをそのまま利用するようになっています。

一覧更新画面や親子同時更新画面での応用

一覧更新画面や親子同時更新画面は doInTransaction メソッドがトランザクション境界となっているため、保存時に(一意制約等のデータベースエラーとなった場合)処理がロールバックされ、編集画面に戻るようになっています。

また、コントローラの一覧更新のスクリプト「データベースコミット前」で例外を発生させると更新処理全体がロールバックされ、編集画面に戻るようになっています。すなわち修正したデータをすべてコミットさせるか、あるいはすべてロールバックさせるかをスクリプトでも制御できるようになっています。[詳細...]

Wagby ではスクリプトやパラメータ記述においてキャメル記法というルールが適用されます。

  • 項目IDが複合語の場合、先頭を小文字で書き始めます。項目IDが Item123 の場合、スクリプトでは item123 となります。
  • 項目IDに "_" (アンダースコア)が含まれている場合、その "_" は除去され、その次の文字が大文字になります。例えば customer_id は customerId になります。kana_name は kanaName になります。
  • アンダースコアを取り除いたあとの先頭が小文字で、二文字目が大文字の場合、先頭も大文字となります。例えば p_number は pNumber となったあと、最終的に PNumber になります。

スクリプトでは「項目ID」にキャメル記法が適用されます。

次の方法で、どのようなスクリプトファイルがどのタイミングで呼び出されるかを調べることができます。

  1. ビルドされたアプリケーションの webapps\$(APPNAME)\WEB-INF\classes フォルダに含まれる jfcbase.properties をテキストエディタで開きます。
  2. 次の行を見つけ、先頭の ";" を除きます。
    (修正前)
    ;jp.jasminesoft.jfc.ScriptCodeRunner.isOutputStatusToConsole=true
    ;jp.jasminesoft.jfc.ScriptCodeRunner4Controller.isOutputStatusToConsole=true
    (修正後)
    jp.jasminesoft.jfc.ScriptCodeRunner.isOutputStatusToConsole=true
    jp.jasminesoft.jfc.ScriptCodeRunner4Controller.isOutputStatusToConsole=true

  3. アプリケーションを起動します。
  4. アプリケーションを操作するたびに、Tomcatのコンソールに、どのスクリプトファイルを実行しようとしたかが表示されます。(ファイルが存在しなければ実行されることはありません。)