サポート > Wagby Developer Network > カスタマイズ事例 > ボタンを追加し、独自処理を行わせる

カスタマイズ要件

今回のテーマは、詳細表示画面に独自のボタンを用意するとともに、そのボタンの処理を行なうロジックを記述するというものです。
例として、モデル customer の詳細表示画面に「独自処理」というボタンを用意してみます。

カスタマイズ方法

Wagby 定義ファイルの準備

モデル customer の Wagby 定義ファイルでは、「Wagby画面動作定義シート」/「Javaソースコードの設定」/「カスタマイズ用の雛形クラスを出力する」に「○」をつけてください。

カスタマイズ用の雛形クラスを出力する
図1 Wagby画面動作定義シートにおける「Javaソースコードの設定」を行う

JSP ファイルの編集

  1. 自動生成された $(DEVHOME)\env\work\srcgen\webpage\customer\showCustomer_body.jsp を開き、以下の例に示すようにボタンを追加します。 変更したファイルを $(DEVHOME)\customize\webpage\customer\showCustomer_body.jsp として保存します。これにより、次回以降、自動生成を行ってもカスタマイズしたファイルが上書きされるようになります。
    <%@ page pageEncoding="UTF-8" %>
    <fmt:setBundle basename="jfcapp"/>
    ...
        <!-- begin customize -->
        <td class="action_field">
          <form name="MyOriginalProcess"
            action="showCustomer.do" method="post"
            onSubmit="buttonOff(); return true;">
            <input type="hidden" name="SENDACTION"/>
            <input type="hidden" name="sessionId"
              value="<jfc:MD5Hash/>"/>
            <input type="hidden" name="customerid"
              value='<jfc:encodePrimaryKey
                key="${customer_p.customerid.content}"/>'/>
            <button dojoType="dijit.form.Button" type="submit"
                name="btnOriginal"
                onClick="dojo.byId(this.id).form.SENDACTION.name='action_Original'" >
                  <fmt:message key="__customize.customer.show.originalbutton"/>
                </button>
          </form>
        </td>
        <!-- end customize -->
    
      </tr>
    </table>
    <c:import url="customer/showCustomerP.jsp"/>
    
  2. 次に、$(DEVHOME)\customize\webpage\WEB-INF\src\myapp_ja.properties.UTF8 を作成します。ここに表示するボタンの value 値を記載します。
    __customize.customer.show.originalbutton=独自ボタン
    

この編集のポイントは次のとおりです。

  • アクション部におけるボタン配置は「XXX_body.jsp」というファイルが行っています。編集後は $(DEVHOME)\customize\webpage 以下に保存します。
  • form 要素の name 属性は任意に命名してください。
  • form 要素の action 属性により、受け取り側のアクションクラス(サーバ側)を指定します。
  • input/@name="SENDACTION" という要素は、ボタン押下時に書き換えられます。この項目を用意してください。
  • input/@name="sessionId" という要素は Wagby が利用します。この項目を用意してください。
  • input/@name="customerid" という要素は、主キーを渡すために用いられます。主キーは jfc:encodePrimaryKey というタグライブラリで囲います。
  • ボタンの追加は button/@dojoType="dijit.form.Button" で行います。onClick 属性中の 'action_Original' という表記で、このボタンを特定するのは 'action_' の後の「Original」という部分になります。接頭語 action_ は必須です。また、ボタン名は外部リソースを使います。リソースキーは任意に命名してください。
  • myapp_ja.properties.UTF8 ファイルに、リソース(ボタン名)を明記します。この方法により、追加リソースを用意することで国際化に対応できます。

モデル customer の Wagby 定義ファイルを修正した場合、ここで編集した showCustomer_body.jsp が変わる可能性があります。 この場合は手動で、最新の jsp ファイルに対して同じカスタマイズを適用してください。

アクションクラスの編集

上記の JSP ファイルにおける追加ボタンでは、form 要素の飛び先(action 属性)が "showCustomer.do" となっていました。 これはサーバサイドにおけるアクションクラス jp.jasminesoft.wagby.struts.customer.MyShowCustomerAction に対応します。

この対応関係を調べるためには、自動生成された $(DEVHOME)\env\work\srcgen\webpage\WEB-INF\struts-config\customer.xml を参照するとよいでしょう。

次に、同クラスにおいて、追加ボタンを処理するためのコードを記述する方法を説明します。

  1. $(DEVHOME)\env\work\srcgen\jp\jasminesoft\wagby\struts\customer\MyShowCustomerAction.java ファイルを、 $(DEVHOME)\customize\webpage\WEB-INF\src\jp\jasminesoft\wagby\struts\customer フォルダへ保存します。
    フォルダ名は、ご利用になるパッケージ名により変わります。適切に読み替えてください。
  2. MyShowCustomerAction.java を編集し、do_original メソッドを加えます。
    /**
     * ボタンの分岐処理
     */
    @Override
    public CommandType getCommand(ActionParameter p) {
        CommandType cmd = null;
        if (p.action != null && "Original".equals(p.action)) {
            cmd = CommandType.UserDefined;
        } else {
            cmd = super.getCommand(p);
        }
        return cmd;
    }
    
    /**
     * カスタマイズコード
     */
    @Override
    public ActionForward do_original(DbActionParameter p)
      throws IOException, ServletException, SecurityException
    {
        // 主キーの値の確認
        System.out.println(p.o);
         // 主キーの型の確認
        System.out.println(p.o.getClass().getName());
        return null;
    }
    

このソースコードのポイントは次のとおりです。

  • getCommand メソッドをオーバーライドし、追加ボタンについてはすべて定数「CommandType.UserDefined」を返すようにします。 なお、引数 ActionParameter(DbActionParameter でないことに注意してください)における変数「p.action」には、開発者が追加したボタン名(ただし "action_" という接頭語が分離されたもの)が格納されているため、これを判定条件に使います。
  • getCommand の戻り値が CommandType.UserDefined だった場合は、メソッド do_original が呼び出されます。この中に必要な処理を記述してください。なお、引数 DbActionParameter における変数「p.o」は Object 型で、そのモデルを示す主キーが格納されています。
  • 戻り値は、Struts の ActionForward オブジェクトになります。引数 DbActionParameter の内部には p.mapping という変数が格納されており、その実体は ActionMapping オブジェクトです。開発者はこれを使うこともできます。また、直接 ActionForward オブジェクトを生成することもできます。null を返した場合、Wagby フレームワークにおける標準画面(詳細表示アクションの場合は、表示画面)が利用されます。

応用

別のパラメータを受け取る

p.request オブジェクトを使うことで、通常のサーブレットプラグラミングのように、Web フォームからパラメータを受け取るコードを書くこともできます。

@Override
public ActionForward do_original(DbActionParameter p)
    throws IOException, ServletException, SecurityException
{
    // 別のパラメータを受け取る。
    String param1 = p.request.getParameter("param1");

    return null;
}

DbActionParameter 型変数 p の詳細については、DbActionParameter クラスの説明をお読みください。

別の画面へ遷移する

ActionForward クラスを使って、別の画面へ遷移させることができます。次の例は、メニュー画面へ遷移させた例です。

@Override
public ActionForward do_original(DbActionParameter p)
    throws IOException, ServletException, SecurityException
{
    return new ActionForward("/mainMenu.do");
}

別の画面へ遷移し、メッセージを表示する

p.errors オブジェクトにエラー/警告/情報メッセージをセットすることもできます。

@Override
public ActionForward do_original(DbActionParameter p)
    throws IOException, ServletException, SecurityException
{
    p.errors.addJfcinfo(
        errorManager.getJfcinfo("mymessage", p.locale));
    return new ActionForward("/mainMenu.do");
}

この場合、$(DEVHOME\customize\webpage\WEB-INF/src\myerr_ja.properties.UTF8 ファイルにメッセージを記載し、保存します。

mymessage=テストです。

メッセージの表示は、エラーメッセージ部が行います。 設定できる種別は error,warn,info が用意されています。

複数のボタンに対応する

複数のボタンを用意した場合は、p.action の値によって処理を振り分けるコードを実装してください。

/**
 * ボタンの分岐処理
 */
@Override
public CommandType getCommand(ActionParameter p) {
    CommandType cmd = null;
    if (p.action != null &&
        ("Original1".equals(p.action) ||
         "Original2".equals(p.action))) {
        cmd = CommandType.UserDefined;
    } else {
        cmd = super.getCommand(p);
    }
    return cmd;
}

/**
 * カスタマイズコード
 */
@Override
public ActionForward do_original(DbActionParameter p)
    throws IOException, ServletException, SecurityException
{
    if ("Original1".equals(p.action)) {
        return do_myprocess1(p);
    } else if ("Original2".equals(p.action)) {
        return do_myprocess2(p);
    }
    return null;
}

public ActionForward do_myprocess1(DbActionParameter p)
    throws IOException, ServletException, SecurityException
{
    return null;
}

public ActionForward do_myprocess2(DbActionParameter p)
    throws IOException, ServletException, SecurityException
{
    return null;
}

ビルド

変更したファイルのビルド方法については、「カスタマイズファイルの適用方法」をお読みください。

ダウンロード

このページで紹介したサンプルをダウンロードしてお試しいただくことができます。

  • addbutton.zip (465,247 byte)
    同 zip ファイルには次のファイルが含まれています。
    customize/webpage/customer/showCustomer_body.jsp
    customize/webpage/WEB-INF/src/jp/jasminesoft/wagby/struts/customer/MyShowCustomerAction.java
    customize/webpage/WEB-INF/src/myapp_ja.properties.UTF8
    customize/webpage/WEB-INF/src/myerr_ja.properties.UTF8
    xls-model/addbutton.xls

ダウンロード後、次の手順に従ってお試しください。

  1. ダウンロードファイルを $(DEVHOME) に展開します。Wagby 定義ファイルならびにカスタマイズコードが上書きで配置されます。(なお、パッケージ名は「jp.jasminesoft.wagby」となっていますので、変更している方はご注意ください。)
  2. フルビルドを行います。

このページ

カスタマイズ事例