こんにちは。まっつんです。先日の自宅用に21.5インチの液晶ディスプレイを購入しました。今まで私が使ったことのある中で一番大きなディスプレイで、かなり快適な環境になりました:-)

それではApache Wicket(以下、Wicket)でユーザ登録アプリケーションを実装していきます。

MATSUFUJI Hideharu

プロジェクトの作成

まずはApache Maven(以下、Maven)を使ってプロジェクトを作成します。Eclipse上で [File]->[New]->[Project...] を選択します。次に Maven Project を選択します。Catalog:Nexus Indexer にして Filter:"wicket" と入力すると wicket-archetype-quickstart が表示されます。なお、今回から使用するWicketのバージョンを 1.4-rc2 に変更しています。

次に作成するプロジェクトの情報を以下のように入力します。

Groupd Idjp.iteman
Artifact Idregistration

作成されたプロジェクトのディレクトリ構造は以下のようになります。

quickstart-project.png

第1回wicket-example をビルドした方法を使って registration をビルドし、http://localhost:8080/registration/ にアクセスすると以下のページが表示されます。

quickstart-page.png

モデルとフォームの作成

それではユーザ登録アプリケーションを実装していきます。

まずはファイル名を以下のように適当なものに変更していくところからはじめます。

変更前変更後
WicketApplication.javaRegistrationApplication.java
HomePage.javaFormPage.java
HomePage.htmlFormPage.html

WicketPOJO(Plain Old Java Object) でモデルを作成できることをウリのひとつにしているので今回は POJO でモデルを作成します。

public class User implements Serializable {
    private static final long serialVersionUID = -1302937101491192308L;

    private String firstName;
    private String lastName;

    public String getFirstName() {
        return firstName;
    }

    public void setFirstName(String firstName) {
        this.firstName = firstName;
    }

    public String getLastName() {
        return lastName;
    }

    public void setLastName(String lastName) {
        this.lastName = lastName;
    }
}

Userクラス はプロパティに firstName, lastName を持つクラスです。ただしシリアライズできるように Serializableマーカーインターフェース を実装しておく必要があります。次に Userクラス を使って、登録フォームを作成します。

public class FormPage extends WebPage {
    ...
    private User user;

    public FormPage(final PageParameters parameters) {
        user = new User();
        PropertyModel<String> firstNameModel = new PropertyModel<String>(user, "firstName");
        PropertyModel<String> lastNameModel = new PropertyModel<String>(user, "lastName");

        Form<?> form = new Form("form");
        form.add(new TextField<String>("firstName", firstNameModel));
        form.add(new TextField<String>("lastName", lastNameModel));
        add(form);
    }
}

PropertyModelクラス 使って、モデルとフォームの関連付けを行っています。ソースの確認はしていませんが、おそらくリフレクションを使ってモデルのプロパティにアクセスしているのでしょう。

この段階でビルドを行うと失敗してしまいました。WicketにはWebアプリケーションクラス(今回は RegistrationApplicationクラス )を利用してビューなどのテストができる機能が用意されており、このテストがビルド時に実行されて失敗していたのが原因です。この機能はいろいろな活用方法がありそうですが、今回は放っておくことにします。

テストの内容を削除して再びビルドを行うと、今度はApache Tomcatが起動しません。開発環境では target ディレクトリ以下にWebアプリケーションがデプロイされるのですが、クラス名変更前のクラスが残っていたので、それを削除してリトライ。しかし失敗orz

ログを見てみると jp.iteman.registration.WicketApplication というクラスが見つからないのが原因のようです。target/registration-0.0.1-SNAPSHOT/WEB-INF/web.xml にある記述を jp.iteman.registration.RegistrationApplication に変更しリトライ。ようやく起動することができました:-)

Wicketのウィザード

次に確認ページに遷移させるわけですが、Wicketではウィザード形式のアプリケーションを実装するために org.apache.wicket.extensions.wizard パッケージ(以下、Wizardパッケージ)が用意されています。このパッケージはエクステンションとして提供されているので、まずはWicketのエクステンションを利用できるようにしましょう。

Wicketのエクステンションは pom.xml の以下の記述のコメントをはずすことで利用できるようになります。

<dependency>
    <groupId>org.apache.wicket</groupId>
    <artifactId>wicket-extensions</artifactId>
    <version>${wicket.version}</version>
</dependency>

これでWizardパッケージが使えるようになったわけですが、使い方がさっぱりわかりません。仕方がないので前回封印した abacadabra を見てみることにします。その結果、以下の構造が見えてきました。

wicket-wizard.png
  • Wizard クラスは WizardModel クラスの初期化とウィザードの終了時のイベントを処理します。
  • WizardModelクラス はウィザードの各ページを担当する WizardStepクラス を管理します。
  • WizardStepクラス には対応するテンプレートファイルが必要です。テンプレートファイルはHTMLの断片であり、レイアウトファイルに埋め込まれます。これはPiece_Unityのレイアウト機能と同じですね。

まとめてみると理解しやすい構造になっているのですが、調べるのが結構大変でした。Wicketは比較的ドキュメントが揃っているのですが、古いバージョンが対象になっているため注意が必要です。

というわけで、今回はここまで。次回は完結編をお届けします。

トラックバック(0)
  • このブログ記事のトラックバックURL:
コメント