Before  Home  Next 


 新しいモジュールを追加する



1) はじめに

チュートリアルではメッセージテーブルからメッセージ管理機能を 生成する手順について解説してきました。
ここでは、Weberアプリケーションのテンプレート生成後、新しくモジュール(テーブル) を追加する手順について解説します。

今回は、以下のようなメッセージのカテゴリを保存するテーブルを追加してみたいと思います。




2) テーブル定義書の修正

まずはテーブル定義書を開いて、CATEGORYテーブルの定義を作成してみましょう。



又、チュートリアルで作成したMESSAGEテーブルを以下のように変更します。



ここではCATEGORYテーブルへの外部参照キーであるCATEGORY_IDフィールドを追加しています。
参照テーブル、及び参照キーにそれぞれCATEGORYテーブルと参照先のキーを指定しています。

テーブル定義書を修正後、上書き保存し、kick-hsql.batコマンドを実行します。
チュートリアルでは、"1 アプリケーションテンプレートの作成"を実行しましたが、 テンプレートは既に作成済みなので、今回は"4. モジュール作成"を選択します。
次に、追加するモジュール名を聞いてきます。
テーブル定義書に追加したCATEGORY(大文字/小文字どちらでも可)を入力し、 "Enter"を押下してください。



コマンド実行後、以下のファイルが生成されていることを確認してください。



又、テーブルの修正をデータベースに反映するために、"2 テーブルの作成/削除"を 実行してください。
(このコマンドを実行すると、既存のテーブルが削除され、テーブル定義書に定義された テーブルが新たに作成されます。)




3) メッセージモジュールの修正

次にメッセージ管理機能にカテゴリテーブルへの参照を追加します。
メッセージ管理機能にセキュリティ機能を追加したりして、元の雛形から 変更してしまっている場合に、WeberCreatorでメッセージモジュールの作成を行うと、 今までの変更分が上書きされてしまいます。
このような場合は、メッセージモジュール手で修正する必要があります。

修正するモジュールは以下の6つです。

  • Message.java
  • Categoryへの参照設定を追加します。

  • MessageDisplayRegistAction.java
  • Categoryの一覧を取得する処理を追加します。

  • MessageDisplayUpdateAction.java
  • Categoryの一覧を取得する処理を追加します。

  • message_regist.html
  • Categoryの一覧を表示するリストを追加します。

  • message_update.html
  • Categoryの一覧を表示するリストを追加します。

  • message_search.html
  • メッセージに関連のあるカテゴリ名を表示するセルを追加します。

    (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 static final String TABLE="BOOK";といったクラスに対応するテーブル名称が定義されていること
  • public static final String COLUM_userId="USER_ID";といったクラス のメンバに対応するテーブルのフィールド名が定義されていること
  • ("COLUM_"以降の文字列はフィールドと関連付けるプロパティ名を指定します)
  • プライマリーキーを指定する場合はPK_COLUM_プロパティ名で定義する

  • 外部参照テーブルを指定する場合は、FK_TABLE_外部参照先のオブジェクト名="外部参照テーブル名"と記述する
  • 外部参照キーを指定する場合はFK_COLUM_外部参照テーブルの情報を保持するオブジェクト名_プロパティ名で定義する

  • Ver4.0.5からはJavaBeansに指定するプロパティとカラムの関連を定義する定数(PK_COLUM_id、 COLUM_xxx)の指定が省略できるようになりました。
    (ただし、外部参照を指定する場合はFK_COLUMの指定は必須です。又、id以外の名前で プライマリキーを指定する場合もPK_COLUM_xxxの指定は必須です。)
  • 特定のプロパティをテーブルマッピングから除外したい場合はNO_MAP_COLUM_xxxを使用します。
  • 例)public static final NO_MAP_COLUM_property = "true"; //プロパティ"property"をテーブルマッピングから除外します。

    たとえば、次の関連を持つテーブルが存在する場合、


    以下のようなクラスを作成します。

    Categoryクラス
        public class Category{
            //テーブルマッピング情報の定義
            public static final String TABLE = "CATEGORY";
            //フィールドマッピング情報の定義
            public static final String PK_COLUM_id = "ID";
            ・・・
        }

    Messageクラス
        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マッピング機能には、以下の制限があります。

  • 関連の指定はOneToOne(MenyToOne)固定でOneToMany、ManyToManyは未対応
  • 外部参照キーで取得できるテーブルは1階層のみ。(lazzyやcasscade機能はありません)


  • (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プロパティが検索項目になります。

    ★ 検索項目optionに指定するkey_nameの値について
    ver4.0.4以前のWeberフレームワークでは、検索条件(key_name)の値にテーブルのカラム名を指定する 必要がありましたが、Weber4.0.5からJavaBeansのプロパティ名を指定するように変更しました。


    <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ページに戻って、"カテゴリ登録"を行ってください。


    メッセージ登録画面(カテゴリ未登録)


    カテゴリ登録画面


    カテゴリ登録結果

    カテゴリを登録した後、再度メッセージ登録画面に戻ると、登録したカテゴリの一覧が リストに表示されています。


    メッセージ登録画面(カテゴリ登録後)


    メッセージ登録結果



    Before  Home  Next