Home > プログラミング > [Wicket修行日記:9]ExampleGuestBook

[Wicket修行日記:9]ExampleGuestBook

Wicket修行日記目次

今回は次のExampleを勉強しました。
Apache Wicket - GuestBook

このアプリケーションはいわゆるゲストブック、つまり簡易掲示板です。
試しに使ってみたい方は以下のページにアクセスしてください。(書き込みが荒れまくってますがw)
http://wicketstuff.org/wicket13/guestbook/

それでは、このアプリケーションを実際に動かしてみてわかったことを書いていきます。

Commentクラス

このクラスは、「1つ」のコメントが保持するデータを表すクラスです。
データとして、コメント文字列と投稿された(オブジェクトが生成された)日付を保持します。

いわゆる「POJO(Plain Old Java Object)」と呼ばれるもので、単に属性を定義しただけのクラスになっています。

今回の例では、簡略化のため属性は全てPublicとして定義されているので、Setterメソッド(setXXX())やGetterメソッド(getXXX())は必要ありません。

また、シリアライズ可能にするためにSerializableインタフェースを実装する必要があるみたい。

フォームの生成

コメントなどのデータを投稿出来るようにするためには、もちろん出力されるhtmlページにフォームが設置されている必要があります。

Wicketでは、htmlのフォームに対応するコンポーネントとしてFormコンポーネントが用意されているようです。

今回の例では、GuestBookクラスのコンストラクタでFormコンポーネントを継承したCommentFormコンポーネントがaddされています。

public GuestBook() {
	add(new CommentForm("commentForm"));

これにより、GuestBook.htmlの以下の部分が、Wicketに対して適切な情報をPOST出来るように書き換えられます。

Add your comment here:

ListViewコンポーネント

ListViewコンポーネントは、複数存在する同じタイプの情報を、簡単に画面上に表示するためのコンポーネントです。

GuestBookクラスのコンストラクタで以下のようにaddされています。

add(commentListView = new ListView("comments", commentList)

これにより、GuestBook.htmlの以下の部分にコメントリストが表示されるようになります。(「comments」という文字列で対応)


1/1/2004
Comment text goes here.

また、ListViewクラスを継承する無名インナークラスによってpopulateItemメソッドがオーバーライドされています。
このメソッドはListViewを構成する一つ一つの要素(今回の場合は一つ一つのコメント)それぞれに対して何回も呼び出されるようです。

ここでは、ListItemという型に抽象化されたオブジェクトをCommentクラスの型にキャストし、コメント本文、投稿日時をそれぞれLabelコンポーネントに文字列として格納し、addしています。

public void populateItem(final ListItem listItem) {
	final Comment comment = (Comment)listItem.getModelObject();
	listItem.add(new Label("date", comment.date.toString()));
	listItem.add(new MultiLineLabel("text", comment.text));
}

ここで新しく、MultiLineLabelコンポーネントが登場していますが、これはその名の通り複数行表示が可能なラベルです。
フォームで入力された改行を、brタグに直してから出力してくれます。

CommentFormクラス

CommentFormクラスはFormコンポーネントを継承するインナークラスです。
フォームの詳細な動作を定義しています。

コンストラクタの中でTextAreaコンポーネントをaddしています。

public CommentForm(final String componentName) {
	super(componentName);
	add(new TextArea("text", new PropertyModel(comment, "text")));
}

このTextAreaコンポーネントはGuestBook.htmlの以下の部分に対応づけられます。


ここでミソとなるのが、TextAreaクラスのコンストラクタにおける第2引数です。
PropertyModelクラスのオブジェクトが渡されています。

PropertyModelクラスは、フォームで入力された文字列がどこに格納されるか、ということを定めるためのもののようです。
このテキストエリアで入力されるのはコメントの本文であるため、「comment」オブジェクトの「text」という属性に、受け取った文字列を格納するように指定されています。

CommentFormクラスのonSubmitメソッド

このメソッドは、フォームのSubmitボタンが押された時に呼び出されるものです。

public final void onSubmit() {
	final Comment newComment = new Comment();
	newComment.text = comment.text;
	
	commentList.add(0, newComment);
	commentListView.modelChanged();
		
	comment.text="";
}

単純に、新しくCommentクラスのオブジェクトを生成し、フォームから受け取ったコメント本文を生成したオブジェクトにセットしています。

先ほどのPropertyModelクラスのおかげで、「comment」オブジェクトには常に最新のデータ(つまりSubmitボタンを押したときにテキストエリアに入力されていたデータ)が格納されているみたいです。
これは簡単でいいですねーー!

その後、commentListオブジェクトに新しいコメントをaddしています。
commentListオブジェクトはGuestBookクラスのstaticフィールドとして定義されています。

/** Use a Vector, as it is synchronized. */
private static final List commentList = new Vector();

このようにstaticフィールドとして定義されているので、投稿があるたびにGuestBookのオブジェクトがたくさん生成されても、それらのオブジェクト間でデータを共有することができます。
これはJavaの一般的なお話ですね!

最後に、commentListViewオブジェクトのmodelChangedメソッドが呼び出されています。
これは、ListViewに対して、データの更新が行われたことを通知するためのメソッドのようです。

wicket:removeタグ

GuestBook.htmlに以下のような箇所があります。


1/2/2004
More comment text here.

この部分は、実際に出力されるhtmlファイルには出力されません。

コメント的な使い方を目的としたタグのようです。

まとめ

今回もとても長くなってしまいました。

少しずつですがWicketのこと解ってきたような気がします。

基本はadd!
JavaのGUIアプリケーションを作る感覚でWebアプリが作れてしまう、というイメージでしょうか。

すばらしいWicket!
次回も頑張ります!

Comments:1

やす 2008年3月16日 17:48

http://yasunoritomokosyuuzi.blog110.fc2.com/

ブログ始めました。もしよかったら見に来て下さい。

Comment Form

Trackbacks:0

TrackBack URL for this entry
http://www.kadoppe.net/mt/mt-tb.cgi/149
Listed below are links to weblogs that reference
[Wicket修行日記:9]ExampleGuestBook from CreativeStyle

Home > プログラミング > [Wicket修行日記:9]ExampleGuestBook

Search
Feeds
Blog Parts

あわせて読みたい フィードメーター - CreativeStyle この日記のはてなブックマーク数 kadoppeさんの体重グラフ

Return to page top