Wicketで始めるオブジェクト指向ウェブ開発

第3回 WicketでTwitterアプリケーションを作る(前編)

この記事を読むのに必要な時間:およそ 5 分

バリデータとモデルの関係

Wicketのバリデータは,モデルに対して重要なことを保証しています。それは,コンポーネントに適用されたすべてのバリデータ,フォームバリデータの検証をパスしない限り,モデルには絶対にデータが渡されないということです。モデルに値が渡されたということは,検証は絶対にパスしているのです。

この保証はプログラムを分かりやすくします。モデルに渡されてプログラムからアクセス可能となったユーザ入力値が,データとして正しいものなのかどうか,気にする必要はありません。その検証を行うのはバリデータの仕事であり,独自の検証をしたいのならば,独自のバリデータを作成すればよいのです。

Wicketは定義ファイルを使わず,すべてをプログラムから行います。バリデータもコンポーネントやモデルのように自由に作成することができます。フォームバリデータを使えば複雑な検証も思うがままです。

逆に,この保証を活用するために,あなた自身も「検証はバリデータで行う」というルールを守るのが重要です。役割を綺麗に分けることで,プログラムは分かりやすくなります。また,バリデータというオブジェクトにまとめることで,検証機能を再利用することも可能となります。

検証失敗の通知

バリデータが入力データの検証をしてくれるといっても,検証が失敗したことが分からなければ,ユーザもプログラマも困ります。

バリデータの検証失敗内容を画面に表示するのは簡単です。Wicketには検証失敗はもちろん,あなたがユーザに通知したい情報を簡単に表示するためのコンポーネントとして,FeedbackPanelが用意されています。

次のようにFeedbackPanelをページ上に貼っておくだけで,バリデータによる検証が失敗したとき,FeedbackPanel内に情報が表示されます。

リスト4 FeedbackPanelの適用

add(new FeedbackPanel("feedback"));

FeedbackPanelは空の<div>要素に適用するのが一般的です。メッセージは全て<div>の内側に出力されます。

Wicketは,標準バリデータでの検証エラーについては,日本語を含めて多くの言語向けメッセージファイルを既に持っています。FeedbackPanelをページに適用しておくと,これらの標準メッセージが表示されます。たとえば,PatternValidatorに指定した正規表現にマッチしない入力を行うと,サンプルプログラムは次のようにエラーを表示します。

図3 PatternValidatorの検証エラー表示

図3 PatternValidatorの検証エラー表示

フォームのサブミットを受け付ける

Webアプリケーションでは,ユーザの入力はHTMLフォームがサブミットされてはじめて,Webアプリケーションに通知されます※2⁠。Wicketでも例外ではなく,サブミットボタンがクリックされてはじめて,Wicketに通知がされます。

Wicketにおけるサブミット後処理の書き方はシンプルです。サブミットは<input type="submit">ボタンがクリックされることで行われます。ならば,<input type="submit">タグにコンポーネントを適用することで,タグを制御できるようにすればいいのです。

Wicketがサブミットボタンを制御するために用意しているコンポーネントが,Buttonクラスです。ButtonクラスにはonSubmit()というメソッドがあり,ユーザがブラウザ上のボタンをクリックすると,WicketはそれをonSubmit()メソッドの呼び出しへと変換します。プログラマはただ,ButtonオブジェクトのonSubmit()メソッドをオーバーライドし,ボタンがクリックされたときの動作を記述すればよいのです。

リスト5 サブミットボタンのクリック時に動作するプログラムを書く

Button submit = new Button("login") {
  @Override
  public void onSubmit() {
    //ここにボタンをクリックしたときのプログラムを書く
  }
};

Wicketでは,このコード例のように,匿名サブクラス記法を使って「その場で」サブクラスを生成してオーバーライドを行う,という手法を多く使用します。実際のところ,そのように書くことを前提にしてフレームワークが作られている面もあります。コンポーネントのふるまいを変更するときにいちいち別クラスとして作らなければいけないのでは面倒です。匿名サブクラス記法では,気軽にサブクラスを作ることができます。デスクトップ・アプリケーション作成で多用されるこの手法を,Wicketはうまく取り込んでいます。

前述したように,Wicketはすべてのバリデータをパスしない限り,モデルへデータを渡しません。ButtonのonSubmit()メソッドは,モデルへのデータ引き渡し完了後に呼び出されます。

onSubmit()が呼び出されたときには,すでに入力値は検証済みであることが保証されているということです。そのため,いきなり入力値を使い始めてもかまいません。

※2
もちろんAjaxを使って入力時に通知をおくることは可能ですが,ここでは従来式のWebアプリケーションについて書いています。WicketにおけるAjaxサポートについては,もっと後の回でご紹介します。

ユーザセッションを使って,ページをまたぐ情報を保存する

サブミットの受け付け方法が分かったので実際にonSubmit()を実装してTwitterにログインする処理を記述したいところですが,サンプルプログラムのコードを理解するには,Wicketにおけるユーザセッションの取り扱いについて解説しておく必要があります。

次回は,Wicketがユーザセッションをプログラム可能なオブジェクトとして扱うことを説明し,ログイン画面を完成させます。

著者プロフィール

矢野勉(やのつとむ)

フリーランスのプログラマ。Wicket-ja主催。

ウェブ・アプリケーションの開発を中心にさまざまな案件に関わってきました。現在はWicketによる開発を支援しています。

URLhttp://d.hatena.ne.jp/t_yano/

著書