Before  Home  Next 


 scaffoldについて



1) はじめに

チュートリアルでは、WeberCreatorを使ったWeberアプリケーションの作成と実行までの 手順を解説してきました。
ここでは、WeberCreatorが生成したファイルの中身について解説していきたいと思います。


2) ディレクトリ構成

まずはチュートリアルで作成したディレクトリ構成から見ていきましょう。
チュートリアルで作成したディレクトリ構成は以下のようになっています。



WeberCreatorで雛形の生成を実行すると、以下のファイル、フォルダが生成されます。

  • css
  • Webページ全般で使用しているスタイルシートが入っています。

  • web-contents
  • Webページのルートフォルダです(設定により変更可能)。 web-contents配下に各種モジュールに対応したサブフォルダとHTMLファイルが含まれます。
    layoutフォルダとweberフォルダは他のサブフォルダとは少し意味合いが異なります。
    layoutフォルダは、HTMLのレイアウトを定義したコンテンツやヘッダー表示用コンテンツ、 フッダー表示用コンテンツが含まれます。
    weberフォルダには、ログイン、ログアウト用のコンテンツが含まれます。

  • ソースパッケージの下にあるデフォルトパッケージ
  • HTMLのレイアウトやアプリケーションの初期設定用 定義ファイルが入っています。

  • ソースパッケージの下にあるsampleパッケージ
  • WeberCreatorが生成したルートパッケージになります(設定により変更可能)。 sampleパッケージ配下に各種モジュールに対応したサブパッケージとクラスが含まれます。

  • ソースパッケージ以下の一番最下層にあるパッケージ
  • 各モジュール名(テーブル名を小文字に変換したもの)に相当します。


    ここで、Weber3.x以前を利用していた方なら、 アクションマッピング定義ファイル(weber-config.xml)が無いことに 気付かれるのでは無いでしょうか?

    アクションマッピング定義ファイルとは、UIであるHTMLやJSPファイルとアクションクラスとの紐付け を定義したファイルで、Weberフレームワークはこの定義ファイルの内容に沿って、リクエストに 対応するアクションクラスの呼出や画面遷移をコントロールしてきました。

    Weber4.0では、このアクションマッピング定義ファイルをベースとしたコントロールの考え方を 改め(もちろん従来のアクションマッピングベースのアプリケーションを構築することも可能です) 、ある一定のルールに従ったHTMLファイルとJavaクラスを作成することにより、 リクエストに対応するアクションクラスの呼出や画面遷移を自動で行うことができるように なりました。
    (いわゆる、定義よりも規約重視とか呼ばれるものです)

    たとえば、messageモジュールのクラスを見てみると以下のクラスが生成されています。



  • Message.java
  • フォームクラスです。 モジュール名(テーブル名の_スコアを除去し、頭文字を大文字に置き換えた)に相当するクラス がこれに該当します。

  • MessageDao.java
  • データアクセスクラスです。モジュール名に"Dao"をつけます。

  • MessageBaseAction.java
  • Messageモジュール共通のアクションクラスです。 モジュール名に"BaseAction"をつけます。

  • MessageDeleteAction.java,MessageSearchAction.java,MessageUpdateAction.java,MessageRegistAction.java
  • 各リクエストに対応するアクションクラスです。モジュール名に"リクエスト名(頭文字大文字)+Action" をつけます。
    たとえば、"・・・/message/delete.wb"といったリクエストが呼ばれた場合、対応するアクション として、MessageDeleteActionクラスが実行されます。

    WeberCreatorでは、それぞれ削除用(delete)、登録(regist)、更新(update)、検索(search)に 対応するWebページとアクションクラスを生成します。

    又、WeberCreatorが生成するWebページは全てHTML(XMLのヘッダ部を取り除いたXHTML形式)で 以下のようなコンテンツが作成されます。



  • message_menu.html
  • メニュー表示用のHTMLです。 Weberフレームワークがアプリケーション実行時に各HTMLの左ペインの一部として組み込みます。

  • message_regist.html,message_update.html, message_search.html
  • messageモジュールの各アクションの実行結果に対応するHTMLファイルです。
    モジュール名に"_+アクションの実行結果"をつけます。
    たとえば、messageモジュールのアクションの実行結果が"confirm(確認)"を返した場合、 "message_confirm.html"を表示します。

    3) メッセージ入力時の確認画面を追加する

    HTMLファイル、Javaソースの説明が終わったところで、今度は先ほど作成したメッセージ登録画面 に、確認画面を追加してみましょう。

    追加するHTMLファイルとJavaソースは以下の通りです。



    HTMLは、確認用の画面(message_confirm.html)を追加しました。
    又、確認用のアクションにはMessageConfirmAction.javaを追加しています。

    画面のイメージはこんな感じになります。


    メッセージ登録画面(見た目の変更はありません)



    メッセージ確認画面(メッセージ登録画面から"登録"ボタンを押下した場合)


    又、メッセージ確認画面を表示する前に、入力項目のチェックを行い、 ユーザ名などが入力されていなかった場合に、メッセージ登録画面に戻って エラーメッセージを表示するようにしてみます。


    メッセージ登録画面でユーザ名を入力しなかった場合



    それでは早速、HTMLソースとJavaソースを作成してみましょう・

    (1) message_confirm.html

    <html>
    <head>
    <title>メッセージ確認画面</title>
    <link rel="stylesheet" type="text/css" href="./../../css/stylesheet.css"/>
    </head>
    <body>
        <p><strong>メッセージ確認画面</strong></p><hr/>
        この内容で登録してよろしいですか?<br/>
        <form name="message_form" method="post" action="./web-contents/message/regist.wb">
            <input type="hidden" name="id" value="${message.id}"/>
            <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>ユーザ名(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>
        <p><a href="./../../index.html">Top</a></p>
    </body>
    </html>
    

    HTMLソースの記述は、XHTM形式である必要があります(くわしくはこちら をご参照下さい)。
    ただし、ヘッダ部の記述は省略可能です。


    メッセージ確認画面は、メッセージ登録画面で"登録"ボタンを押下したときに表示される画面 で、前画面で入力した内容が表示されます。
    実行ボタンあるいはキャンセルボタンを押下した場合は、message/regist.wbがPOSTされます。
    従って実行されるアクションはMessageRegistAction.javaになります。

    (2) MessageConfirmAction.java

    package sample.message;
    
    import java.util.List;
    import org.itscool.weber.action.Action;
    import org.itscool.weber.action.ActionBucket;
    import org.itscool.commons.dao.BaseDao;
    
    //登録画面で入力した内容をチェックします。
    //必須項目が入力されていない場合は"regist"を返します。
    //必須項目が全て入力されている場合は"success"を返します。
    public class MessageConfirmAction extends MessageBaseAction {
    	
    public String doValidate(ActionBucket bucket){
            boolean ret = true;
            if(!isNotNull("userName") ){
                //登録画面に出力するメッセージをセットしています。
                //第1引数は、任意のユニーク値をセットし、
                //第2引数に、出力するメッセージを指定してください。
                this.addErrorMessage("E0001", "ユーザ名を入力してください。");
                ret = false;
            }
            if(!isNotNull("subject") ){
                this.addErrorMessage("E0002", "サブジェクトを入力してください。");
                ret = false;
            }
            if(!isNotNull("contents") ){
                this.addErrorMessage("E0003", "コンテンツを入力してください。");
                ret = false;
            }
    
            //入力エラー時
            if( ret == false ){
                //外部参照データの一覧を取得
                CategoryDao categoryDao = new CategoryDao();
                Object categoryList = categoryDao.getAllData();
                bucket.setAttribute("categoryList", categoryList);
                //登録画面に戻る
                return "regist";
            }
            //メイン処理(doExecute())を実行する
            return "success";
        }

        /**
         * 確認画面を表示するために、メッセージ内容をセットしています
         * @param bucket ActionBucketインスタンス
         * @return 実行結果を返します(遷移先のファイル形式はモジュール名_実行結果.拡張子)
        */
        public String doExecute(ActionBucket bucket) throws Exception{
            Message bean = (Message)bucket.getForm();
            
            bucket.setAttribute("message", bean);
            
            return "confirm";
        }
    }

    MessageConfirmAction.javaはメッセージ登録画面で"登録"ボタン押下時に呼ばれるアクション です。
    doValidateメソッドは、メッセージ登録画面で入力された内容をチェックするための処理 でメイン処理(doExecuteメソッド)よりも先に実行されます。
    必須項目に入力されていない箇所が存在する場合は"regist"を返却し、メッセージ登録画面に 戻るよう指定しています。
    入力内容が全て正しい場合は"success"を返却します。
    この場合、次の処理"doExecuteメソッド"が実行されます。


    Actionクラスでオーバーライド可能なメソッドと実行順序について

    Actionクラスには、doValidate、doExecute以外に以下のメソッドをオーバーライドすること ができます。

     @ doInit( ActionBucket bucket ) throws Exception
       アクション開始前の初期化処理を実装します(任意)
     A doValidate( ActionBucket bucket ) throws Exception
       入力チェック処理を実装します(任意)
     B doExecute( ActionBucket bucket ) throws Exception
       メイン処理を実装します(必須)
     C doFinalize( ActionBucket bucket ) throws Exception
       アクションの終了処理を実装します(任意)


    (3) message_regist.html修正

    <!--
    <form name="message_form" method="post" action="./web-contents/message/regist.wb">
    -->
    <form name="message_form" method="post" action="./web-contents/message/confirm.wb">
    

    メッセージ登録画面(message_regist.html)のformタグを上記のように修正してください。
    これにより、メッセージ登録画面で"登録"ボタンを押下した場合は、"MessageRegistAction.java" ではなく、"MessageConfirmAction.java"が呼ばれるようになります。


    (4) MessageRegistAction.java修正

        public String doExecute(ActionBucket bucket) throws Exception{
            Message bean = (Message)bucket.getForm();
            
            //キャンセルが選択された場合の処理を追加
            if(bucket.getParameter("submit_cancel") != null){
                //登録画面に戻る
                bucket.setAttribute("message", bean);
                return "regist";
            }
            (以下略)
    

    メッセージ確認画面で"実行"ボタンが押されたのか、あるいは"キャンセル"ボタンが押下された のかを判定しています。
    キャンセルが押下場合は、"regist"を返却し、メッセージ登録画面に戻るよう指示しています。


    ここまでの作業が終了したら、ソースをコンパイル、デプロイし、動作を確認してみてください。


    Before  Home  Next