1) はじめに
チュートリアルではメッセージテーブルからメッセージ管理機能を
生成する手順について解説してきました。
ここでは、Weberアプリケーションのテンプレート生成後、新しくモジュール(テーブル)
を追加する手順について解説します。
今回は、以下のようなメッセージのカテゴリを保存するテーブルを追加してみたいと思います。
2) テーブル定義書の修正
まずはテーブル定義書を開いて、CATEGORYテーブルの定義を作成してみましょう。
又、チュートリアルで作成したMESSAGEテーブルを以下のように変更します。
ここではCATEGORYテーブルへの外部参照キーであるCATEGORY_IDフィールドを追加しています。
参照テーブル、及び参照キーにそれぞれCATEGORYテーブルと参照先のキーを指定しています。
テーブル定義書を修正後、上書き保存し、kick-hsql.batコマンドを実行します。
チュートリアルでは、"1 アプリケーションテンプレートの作成"を実行しましたが、
テンプレートは既に作成済みなので、今回は"4. モジュール作成"を選択します。
次に、追加するモジュール名を聞いてきます。
テーブル定義書に追加したCATEGORY(大文字/小文字どちらでも可)を入力し、
"Enter"を押下してください。
コマンド実行後、以下のファイルが生成されていることを確認してください。
又、テーブルの修正をデータベースに反映するために、"2 テーブルの作成/削除"を
実行してください。
(このコマンドを実行すると、既存のテーブルが削除され、テーブル定義書に定義された
テーブルが新たに作成されます。)
3) メッセージモジュールの修正
次にメッセージ管理機能にカテゴリテーブルへの参照を追加します。
メッセージ管理機能にセキュリティ機能を追加したりして、元の雛形から
変更してしまっている場合に、WeberCreatorでメッセージモジュールの作成を行うと、
今までの変更分が上書きされてしまいます。
このような場合は、メッセージモジュール手で修正する必要があります。
修正するモジュールは以下の6つです。
(1) Message.javaの修正
public class Message{
・・・
//フィールドの定義
public static final String COLUM_categoryId = "CATEGORY_ID";
//外部参照キーの定義
public static final String FK_TABLE_category = "CATEGORY";
public static final String FK_COLUM_category_categoryId = "ID";
//CATEGORY_IDに対応するメンバ
private int categoryId;
//親テーブルへの参照
private Category category;
・・・
}
MessagreとCategoryのリレーションを定義しています。
MessageクラスはPOJOなクラスでMessageクラスのstaticフィールドにMESSAGEテーブルに対応する
フィールド情報を定義していきます
WeberフレームワークのORマッピング機能を使用する場合、
POJOクラスを以下のルールで作成する必要があります。
public class Category{
//テーブルマッピング情報の定義
public static final String TABLE = "CATEGORY";
//フィールドマッピング情報の定義
public static final String PK_COLUM_id = "ID";
・・・
}
public class Message{
・・・
//フィールドの定義
public static final String COLUM_categoryId = "CATEGORY_ID";
//外部参照キーの定義
public static final String FK_TABLE_category = "CATEGORY";
public static final String FK_COLUM_category_categoryId = "ID";
//CATEGORY_IDに対応するメンバ
private int categoryId;
//親テーブルへの参照
private Category category;
・・・
}★ ORマッピングの制限事項
WeberのORマッピング機能には、以下の制限があります。(2) MessageDisplayRegistAction.java(MessageDisplayUpdateAction.java)の修正
次にアクションクラスを修正します。
public String doExecute(ActionBucket bucket) throws Exception{
・・・
//外部参照データの一覧を取得
CategoryDao categoryDao = new CategoryDao();
List categoryList = categoryDao.getAllData();
bucket.setAttribute("categoryList", categoryList);
・・・
}
MessageDisplayRegistAction.java(MessageDisplayUpdateAction.java)のdoExecuteメソッドに 登録画面(更新画面)を表示するときのカテゴリの一覧を取得する処理を追加しています。
(3) message_update.html(message_regist.html)の修正
<p>カテゴリID(categoryId)
<select name="categoryId">
<span w_kind="iterate" w_id="category" w_name="categoryList">
<option w_value="${message.categoryId}" value="${category.id}">${category.name}</option>
</span>
</select>
</p>
登録画面(更新画面)にカテゴリの一覧を選択するリストを追加しています。
(4) message_search.htmlの修正
メッセージ一覧画面を修正します。
修正箇所は2箇所あります。
検索項目:
<select name="key_name" w_name="key_name">
<option w_value="{$key_name}" value="id">ID(ID)</option>
<option w_value="{$key_name}" value="userName">ユーザ名(USER_NAME)</option>
<option w_value="{$key_name}" value="subject">サブジェクト(SUBJECT)</option>
<option w_value="{$key_name}" value="contents">内容(CONTENTS)</option>
<option w_value="${key_name}" value="category.name">カテゴリ(CATEGORY)</option>
</select>
検索条件に"カテゴリ"を追加しています。
optionタグのvalue値は、検索条件の項目としてJavaBeansのプロパティを記述します。
category.nameのように記述した場合、Categoryクラスのnameプロパティが検索項目になります。
<table border="1" cellspacing="1" cellpadding="1" width="100%">
<tr>
<td>ID</td>
<td>ユーザ名</td>
<td>サブジェクト</td>
<td>内容</td>
<td>カテゴリ</td>
<td>編集</td>
<td>削除</td>
</tr>
<span w_kind="iterate" w_id="one_message" w_name="message_list">
<tr>
<td>${one_message.id}</td>
<td>${one_message.userName}</td>
<td>${one_message.subject}</td>
<td>${one_message.contents}</td>
<td>${one_message.category.name}</td>
<td><div onclick="window.location.assign(
'display_update.wb?submit_update=true&id=${one_message.id}');">
<u>編集</u>
</div>
</td>
<td><div onclick="if( confirm('削除しますか?') ) window.location.assign(
'delete.wb?id=${one_message.id}');">
<u>削除</u>
</div>
</td>
</tr>
</span>
</table>
メッセージ照会画面に"カテゴリ"を表示するためのセルを追加しています。
(6) message_confirm.htmlの修正
前のチュートリアルで"メッセージ確認画面"を作成している方は、以下の修正が必要です。
<form name="message_form" method="post" action="./web-contents/message/regist.wb">
<input type="hidden" name="id" value="${message.id}"/>
<input type="hidden" name="categoryId" value="${message.categoryId}"/>
<input type="hidden" name="userName" value="${message.userName}"/>
<input type="hidden" name="subject" value="${message.subject}"/>
<input type="hidden" name="contents" value="${message.contents}"/>
<p>カテゴリ(categoryName):${message.category.name}</p>
<p>ユーザ名(userName) :${message.userName}</p>
<p>サブジェクト(subject) :${message.subject}</p>
<p>内容(contents) :${message.contents}</p>
<p>
<input type="submit" nanme="submit_regist" value="実行"/>
<input type="submit" name="submit_cancel" value="キャンセル"/>
</p>
</form>
(7) MessageConfirmAction.javaの修正
前のチュートリアルで"メッセージ確認アクション"を作成している方は、以下の修正が必要です。
public class MessageConfirmAction extends MessageBaseAction {
public String doExecute(ActionBucket bucket) throws Exception{
Message bean = (Message)bucket.getForm();
//-----------------------------------------------------
//カテゴリを取得し、Messageオブジェクトにセットします
//-----------------------------------------------------
//カテゴリID取得
int categoryId = bean.getCategoryId();
//検索条件の作成
Category searchData = new Category();
searchData.setId(categoryId);
//DAOクラス生成
CategoryDao dao = new CategoryDao();
//プライマリキーの入ったCategoryオブジェクトでカテゴリ情報を取得
Category category = dao.getCategory(searchData);
//カテゴリ情報をMessageオブジェクトにセット
bean.setCategory(category);
bucket.setAttribute("message", bean);
return "confirm";
}
}
(8) 動作確認
ここまでの修正が終わったら、コンパイルして実行してみましょう。
残念ながら、修正前に作成したデータは、テーブルを再作成したときに消えてしまっていますので、
再度、Web画面から登録しなおしてください。
尚、WeberCreatorには、初期データをテーブルに登録するための機能がありますので、
あらかじめ、必要なデータをWeberCreatorに登録しておくことをお勧めします。
くわしくはこちらをご参照下さい。
メッセージ登録画面を表示すると、"カテゴリ"を選択するリストが追加されていますが、
中身が空の状態です。
INDEXページに戻って、"カテゴリ登録"を行ってください。
カテゴリを登録した後、再度メッセージ登録画面に戻ると、登録したカテゴリの一覧が リストに表示されています。