スクリプトを使ってWagbyの標準画面遷移を変更する方法を説明します。 R7.8

「画面 > スクリプト > コントローラ」を設定します。

はじめに、どの画面についてのスクリプトを記述するかを指定します。

図1 スクリプトの入力 - 画面の指定

画面ごとに「実行タイミング」が用意されています。スクリプトは、指定したタイミングが終了したあとに呼び出されます。

図2 スクリプトの入力 - 実行タイミングの指定

ヘルパの「登録時」とコントーラの「登録時」の違い

ヘルパの登録時は XXXHelper#beforeInsert メソッドがスクリプトを呼び出します。これはデータベースに登録する「直前」に呼び出されるものです。

一方、コントローラの登録処理は、データベース登録処理などがすべて完了し、画面表示 (JSP) に制御が移る直前に呼び出されます。

この違いから、「登録時にデータを加筆・修正する」といった業務ロジックはヘルパの「登録時」に記述してください。この場合は、修正した値がデータベースに保存されます。

Wagby標準の画面遷移ルールを変更する

コントローラのスクリプトを作成する目的は、Wagby標準の画面遷移ルールを変更することです。 具体的には次のように記述します。

return "redirect:/" + 遷移先の画面種別 + モデルID + アクション文字列
return "forward:/" + 遷移先の画面種別 + モデルID + アクション文字列

接頭語 "redirect:/" または "forward:/" が必要です。両者の違いは「リダイレクトとフォワード」の節で説明します。標準は "redirect:/"を使うようにしてください。画面種別はSCREENTYPE関数の仕様に準じます。モデルIDは先頭を大文字とします。(例:customerモデルの場合、Customerとなる。)アクション文字列は、次節以降のサンプルで確認してください。

画面遷移はそのままに、追加のコードを記述する

画面遷移に変更がない場合は、return文を省略できます。追加コードのみ記述してください。

連続した登録処理を行うため、登録画面終了後、再び登録画面に遷移するようにした例です。

return "redirect:/insertCustomer.do?action_New=New";
図3 顧客モデルの登録時に動作するスクリプトを記述する

パラメータを付与する

再呼出された登録画面に、前回の登録画面で選択した値を渡し、初期値として表示することができます。

例えば、他モデル参照(リストボックス)項目 item1 の値を渡す場合、次のようにします。

return "redirect:/insertCustomer.do?action_New=New&item1="+customer.getItem1();

受け取る側 (item1) は、初期値(登録画面表示時)に次のような式を書きます。

TOINT(REQUEST())

詳細は「画面遷移 (1) 詳細画面から登録画面へ遷移する > モデル参照項目の扱い」を参考にしてください。

複数のパラメータを付与する

複数のパラメータを付与する場合は、各パラメータを & で区切ります。

return "redirect:/insertCustomer.do?action_New=New&item1="+customer.getItem1()+"&item2="+customer.getItem2();

すべての受け取る側の項目には、初期値(登録画面表示時)に REQUEST() 関数を適用してください。

日本語文字列をパラメータとして付与する

日本語文字列(を含む、英語圏以外の文字列)をパラメータとして付与する場合は、文字エンコーディングの配慮が必要となります。

ここではWagbyが提供するユーティリティクラス jp.jasminesoft.util.WebStringEncodeUtilities を使う方法を紹介します。

var WebUtils = Java.type("jp.jasminesoft.util.WebStringEncodeUtilities");
return "redirect:/insertCustomer.do?action_New=New&customername="+WebUtils.encodeString(customer.getCustomername());

システムが提供するログオンアカウントモデル "juser" と 1:1 で紐づく「スタッフ (staff)」モデルを作成したとします。このとき、次の要件を満たすようにします。

  • メニューからは、自分(ログオンID)だけの「スタッフ」モデルの更新処理が行えるようにする。
  • 検索画面や一覧画面は不要。
  • 更新後、詳細画面ではなく、すぐにメニューに戻るようにする。

スタッフモデルを用意する

  1. スタッフは juser と 1:1 の関係にあるため、スタッフの主キーを juser の主キーと同一にします。具体的には、主キー「スタッフID」項目は、juser モデルの主キー項目 userid を参照するようにします。
    図1 スタッフIDは、juser項目と1:1の関連とする
  2. 主キー「スタッフID」項目は、読み込み専用とします。
    図2 読み込み専用設定
  3. 主キー「スタッフID」項目は、検索時に隠し項目とします。
    図3 検索時に隠し設定(検索条件にする設定と併用)
  4. 主キー「スタッフID」項目の初期値を「ログオンID」とします。これは登録画面表示時、登録時、更新、検索時いずれも設定します。
    図4 初期値の設定
  5. 検索画面と一覧表示画面を同時に表示する」を有効にします。
  6. 検索結果が1件のとき更新画面に遷移する」を "常に" と設定します。
    図5 画面動作の設定(1)
    図6 画面動作の設定(2)
  7. メニューに表示されるラベル名を「スタッフ検索」から「スタッフ更新」へ変更します。

スクリプト

更新画面で保存ボタン押下時に呼び出されるスクリプトを設定します。メニュー画面へ遷移させるようにします。

if (p.errors.sizeJfcwarn() == 0 && p.errors.sizeJfcerror() == 0) {
    return "redirect:/mainMenu.do";
}

p.errors.sizeJfcwarn() は警告メッセージの数を返します。p.errors.sizeJfcerror() はエラーメッセージの数を返します。入力チェックで警告またはエラーとなった場合は、画面遷移ルールを指定しません。

図9 更新時のスクリプト

更新画面でキャンセルボタン押下時に呼び出されるスクリプトも用意します。ここは return のみとします。

return "redirect:/mainMenu.do";
図10 キャンセル時のスクリプト

動作例

メニューから「スタッフ更新」を選択すると、ログオンアカウントに紐付いたスタッフの更新画面が開きます。これは実際には検索一覧画面を開きますが、検索結果が1件のとき更新画面に遷移する設定と併用して実現しています。

図6 メニューに用意された更新ボタン(実体は検索画面)

保存ボタンまたはキャンセルボタンを押下すると、メニュー画面へ戻ります。

図7 保存ボタンを押下した例
図8 メニューへ戻っている(更新は行われている)

return で次の画面遷移先を指定するとき、接頭語 forward または redirect のいずれかを指定します。両者の違いは次の通りです。

図9 フォワードとリダイレクト
フォワード リダイレクト
処理の流れ ブラウザからの要求(リクエスト)を、forward で指定した先に引き継ぐ。 処理がいったんブラウザに返されたあと、ブラウザが続けて redirect 先に新たに要求(リクエスト)を行う。
使い分け ブラウザからみると、フォワード先の処理も含めて「一つの(一連の)」処理とみなせる場合に有効。同じ画面に戻る場合といった、限定的な用途で使う。 いったん処理を完了し、新しく次の処理に進めたい場合に有効。別画面へ遷移する場合、原則はこちらを利用する。
利用者(ブラウザ)の視点 一回の通信で完結。内部で「処理2」も行われているが、利用者はそれに気づかない。処理2から結果が送信されるが、利用者は「処理1を要求した結果」だと解釈する。 通信は二回、発生する。最初の結果を受け取ってすぐ、次の画面を開く要求が生じる。
p.requestの値 forward で指定した先でも利用できる。遷移先が異なる画面の場合、遷移元の値が引き継がれると誤動作の原因となることに留意すること。 redirect で指定した先では利用できない。
画面に表示される"登録が正常に終了しました。"などのメッセージは、p.requestに保持されています。forward を使うと (forward 先の処理を行ったあと) 画面にメッセージが表示されます。redirect を使うとメッセージは表示されません。

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

動作するスクリプトは、次のファイル命名規則に従って WEB-INF/script/モデルID フォルダ内に生成されます。

操作アクション + モデル名 + "_" + ボタン操作でサーバに送られる文字列.js

このスクリプトは所定のアクション処理が終了した後に呼び出されます。ファイル名の具体例を示します。

juserモデルの登録処理のあとに呼び出されるスクリプトファイル

WEB-INF/script/juser/InsertJuser_Send.js

customerモデルの「印刷形式で表示」ボタン押下のあとに呼び出されるスクリプトファイル

WEB-INF/script/customer/ShowCustomer_JFCPrintScreen.js
WEB-INF/script/customer/ShowListCustomer_JFCPrintScreen.js

staffモデルの「更新」ボタンを押したあとに呼び出されるスクリプトファイル

WEB-INF/script/staff/UpdateStaff_Send.js

staffモデルの「キャンセル」ボタンを押したあとに呼び出されるスクリプトファイル

WEB-INF/script/staff/UpdateStaff_Cancel.js

一覧更新画面では利用できません

一覧更新画面でのスクリプトは記述できません。一覧更新画面は内部の動作が複雑なため、スクリプトによる挙動変更による誤動作の危険があるためです。

帳票出力後の画面遷移は指定できません

帳票出力(一括出力を含む)のスクリプトでは、画面遷移を指定することができません。(指定しても無視されます。)