ページJavaクラス作成(1)
開発ツールを使ったページクラスの作成
次に開発ツールの[ページJavaクラス作成]を使用してページクラスを作成します。このツールを使うとQueryForm、QueryResultForm、EditFormの3種類のフォームを配置したページクラスを作ることができます。これらのフォームを全て配置すれば、QueryFormで入力された検索条件で検索した結果をQueryResultFormに一覧表示し、一覧から選択したレコードをEditFormで編集するようなページを自動生成することができます。ページには常に3種類のフォーム全てを配置するわけではありません。会員登録ページのように必要な情報を入力し、それを追加していくだけのページの場合はEditFormのみ配置することになります。また、EditFormを配置しないで、検索条件を入力し、一覧を表示するだけのページというのもあり得ます。1からコードを書く必要がありますが、Formクラスから派生した特殊なフォーム作成してページに配置することも可能です。
記事管理ページの場合、この3種類のフォームを全て配置します。ページ作成時には編集対象のテーブルを1種類だけ指定することができます。今回はArticleTableのみを指定します。以下のように情報を入力し、ページを構築する各種クラスを生成します。
作成された各種クラスの解説
上記の操作で、以下のファイルが作成されます。
| パッケージ | クラス | 備考 |
|---|---|---|
| bbs.page | ArticlePage.java | 記事管理ページクラス |
| ArticleQueryForm.java | 検索条件フォームクラス | |
| ArticleQueryResultForm.java | 検索結果フォームクラス | |
| ArticleEditForm.java | 編集フォームクラス | |
| bbs.dao | ArticleDao.java | 記事テーブルのデータアクセスオブジェクトクラス |
ArticlePage.java
ページクラスは以下のように生成されます。コンストラクタで3種類のフォームが配置されています。
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は配置されていません。
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は、問い合わせ結果のリストからデータを削除する場合に呼び出されるメソッドになります。
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中のフィールド全てをフォームに配置しています。コンストラクタ以外のコードは、データの取得メソッドやデータの追加、更新メソッドなどです。
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が自動的に生成、実行されます。
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); // レコードの物理削除
}
}
