S2Swing

バリデーション - S2Swing チュートリアル

このページの内容に対応するソースコードは、s2swing-tutorialアーカイブのvalidationパッケージ以下にあります。

S2Swingには、@Requiredや@Lengthといった制約アノテーションが用意されています。 モデルクラスのプロパティにこれらのアノテーションを付加することで、アプリケーションにバリデーション機構を簡単に組み込むことができます。

バリデーションの流れ

S2Swingでは、基本的に次のような流れでバリデーションを記述します。

  1. モデルクラスのプロパティに、制約アノテーションを付加します。
  2. ObservableBeans.create()メソッドを使用して、モデルクラスのオブジェクトを作成します。
  3. Binderクラスを使用して、モデルオブジェクトのプロパティと画面コンポーネントをバインディングします。
  4. Binder#addBindingStateListener()メソッドを使用して、バリデーション成功/失敗の状態変更リスナーを登録します。

モデルクラスの作成

上記の流れを具体的に見ていきましょう。ここでは、テキストフィールドに4文字以上のユーザ名を入力させる場面を考えてみます。 まず、ユーザ情報を示すUserクラスを作成します。ユーザ名を示すnameプロパティに、@Lengthアノテーションを使って制約を指定します。

package validation;

import java.io.Serializable;

import org.seasar.swing.validator.annotation.Length;

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

    @Length(min = 4)
    private String name;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }
}

@Length(min = 4)として、nameプロパティが4文字以上でなければならないことを指示しています。 なお、アノテーションの位置は、フィールド、getter、setterのいずれでも認識されます。

フレームクラスの作成

次に、ユーザ名の入力画面となるValidationUsageFrameクラスを作りましょう。

package validation;

import java.awt.Container;
import java.awt.Dimension;
import java.awt.FlowLayout;

import javax.swing.JTextField;

import org.seasar.swing.beans.ObservableBeans;
import org.seasar.swing.binding.Binder;
import org.seasar.swing.binding.BindingStateEvent;
import org.seasar.swing.binding.BindingStateListener;
import org.seasar.swing.component.S2Frame;

public class ValidationUsageFrame extends S2Frame {
    private static final long serialVersionUID = 1L;

    private JTextField textField = new JTextField();

    private User user;

    public void initialize() {
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        textField.setPreferredSize(new Dimension(360, 24));
        Container c = getContentPane();
        c.setLayout(new FlowLayout());
        c.add(textField);

        user = ObservableBeans.create(User.class);

        Binder binder = new Binder();
        binder.add(user, "name", textField, "text");

        binder.addBindingStateListener(new BindingStateListener() {
            public void bindingStateChanged(BindingStateEvent e) {
                setTitle(e.getSimpleErrorMessage());
            }
        });

        binder.bind();
    }
}

このコードのように、バリデーションは通常、バインディングとセットで行われます。

バインディングのターゲットオブジェクト(ここではtextFieldコンポーネント)のプロパティが変更されると、ただちにバリデーションが行われます。 バリデーションが成功すれば、ターゲット値がソースプロパティ(ここではuser.name)に代入されます。バリデーションが失敗した場合、ソースプロパティは変更されません。 このバリデーションの結果は、BindingStateEvent型のイベントとしてリスナーへ通知されます。

34行目では、Binder#addBindingStateListener()を呼び出して、BindingStateEventのイベントハンドラを記述しています。 ハンドラの内容は、エラーメッセージをフレームのタイトルに設定するという単純なものです。

アプリケーションの実行

それでは、アプリケーションを実行してみましょう。初期状態で、フレームのタイトルが「name : 入力は4文字以上でなければいけません。」となっていますね。

テキストフィールドに文字を入力して、フレームタイトルがどう変化するか観察してみてください。 入力が4文字以上に達したとき、エラーメッセージが消えることが確認できます。

Copyright © 2008-2009 The Seasar Foundation and the others. All rights reserved.