• D言語によるWebアプリの実装 その5

    2011年11月01日 20時41分
    前回の続き

    ブラウザでデータベースのデータを表示することが出来たので、
    次はブラウザからデータベースにデータを入れる方法です。


    今回のソース


    フォームオブジェクトの作成

    ブラウザからデータベースにデータを入れるには、
    フォームを作成してアプリに入力データを渡す必要があります。

    jp.ku6.bbs.form.ThreadBuildFrom.ThreadBuildFromがアプリでフォームを扱うためのクラスです。
    フォームとその部品クラスを利用して作成されており、
    送信されたフォームデータの管理、フォームの表示を行います。


    使用するフォームは、テキスト入力欄が3つと、送信ボタンが1つという構成とします。
    1class ThreadBuildFrom : Form
    2{
    3    /// スレッドタイトル
    4    TextInputField title;
    5
    6    /// >> 1の名前
    7    TextInputField name;
    8
    9    /// >> 1の内容
    10    TextInputField content;
    11
    12    /// 送信ボタン
    13    SubmitField submit;



    コンストラクタで基本設定を行っています。
    テンプレート上のs:idで使用するIDと、formタグのaction属性に設定するURLを指定します。
    1// テンプレートで使用するIDと、actionのURLを設定する
    2super("threadBuildForm", APPLICATION_ROOT_URI ~ "/ThreadBuild.html");



    次に各部品を作成しています。
    こちらもs:idで使用するID(リクエストパラメータ名にも使われます)と、
    表示用の名称を指定しています。
    表示用の名称はエラーメッセージ表示などに使用します。
    1title = new TextInputField(this"title""タイトル");



    入力用の部品には、Validator(入力チェック)とConverter(入力変換)を指定できます。
    ここではValidatorのみ、必須入力チェックと、最大長チェックを指定しています。
    1new RequiredValidator(title, REQUIRED_VALIDATOR_MESSAGE);
    2new MaximumLengthValidator(title, MAXLENGTH_VALIDATOR_MESSAGE, 256);

    指定の書き方がイマイチですが、部品と入力チェックを関連付けるためこのような書き方になっています。


    フォームの表示

    jp.ku6.bbs.view.ThreadBuildView.ThreadBuildViewクラスがフォーム画面の表示処理です。

    先ほど作成したThreadBuildFromをテンプレートエンジンに登録します。
    基となっているフォームと部品クラスが、テンプレートエンジンの拡張機能なので、簡単に登録することができます。
    1form_.assignToSweets(contents_);



    テンプレート上では、フォーム生成時に指定したIDを使います。
    <form s:id="threadBuildForm">


    各部品も同様です。
    <input s:id="title" type="text"/>


    部品に指定したValidatorはエラーメッセージを出力する場合があります。
    発生したエラーメッセージの配列は、s:idが'部品のID + Errors'で設定されます。
    また、個々のエラーメッセージは、s:idが'部品のID + Error'で設定されます。
    これを使い、エラーメッセージ表示は次のように記述します。
    <span s:id="titleErrors" class="errors"><span s:id="titleError"/><br /></span>



    送信されたフォームデータの受け取り

    jp.ku6.bbs.action.ThreadBuildAction.ThreadBuildActionが送信されたフォームデータの受け取り処理です。

    リクエストが来たら、フォームオブジェクトにデータを読み込ませます。
    1string execute(Request request, Response response)
    2{
    3    // リクエストオブジェクトからフォームのデータを読み出し
    4    form_.loadFromRequest(request);



    読み込み後、submitボタンオブジェクトを参照し、ボタンが押されたかを判定します。
    ボタンが押されているならばフォームの送信、
    そうでなければ他画面からのリンクによる遷移と判断します。
    リンクによる遷移の場合は、画面表示のためフォームをクリアしています。
    1if (!form_.submit.isSubmitted)
    2    form_.reset(); // フォームを初期化



    フォームの送信の場合は、Validatorでエラーが発生していないか確認します。
    エラーがあった場合は入力フォームを再度表示します。
    1if (!form_.hasError())



    エラーが無い場合は、入力されたデータをデータベースに保存します。
    各部品の入力値は、valueで参照します。
    1form_.title.value



    保存後はスレッド一覧ページにリダイレクトしています。
    1if (!form_.hasError())
    2{
    3    // 送信されたデータをデータベースに登録
    4    logic_.buildThread(form_.title.value, form_.name.value, form_.content.value);
    5
    6    // 一覧ページにリダイレクト
    7    response.redirect = APPLICATION_ROOT_URI ~ "/ThreadList.html";
    8
    9    return null;
    10}



    データベースへの保存

    前回と同様にSQLを発行するだけとなりますが、
    今回は実行するSQLに値を設定する必要があります。

    jp.ku6.bbs.dao.ResponseDao.ResponseDaoクラスにある処理を例にしますと、
    SQLに?を使ってプレースホルダを指定します。
    1insert_ = new Statement("INSERT INTO responses(id, thread_id, name, content, registered) VALUES(?, ?, ?, ?, ?)", transaction);


    そして、executeする前に、各プレースホルダに値を設定します。
    1statement.set(0u, entity.id);
    2statement.set(1u, entity.threadId);
    3statement.set(2u, entity.name);
    4statement.set(3u, entity.content);
    5statement.set(4u, entity.registered);
    6statement.execute();



    実行

    スタイルシート、テンプレートファイル、実行ファイルを更新してください。
    テンプレートファイルについては、フォーム画面のテンプレートも追加になっています。



    次回へ続く

    コメントを書く

    名前
    本文
    編集用パスワード 入力すると編集が行えます
    管理者のみ閲覧