SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

DeveloperZine(デベロッパージン)- エンジニアの意思決定を支える技術情報メディア ProductZine

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

特集記事

OSSフレームワーク「dataforms.jar」でサンプルプログラムを構築する(1)

ページJavaクラス作成(1)

開発ツールを使ったページクラスの作成

 次に開発ツールの[ページJavaクラス作成]を使用してページクラスを作成します。このツールを使うとQueryForm、QueryResultForm、EditFormの3種類のフォームを配置したページクラスを作ることができます。これらのフォームを全て配置すれば、QueryFormで入力された検索条件で検索した結果をQueryResultFormに一覧表示し、一覧から選択したレコードをEditFormで編集するようなページを自動生成することができます。ページには常に3種類のフォーム全てを配置するわけではありません。会員登録ページのように必要な情報を入力し、それを追加していくだけのページの場合はEditFormのみ配置することになります。また、EditFormを配置しないで、検索条件を入力し、一覧を表示するだけのページというのもあり得ます。1からコードを書く必要がありますが、Formクラスから派生した特殊なフォーム作成してページに配置することも可能です。

 記事管理ページの場合、この3種類のフォームを全て配置します。ページ作成時には編集対象のテーブルを1種類だけ指定することができます。今回はArticleTableのみを指定します。以下のように情報を入力し、ページを構築する各種クラスを生成します。

記事管理ページJavaクラス作成
記事管理ページJavaクラス作成

作成された各種クラスの解説

 上記の操作で、以下のファイルが作成されます。

作成されたソースファイル一覧
パッケージ クラス 備考
bbs.page ArticlePage.java 記事管理ページクラス
ArticleQueryForm.java 検索条件フォームクラス
ArticleQueryResultForm.java 検索結果フォームクラス
ArticleEditForm.java 編集フォームクラス
bbs.dao ArticleDao.java 記事テーブルのデータアクセスオブジェクトクラス

ArticlePage.java

 ページクラスは以下のように生成されます。コンストラクタで3種類のフォームが配置されています。

ArticlePage.java

package bbs.page;

    ・・・ 中略 ・・・

/**
 * ページクラス。
 */
public class ArticlePage extends BasePage {
    /**
     * コンストラクタ。
     */
    public ArticlePage() {
        this.addForm(new ArticleQueryForm());
        this.addForm(new ArticleQueryResultForm());
        this.addForm(new ArticleEditForm());

    }

    ・・・ 中略 ・・・

}

ArticleQueryForm.java

 このフォームにはArticleTable中のフィールドの内に検索条件に使えそうなフィールドを配置しています。RecordIdFieldは基本的に<input type="hidden"/>に対応するフィールド扱いなので、ArticleIdFieldとThreadIdFieldは配置されていません。

ArticleQueryForm.java
package bbs.page;

import dataforms.controller.QueryForm;
import bbs.dao.ArticleTable;
import dataforms.field.base.Field.MatchType;

/**
 * 問い合わせフォームクラス。
 */
public class ArticleQueryForm extends QueryForm {
    /**
     * コンストラクタ。
     */
    public ArticleQueryForm() {
        ArticleTable table = new ArticleTable();
        this.addField(table.getTitleField()).setMatchType(MatchType.FULL);
        this.addField(table.getAutherField()).setMatchType(MatchType.FULL);
        this.addField(table.getContentsField()).setMatchType(MatchType.FULL);

    }
}

ArticleQueryResultForm.java

 ArticleQueryResultFormのコンストラクタで、検索結果をページスクロールさせるためのPageScrollHtmlTableを配置しています。このテーブルに配置するフィールドは、ArticleDao.getQueryResultFieldList()メソッドから、ArticleTableの問い合わせ結果のフィールドリストを取得し、配置しています。メソッドqueryPageは、QueryFormに入力された検索条件を渡して、その問い合わせ結果を返します。メソッドdeleteDataは、問い合わせ結果のリストからデータを削除する場合に呼び出されるメソッドになります。

ArticleQueryResultForm.java

package bbs.page;

    ・・・ 中略 ・・・


/**
 * 問い合わせ結果フォームクラス。
 */
public class ArticleQueryResultForm extends QueryResultForm {
    /**
     * コンストラクタ。
     */
    public ArticleQueryResultForm() {
        ArticleTable table = new ArticleTable();
        this.addPkFieldList(table.getPkFieldList());
        PageScrollHtmlTable htmltable = new PageScrollHtmlTable(Page.ID_QUERY_RESULT, ArticleDao.getQueryResultFieldList());
        htmltable.getFieldList().get(ArticleTable.Entity.ID_TITLE).setSortable(true);
        htmltable.getFieldList().get(ArticleTable.Entity.ID_AUTHER).setSortable(true);
        htmltable.getFieldList().get(ArticleTable.Entity.ID_CONTENTS).setSortable(true);

        this.addHtmlTable(htmltable);
    }

    /**
     * 問い合わせを行い、1ページ分の問い合わせ結果を返します。
     *
     * @param data 問い合わせフォームの入力データ。
     * @param queryFormFieldList 問い合わせフォームのフィールドリスト。
     * @return 問い合わせ結果。
     *
     */
    @Override
    protected Map<String, Object> queryPage(final Map<String, Object> data, final FieldList queryFormFieldList) throws Exception {
        ArticleDao dao = new ArticleDao(this);
        return dao.queryPage(data, queryFormFieldList);
    }

    /**
     * 問い合わせ結果リストのデータを削除します。
     * <pre>
     * 問い合わせ結果リストからの削除が不要な場合、HTMLから削除ボタンを削除し、
     * このメソッドを何もしないメソッドにしてください。
     * </pre>
     * @param data 選択したデータのPKの値を記録したマップ。
     */
    @Override
    protected void deleteData(final Map<String, Object> data) throws Exception {
        ArticleDao dao = new ArticleDao(this);
        this.setUserInfo(data); // 更新を行うユーザーIDを設定する。
        dao.delete(data);
    }
}

ArticleEditForm.java

 ArticleEditFormのコンストラクタで、ArticleTable中のフィールド全てをフォームに配置しています。コンストラクタ以外のコードは、データの取得メソッドやデータの追加、更新メソッドなどです。

ArticleEditForm.java
package bbs.page;

    ・・・ 中略 ・・・

/**
 * 編集フォームクラス。
 */
public class ArticleEditForm extends EditForm {
    /**
     * コンストラクタ。
     */
    public ArticleEditForm() {
        ArticleTable table = new ArticleTable();
        this.addTableFields(table);
    }

    /**
     * フォームの初期化を行います。
     * <pre>
     * DBを使用した初期化処理はここに記述します。
     * </pre>
     */
    @Override
    public void init() throws Exception {
        super.init();
    }

    /**
     * 編集対象のデータを取得します。
     * <pre>
     * 問い合わせ結果フォームに表示されたデータを選択した際に呼び出されます。
     * dataには最低編集対象レコードのPKのマップが入ってきます。
     * </pre>
     * @param data 取得するデータのPKの値が入ってきます。
     * @return 編集対象データ。
     */
    @Override
    protected Map<String, Object> queryData(final Map<String, Object> data) throws Exception {
        ArticleDao dao = new ArticleDao(this);
        return dao.query(data);
    }

    ・・・ 中略 ・・・

    /**
     * ポストされたデータが更新するのか新規追加するのかを判定します。
     * <pre>
     * 編集対象データにPKの入力があった場合、更新すべきと判断します。
     * </pre>
     * @param data 入力データ。
     * @return 更新対象データの場合true。
     */
    @Override
    protected boolean isUpdate(final Map<String, Object> data) throws Exception {
        Table table = new ArticleTable();
        boolean ret = this.isUpdate(table, data);
        return ret;
    }

    /**
     * データを新規追加します。
     * @param data ポストされたデータ。
     */
    @Override
    protected void insertData(final Map<String, Object> data) throws Exception {
        ArticleDao dao = new ArticleDao(this);
        this.setUserInfo(data); // 更新を行うユーザーIDを設定する.
        dao.insert(data);
    }

    /**
     * データを更新します。
     * @param data ポストされたデータ。
     */
    @Override
    protected void updateData(final Map<String, Object> data) throws Exception {
        ArticleDao dao = new ArticleDao(this);
        this.setUserInfo(data); // 更新を行うユーザーIDを設定する.
        dao.update(data);
    }

    /**
     * データを削除します。
     * @param data ポストされたデータ。
     */
    @Override
    public void deleteData(final Map<String, Object> data) throws Exception {
        ArticleDao dao = new ArticleDao(this);
        this.setUserInfo(data); // 更新を行うユーザーIDを設定する.
        dao.delete(data);
    }
}

ArticleDao.java

 ArticleTableをアクセスするためのクラスです。各種問い合わせやデータの追加、更新、削除のメソッドが生成されています。このソース内にArticleTableQueryというインナークラスが含まれています。このクラスは「select * from article」というSQLに相当する問い合わせクラスです。SQLを直接実行することもできますが、dataforms.jarではなるべくSQLを記述せず、Javaで記述していきます。こうすることで、接続したデータベースに応じたSQLが自動的に生成、実行されます。

ArticleDao.java
package bbs.dao;

    ・・・ 中略 ・・・

/**
 * Daoクラス。
 *
 */
public class ArticleDao extends Dao {
    /**
     * コンストラクタ。
     * @param obj JDBC接続可能オブジェクト。
     * @throws Exception 例外。
     */
    public ArticleDao(final JDBCConnectableObject obj) throws Exception {
        super(obj);
    }

    /**
     * QueryFormで指定した条件で行う問い合わせクラスです。
     */
    public static class ArticleTableQuery extends Query {
        /**
         * コンストラクタ。
         */
        public ArticleTableQuery() {
            Table table = new ArticleTable();
            this.setFieldList(table.getFieldList());
            this.setMainTable(table);
        }
    }

    /**
     * 問い合わせ結果フォームのフィールドリストを取得します。
     * @return 問い合わせ結果フォームのフィールドリスト。
     */
    public static FieldList getQueryResultFieldList() {
        Query query = new ArticleTableQuery();
        FieldList list = new FieldList();
        list.addField(new RowNoField());
        list.addAll(query.getFieldList());
        return list;
    }

    /**
     * QueryFormから入力された条件から、テーブルを検索し、指定されたページの情報を返します。
     * @param data 条件データ。
     * @param flist 条件フィールドリスト。
     * @return 検索結果。
     * @throws Exception 例外。
     */
    public Map<String, Object> queryPage(final Map<String, Object> data, final FieldList flist) throws Exception {
        Query query = new ArticleTableQuery();
        query.setQueryFormFieldList(flist);
        query.setQueryFormData(data);
        String sortOrder = (String) data.get("sortOrder");
        FieldList sflist = query.getFieldList().getOrderByFieldList(sortOrder);
        if (sflist.size() == 0) {
            query.setOrderByFieldList(query.getMainTable().getPkFieldList());
        } else {
            query.setOrderByFieldList(sflist);
        }
        return this.executePageQuery(query);
    }

    ・・・ 中略 ・・・

    /**
     * データを追加します。
     * @param data データ。
     * @return 追加件数。
     * @throws Exception 例外。
     */
    public int insert(final Map<String, Object> data) throws Exception {
        return this.executeInsert(new ArticleTable(), data);
    }


    /**
     * データを更新します。
     * @param data データ。
     * @return 更新件数。
     * @throws Exception 例外。
     */
    public int update(final Map<String, Object> data) throws Exception {
        // 楽観ロックチェック
        Table table = new ArticleTable();
        boolean ret = this.isUpdatable(table, data);
        if (!ret) {
            throw new ApplicationException(this.getPage(), "error.notupdatable");
        }
        // データ更新
        return this.executeUpdate(table, data);
    }

    /**
     * データを削除します。
     * @param data データ。
     * @return 削除件数。
     * @throws Exception 例外。
     */
    public int delete(final Map<String, Object> data) throws Exception {
//         return this.executeRemove(new ArticleTable(), data); // レコードの論理削除(DeleteFlagの設定)
        return this.executeDelete(new ArticleTable(), data); // レコードの物理削除
    }
}

次のページ
ページJavaクラス作成(2)

この記事は参考になりましたか?

特集記事連載記事一覧

もっと読む

この記事の著者

高柳 正彦(タカヤナギ マサヒコ)

経験年数30年を超えた、システムエンジニアです。一応管理職のはずですが、未だにコードを書いています。この仕事を長々とやっていると、それなりにノウハウがたまってきます。そのノウハウをまとめたものができないかと思い、独自のフレームワークを作り始めました。そのフレームワークもそれなりに使えるようになってき...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

CodeZine(コードジン)
https://codezine.jp/article/detail/10018 2017/05/15 14:00

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー