スクリプトを使った画面遷移

最終更新日: 2021年12月15日
R8 | R9

スクリプトの作成方法

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

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

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

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

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

呼び出されるタイミング

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

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

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

ワンポイント

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

スクリプトの記述ルール

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

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

return "redirect:" + 遷移先の画面種別 + モデルID + イベント名(アクション文字列形式)
return "forward:" + 遷移先の画面種別 + モデルID + イベント名(アクション文字列形式)

接頭語 "redirect:" または "forward:" が必要です。
両者の違いは「リダイレクトとフォワード」の節で説明します。 標準は "redirect:"を使うようにしてください。

画面種別はSCREENTYPE関数の仕様に準じます。
モデルIDは先頭を大文字とします。(例:customerモデルの場合、Customerとなる。)

アクション文字列は "action_" という接頭語のあとにイベント名を付与します。
具体的には次節以降のサンプルで確認してください。

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

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

[例] 登録画面から、再び登録画面へ遷移する

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

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

パラメータを付与する

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

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

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

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

TOINT(REQUEST())

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

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

return "redirect:insertCustomer.do?action_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&customername="+WebUtils.encodeString(customer.getCustomername());

[例] 更新処理から、メニューへ遷移する

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

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

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

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

スクリプト

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

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

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

図10 更新時のスクリプト

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

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

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

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

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

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

[例] ウィザードの任意の画面へ遷移する

コントローラのスクリプト、もしくはオリジナルボタンのスクリプトに次のような記述を行うことができます。

return "redirect:showModel1P1.do?pkey=1000&action_WizChange&_wizard_page=2";
  • モデルが model1 のとき、showModel1P1.do と、"P1" が必要になります。
  • イベント名として、action_WizChange=WizChangeを加えてください。
  • _wizard_page=数字を加えてください。_wizard_page で画面番号を指定します。数字は1から開始されます。1未満もしくは数字ではないイレギュラー文字が指定された場合は1と扱います。数字が、準備している画面より大きい場合は、最後の画面となります。

[例] 独自ボタン押下で、マルチセッションを使って任意の画面を開く

マルチセッションとは、1つのブラウザでタブを開いたとき、それぞれのタブで Wagby アプリケーションにログオンする仕組みです。[詳細...]

ここでは独自ボタン押下時、マルチセッションを使ってログオンし、任意の画面に遷移するスクリプトを説明します。

独自ボタンのイベント名を "Original1" とします。WEB-INF/script/<モデルID>/ShowList<モデルIDキャメル記法>_Original1.js をエディタで作成します。

function process() {
  var ExcelFunction = Java.type("jp.jasminesoft.util.ExcelFunction");
  var now = ExcelFunction.NOW();
  var s = ExcelFunction.RIGHT(
            ExcelFunction.RPAD(
              ExcelFunction.TEXT(
                ExcelFunction.TIME(
                  ExcelFunction.HOUR(now),
                  ExcelFunction.MINUTE(now),
                  ExcelFunction.SECOND(now)
                ),
                ".#####"
              ),
              6,
              "0"
            ),
            5
          );
  //print(s);
  var _ss = p.request.getParameter("_s");
  if (_ss === null) {
    _ss = "0";
  }
  return "redirect:/"+s+"/showList<遷移先のモデルIDキャメル記法>.do?_ss="+_ss;
}
  • Wagbyのマルチセッションは、URLの一部に5桁のランダムな数字を含めて管理しています。これがマルチセッションを実現するための識別子となっています。新規ログオンを行うたびに、新しい数字が生成されます。つまり5桁の数値を使って異なるセッションと扱いますが、これは重複しなければ任意の値でよいとなっています。上のスクリプトでは時分秒から求めています。(厳密には重複するかもしれませんが、可能性は低い、としています。)
  • 遷移時に _ss パラメータを付与します。初回は "0" を指定します。そのあとは付与されたマルチセッションの値を使います。一度付与されたマルチセッションの値は p.request.getParameter("_s") で取得できる仕様です。

フォワードとリダイレクト

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

図15 フォワードとリダイレクト
フォワード リダイレクト
処理の流れ ブラウザからの要求(リクエスト)を、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

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

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