SHOEISHA iD

※旧SEメンバーシップ会員の方は、同じ登録情報(メールアドレス&パスワード)でログインいただけます

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

Javaで軽快に使える「軽量フレームワーク」特集

Javaで軽快に使える「軽量フレームワーク」特集
~Apache Wicketで簡単Webアプリ作成(3)

第3回


  • X ポスト
  • このエントリーをはてなブックマークに追加

ログインページの変更

 以上のように、wicket-auth-rolesを使うと、ほとんどの機能が自動生成されてすぐに使えるようになります。しかし、こうしたできあいのものでなく、独自に実装をしたいと思うこともあるでしょう。こうしたときには、独自に定義した機能を追加して利用することもできます。

 例として、ログインページを独自定義のWebページに変更してみましょう。先ほど作成した「SignInPage.html」と「SignInPage.java」を書き換えてみることにします。

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
    "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type"
            content="text/html; charset=utf-8">
        <title>Sign in</title>
        <link rel="stylesheet" type="text/css" href="style.css">
    </head>
    <body>
        <h1>Sign in Page.</h1>
        <p>※ユーザー名とパスワードを入力してください。</p>
        <div wicket:id="error"></div>
        <table>
            <form wicket:id="form">
            <tr><td>USER:</td></tr>
            <tr><td><input type="text" wicket:id="username"></td></tr>
            <tr><td>PASSWORD:</td></tr>
            <tr><td><input type="password" wicket:id="password"></td></tr>
            <tr><td></td></tr>
            <tr><td><input type="submit" wicket:id="submit1"></td></tr>
            </form>
        </table>
    </body>
</html>

 ここでは、"username""password"という2つの入力フィールドと送信ボタンを用意しています。違いが分かるよう、若干レイアウトを変えておきました。WebPageクラスは、通常のWebPageを継承して作成します。

package jp.tuyano;

import org.apache.wicket.markup.html.WebPage;
import org.apache.wicket.markup.html.form.*;
import org.apache.wicket.markup.html.panel.FeedbackPanel;
import org.apache.wicket.model.*;
import org.apache.wicket.util.value.ValueMap;

public class AuthSignInPage extends WebPage {
    private CompoundPropertyModel<WebPage> formModel;
    private TextField<String> username;
    private PasswordTextField password;
    private final ValueMap properties;
    
    public AuthSignInPage(){
        properties = new ValueMap();
        this.add(new FeedbackPanel("error"));
        formModel = new CompoundPropertyModel<WebPage>(this);
        Form<WebPage> form1 = new Form<WebPage>("form",formModel);
        username = new TextField<String>("username",
                new PropertyModel<String>(properties,"username"));
        form1.add(username);
        password = new PasswordTextField("password",
                new PropertyModel<String>(properties,"password"));
        form1.add(password);
        Button submit = new Button("submit1"){
            private static final long serialVersionUID = 1L;

            @Override
            public void onSubmit() {
                submitNow();
            }};
        form1.add(submit);
        this.add(form1);
    }
    
    public void submitNow(){
        AuthApp app = (AuthApp)this.getApplication();
        AuthAppSession session = (AuthAppSession)this.getSession();
        boolean flg = session.authenticate(this.getUsername(), this.getPassword());
        if (flg)
            this.setResponsePage(app.getHomePage());
        else
            app.onUnauthorizedPage(this);
    }
    
    public String getUsername(){
        return username.getDefaultModelObjectAsString();
    }
    
    public String getPassword(){
        return password.getInput();
    }
}

 入力フィールドのコンポーネントには、値を保管するものとしてModelではなく「PropertyModel」というものを設定しています。これは「ValueMap」というLinkedHashMapのサブクラスを使ってプロパティを管理するモデルです。また、"username""password"の値を返す「getUsername」「getPassword」といったメソッドも用意しています。これは、AuthenticatedWebApplicationクラスでgetSignInPageClassとして指定するクラスで必要となります。

 実際のログイン処理は、submitNowメソッドで行っています。これは、AuthAppSessionクラスのauthenticateを呼び出してログインチェックを行い、その結果に応じてホームページに移動するか、アプリケーションクラスのonUnauthorizedPageを呼び出すかを設定しています。

 なお、ここではログインするかどうかをチェックするだけで、実際にログインするための処理は用意していません。ログインするには、authenticateした後、AuthenticatedWebSessionクラスの「signIn」メソッドを呼び出してください。またログインしているかどうかのチェックは、同クラスの「isSignedIn」メソッドを呼び出して調べることができます。

オリジナルのログインページ。バリデーション機能なども一通り機能する。
オリジナルのログインページ。バリデーション機能なども一通り機能する。

まとめ

 wicket-auth-rolesによる認証についてひととおり説明を行いました。wicket-auth-rolesを導入することで、面倒な認証やページごとのアクセス制御が非常に簡単に実装できることが分かるでしょう。特に、アノテーションを使ったページごとのアクセス制御は、非常にシンプルで使いやすいものがあります。設定などを書くことなく、また制御のための具体的なコードを書く必要もなく、Javaらしいスタイルですっきりとアクセス制御を組み込めるからです。

 以上、3回に渡って、WicketによるWebアプリケーション開発について解説をしましたが、いかがだったでしょうか。Wicketの提唱する「コンポーネント指向のWebアプリケーション開発」がどのようなものか、だいぶイメージがつかめたのではないかと思います。Wicketの考え方は、Strutsなどに代表される従来のMVCフレームワークとはかなり違います。これを「非常に面白いスタイルだ」と思うか、「あまりに違っていて分かりにくい」と感じるか、それによってWicketの評価は大きく変わってくるでしょう。自分に向いたスタイルかどうか、まずは一度使ってみてください。

修正履歴

この記事は参考になりましたか?

  • X ポスト
  • このエントリーをはてなブックマークに追加
Javaで軽快に使える「軽量フレームワーク」特集連載記事一覧

もっと読む

この記事の著者

掌田 津耶乃(ショウダ ツヤノ)

三文ライター&三流プログラマ。主にビギナーに向けたプログラミング関連の執筆を中心に活動している。※現在、入門ドキュメントサイト「libro」、カード型学習サイト「CARD.tuyano.com」を公開...

※プロフィールは、執筆時点、または直近の記事の寄稿時点での内容です

この記事は参考になりましたか?

この記事をシェア

  • X ポスト
  • このエントリーをはてなブックマークに追加
CodeZine(コードジン)
https://codezine.jp/article/detail/4461 2009/12/22 09:15

おすすめ

アクセスランキング

アクセスランキング

イベント

CodeZine編集部では、現場で活躍するデベロッパーをスターにするためのカンファレンス「Developers Summit」や、エンジニアの生きざまをブーストするためのイベント「Developers Boost」など、さまざまなカンファレンスを企画・運営しています。

新規会員登録無料のご案内

  • ・全ての過去記事が閲覧できます
  • ・会員限定メルマガを受信できます

メールバックナンバー

アクセスランキング

アクセスランキング