About

General

Teeda Core

Teeda Extension

Teeda Ajax

プロジェクト文書

モジュール

Built by Maven

バリデーション

ベーシック

必須項目が入力されたかチェックするには

必須項目であるページクラスのプロパティにアノテーションで TRequiredValidator を指定します.

例:ページクラスのプロパティ (FooPage.java)
Tigerアノテーション
@Required
public String name;
定数アノテーション
public static final String name_TRequiredValidator = "";
public String name;

ポストバック 時,ブラウザで値が入力されないとバリデーションでエラーとなります.

特定のサブミットボタンが押されたときだけチェックするには

アノテーションの target 属性でチェック対象となるサブミットボタンの id 属性の値を指定します.複数の値をカンマ ( ',' ) 区切りで列挙することができます.

例:ページクラスのプロパティ (FooPage.java)
Tigerアノテーション
@Required(target = "doNext")
public String name;
定数アノテーション
public static final String name_TRequiredValidator = "target='doNext'";
public String name;

ポストバック 時, doNext ボタンが押されたときだけ name フィールドが入力されているかチェックが行われます.

文字列のバリデーション

文字列の長さを文字数でチェックするには

ページクラスのプロパティにアノテーションで TLengthValidator を指定します. minimum 属性で最低の長さを, maximum 属性で最大の長さを設定します. どちらかの指定を省略することもできます.

例:ページクラスのプロパティ (FooPage.java)
Tigerアノテーション
@Length(minimum = 3, maximum = 5)
public String name;
定数アノテーション
public static final String name_TLengthValidator = "minimum=3, maximum=5";
public String name;

ポストバック 時,入力された文字列が3~5文字でなければバリデーションでエラーとなります.

文字列の長さをバイト数でチェックするには

ページクラスのプロパティにアノテーションで TByteLengthValidator を指定します. minimum 属性で最低のバイト数を, maximum 属性で最大のバイト数を設定します. どちらかの指定を省略することもできます.

charSet 属性で文字列からバイト列に変換するエンコーディングを設定することもできます. 省略するとプラットフォームデフォルトのエンコーディングが使われます.

例:ページクラスのプロパティ (FooPage.java)
Tigerアノテーション
@ByteLength(minimum = 5, maximum = 10)
public String name;
定数アノテーション
public static final String name_TByteLengthValidator = "minimum=5, maximum=10";
public String name;

ポストバック 時, 入力された文字列をプラットフォームデフォルトのエンコーディングで変換したバイト列の長さが, 5~10バイトでなければバリデーションでエラーとなります.

文字列が正規表現にマッチするかチェックするには

ページクラスのプロパティにアノテーションで TRegularExpressionValidator を指定し, pattern 属性で正規表現を設定します.

例:ページクラスのプロパティ (FooPage.java)
Tigerアノテーション
@RegularExpression(pattern = "\\w{6,10}")
public String password;
定数アノテーション
public static final String password_TRegularExpressionValidator = "pattern='\\w{6,10}'";
public String password;

ポストバック 時,入力された文字列が正規表現にマッチしなければバリデーションでエラーとなります.

文字列がメールアドレスかチェックするには

ページクラスのプロパティにアノテーションで EmailValidator を指定します. pattern 属性でメールアドレスとして受け入れる正規表現を設定することができます. 省略した場合のデフォルトは

^\p{ASCII}+@(([-a-z0-9]+\.)*[a-z]+|\[\d{1,3}\.\d{1,3}\.\d{1,3}\.\d{1,3}\])

です.

例:ページクラスのプロパティ (FooPage.java)
Tigerアノテーション
@Email
public String mailAddress;
定数アノテーション
public static final String mailAddress_emailValidator = "";
public String mailAddress;

ポストバック 時,入力された文字列がメールアドレスにマッチしなければバリデーションでエラーとなります.

文字列がURLかチェックするには

ページクラスのプロパティにアノテーションで UrlValidator を指定します. pattern 属性でメールアドレスとして受け入れる正規表現を設定することができます. 省略した場合のデフォルトは

https?:\/\/[-_.!~*'()a-zA-Z0-9;/?:@&=+$,%#]+

です.

例:ページクラスのプロパティ (FooPage.java)
Tigerアノテーション
@Url
public String url;
定数アノテーション
public static final String url_urlValidator = "";
public String url;

ポストバック 時,入力された文字列がURLにマッチしなければバリデーションでエラーとなります.

数値のバリデーション

数値の桁数をチェックするには

ページクラスのプロパティにアノテーションで TNumberLengthValidator を指定します. integralMin 属性で整数部の最低の長さを, integralMax 属性で整数部の最大の長さを設定します. fractionMin 属性で小数部の最低の長さを, fractionMax 属性で小数部の最大の長さを設定します. いずれかの指定を省略することもできます.

例:ページクラスのプロパティ (FooPage.java)
Tigerアノテーション
@NumberLength(fractionMin = 2, fractionMax = 2)
public BigDecimal exchangeRate;
定数アノテーション
public static final String exchangeRate_TNumberLengthValidator = "fractionMin=2, fractionMax=2";
public BigDecimal exchangeRate;

ポストバック 時,入力された数値の小数部が2桁でなければバリデーションでエラーとなります.

数値が範囲内かチェックするには

ページクラスのプロパティにアノテーションで TLongRangeValidator (整数の場合) または TDoubleRangeValidator (実数の場合) を指定します. minimum 属性で最低の値を, maximum 属性で最大の値を設定します. いずれかの指定を省略することもできます.

例:ページクラスのプロパティ (FooPage.java)
Tigerアノテーション
@LongRange(minimum = 0, maximum = 100)
public int score;
定数アノテーション
public static final String score_TLongRangeValidator = "minimum=0, maximum=100";
public int score;

ポストバック 時,入力された数値が0~100の範囲内でなければバリデーションでエラーとなります.

複数の項目に跨ったバリデーション

2つの入力項目が等しいかチェックするには

テンプレートHTML上で 後から出てくる入力項目 に対応するページクラスのプロパティに, アノテーションで TEqualValidator を指定します. targetId 属性で, 比較対象となる入力項目のプロパティ名を指定します.

例:テンプレートHTML (foo.html)
パスワード
<input type="password" id="pwd1" /><br />
パスワード
(再確認)<input type="password" id="pwd2" />
例:ページクラスのプロパティ (FooPage.java)
Tigerアノテーション
public String pwd1;

@Equal(targetId = "pwd1")
public String pwd2;
定数アノテーション
public static final String pwd2_TEqualValidator = "targetId='pwd1'";
public String pwd1;
public String pwd2;

ポストバック 時, pwd1pwd2 に入力された値が異なると,バリデーションでエラーとなります.

2つの入力項目の大小関係をチェックするには

テンプレートHTML上で 後から出てくる入力項目 に対応するページクラスのプロパティに, 以下のアノテーションのいずれかを指定します (括弧内はTigerアノテーションの名前).

TGreaterValidator ( @Greater )
アノテーションの付けられた項目が比較対象より大きいことをチェックします.
TGreaterEqualValidator ( @GreaterEqual )
アノテーションの付けられた項目が比較対象より大きいか, または等しいことをチェックします.
TLessValidator ( @Less )
アノテーションの付けられた項目が比較対象より小さいことをチェックします.
TLessEqualValidator ( @LessEqual )
アノテーションの付けられた項目が比較対象より小さいか, または等しいことをチェックします.

targetId 属性で, 比較対象となる入力項目のプロパティ名を指定します.

例:テンプレートHTML (foo.html)
開始 <input type="text" id="from" /><br />
終了 <input type="text" id="to" />
例:ページクラスのプロパティ (FooPage.java)
Tigerアノテーション
public Integer from;

@GreaterEqual(targetId = "from")
public Integer to;
定数アノテーション
public static final String to_TGreaterEqualValidator = "targetId='from'";
public Integer from;
public Integer to;

ポストバック 時, to に入力された値が from に入力された値より小さいと,バリデーションでエラーとなります.

動的なバリデーション

実行時に動的に作成したバリデータを適用するすることができます. この機能は「ダイナミックバリデータ」と呼ばれます.

ダイナミックバリデータを使用するには

ダイナミックバリデータを適用するプロパティに対応する get + プロパティ名 + Validator() という名前の public メソッドを作成します. 引数はなく,戻り値の型は javax.faces.validator.Validator とします.

get~Validator() メソッドでは,リクエストパラメータやセッションの状態を参照して Validator を作成して返すことができます.

注意事項

get~Validator() は PROCESS_VALIDATION フェーズで呼び出されるため, ページクラスのプロパティにはリクエストパラメータの値が反映されていません. JSF とページクラスのライフサイクルについては「 JSFライフサイクルとの関係 」を参照してください.

ポストバック 時, get~Validator() メソッドが返した Validator によってバリデーションが行われます.

例:ページクラス (FooPage.java)
public String name;

public Validator getNameValidator() {
    Validator validator = new TLengthValidator();
    validator.setMinimum(...);
    validator.setMaximum(...);
    return validator;
}

ポストバック 時, name プロパティのバリデーションは getNameValidator() メソッドが返した TLengthValidator によって行われます.

複数のバリデータを使用するには

javax.faces.internal.ValidatorChain を使います. ValidatorChainadd(Validator validator) メソッドで適用したいバリデータを追加します. バリデータは追加された順に適用されます.
例:ページクラス (FooPage.java)
public String name;

public Validator getNameValidator() {
    ValidatorChain validatorChain = new ValidatorChain();
    validatorChain.add(...);
    validatorChain.add(...);
    ...
    return validatorChain;
}

get~Validator()メソッドの中でリクエストパラメータを参照するには

ページクラスに名前が param で型が java.util.Map のプロパティを用意します. Seasar2によってこのプロパティにリクエストパラメータを含む Map が設定されます.

get~Validator() メソッドの中で, param プロパティからパラメータ名をキーとしてパラメータ値を取得することができます.

リクエストパラメータの名前は基本的に

  • <form>要素のid  + ':' + <input>要素等のid

という形になります.

例:テンプレートHTML (foo.html)
<form id="form">
    <input type="text" id="name"/>
    ...
</form>
例:パラメータ名
form:name

レイアウト を使っている場合は <includeChildBody> 要素や <include> 要素の id 属性の値が前に付加され,

  • <includeChildBody>要素等のid  + ':' + <form>要素のid  + ':' + <input>要素等のid

となります.

例:テンプレートHTML (layout.html)
    <te:includeChildBody id="layoutChildBody"/>
例:パラメータ名
layoutChildBody:form:name

forEach を使っている場合は, <tbody> 要素等の id 属性の値と繰り返しのインデックスが付加され,

  • [ <includeChildBody>要素等のid  + ':' + ] <form>要素のid  + ':' + forEachのid  + ':' + forEachのインデックス  + ':' + <input>要素等のid

となります.

例:テンプレートHTML (foo.html)
<form id="form">
    <table id="employeeItems">
        <tbody>
            <tr>
                <td>
                    <input type="text" id="name"/>
                </td>
                ...
            </tr>
        </tbody>
    </table>
</form>
例:パラメータ名
layoutChildBody:form:employeeItems:0:name

forEachがネストすると, そのたびにforEachの id 属性の値と繰り返しのインデックスが付加されます.

do~()メソッドでバリデーションするには

より複雑な相関チェックや, DBアクセスが必要な場合など, Validator によるバリデーションでは不十分な場合は do~() メソッド でバリデーションを行うことができます.

注意点

画面の入力項目に対応付けられたページクラスのプロパティの値を変更すると, 表示される画面の内容は変更後のプロパティの値になってしまいます. バリデーションが完了するまでは, 画面に対応付けられたプロパティを変更しないようにする必要があります.

do~() メソッドでバリデーション違反を検出した場合に メッセージを設定するには, ページクラスに org.seasar.teeda.extension.util.FacesMessageHelper 型のプロパティを用意します.

FacesMessageHelper には以下のメソッドがあります.

  • FATALレベル
    • void addFatalMessage(String messageId)
    • void addFatalMessage(String messageId, Object[] args)
    • void addFatalMessage(String clientId, String messageId)
    • void addFatalMessage(String clientId, String messageId, Object[] args)
  • ERRORレベル
    • void addErrorMessage(String messageId)
    • void addErrorMessage(String messageId, Object[] args)
    • void addErrorMessage(String clientId, String messageId)
    • void addErrorMessage(String clientId, String messageId, Object[] args)
  • WARNレベル
    • void addWarnMessage(String messageId)
    • void addWarnMessage(String messageId, Object[] args)
    • void addWarnMessage(String clientId, String messageId)
    • void addWarnMessage(String clientId, String messageId, Object[] args)
  • INFOレベル
    • void addInfoMessage(String messageId)
    • void addInfoMessage(String messageId, Object[] args)
    • void addInfoMessage(String clientId, String messageId)
    • void addInfoMessage(String clientId, String messageId, Object[] args)

messageId には, メッセージリソース ファイルに定義したキーを指定します.

特定の入力項目 (プロパティ) に関連付けられたメッセージを設定するには, clientId を指定します. 指定する値は get~Validator()メソッドの中でリクエストパラメータを参照するには のリクエストパラメータ名と同じです.

clientId を指定したメッセージは メッセージを表示するには で設定したエリアに出力されます. clientId を指定しなかったメッセージは グローバルなメッセージを表示するには で設定したエリアに出力されます.

メッセージ

メッセージを表示するには

バリデーション対象の <input> 要素等の id 属性の値 + "Message"id 属性とする <span> 要素を記述します.

例:テンプレートHTML (foo.html)
<intpu type="text" id="name" />
<span id="nameMessage">dummy</span>
例:レンダリング結果

ポストバック 時,バリデーションでエラーになると次のように表示されます.

<intpu type="text" id="name" name="form:name" class="onTeedaError" />
<span id="nameMessage">値を入力してください(name)</span>

グローバルなメッセージを表示するには

相関チェックによるエラーメッセージなど, 特定の入力項目に属さないメッセージを表示するには, id 属性が "messages"<span> 要素を記述します.

グローバルなメッセージがある場合, <span> 要素は <ul> 要素に置き換えられ,個々のメッセージが <li> 要素として出力されます.

グローバルなメッセージがない場合, <span> 要素も <ul> 要素も出力されません. このため, <span> 要素の外側に <div> 要素を記述することを推奨します.

例:テンプレートHTML (foo.html)
<div>
    <span id="messages" />
</div>
例:レンダリング結果

ポストバック 時,バリデーションでエラーになると次のように表示されます.

<div>
    <ul id="messages">
        <li>"to"の値は"form"よりも大きくなくてはいけません。</li>
    </ul>
</div>

全てのメッセージを一カ所にまとめて表示するには

id 属性が "allMessages"<span> 要素を記述します.

メッセージがある場合, <span> 要素は <ul> 要素に置き換えられ,個々のメッセージが <li> 要素として出力されます.

表示するメッセージがない場合, <span> 要素も <ul> 要素も出力されません. このため, <span> 要素の外側に <div> 要素を記述することを推奨します.

例:テンプレートHTML (foo.html)
<div>
    <span id="allMessages" />
</div>
例:レンダリング結果

ポストバック 時,バリデーションでエラーになると次のように表示されます.

<div>
    <ul id="allMessages">
        <li>値を入力してください(name)</li>
        <li>"to"の値は"form"よりも大きくなくてはいけません。</li>
    </ul>
</div>

メッセージの文言を変更するには

以下から変更したいメッセージを探し,同じキーを持つ独自のメッセージを appMessages.propertyes (日本語のメッセージは appMessages_ja.properties ) に定義します.

 
例:メッセージリソースファイル (appMessage_ja.properties)
javax.faces.component.UIInput.REQUIRED_detail={0}は必須です

関連項目

特定のコンポーネントだけメッセージを変更するには

バリデーションのアノテーションに独自のメッセージIDを指定し, それをキーとするメッセージを appMessages.propertyes (日本語のメッセージは appMessages_ja.properties ) に定義します.

例:ページクラスのプロパティ (FooPage.java)
Tigerアノテーション
@Required(messageId = "foo.name.required")
public String name;
定数アノテーション
public static final String name_TRequiredValidator = "messageId='foo.name.required'";
public String name;
例:メッセージリソースファイル (appMessage_ja.properties)
foo.name.required=名前は絶対入れてね

関連項目

エラーとなった項目が目立つようにするには

エラーとなった要素は class 属性に onTeedaError が追加されるので,CSSで背景を変えるなどして目立たせることができます.

例:テンプレートHTML (foo.html)
<style>
    .onTeedaError {
        background-color: #FFCCCC;
    }
</style>

ポストバック 時, バリデーションでエラーになると, テキストフィールドやテキストエリアの背景が設定した色で表示されます.

項目名を日本語で表示するには

バリデーション対象となる <input> 要素等に title 属性で項目名を指定します.

例:テンプレートHTML (label_ja.properties)
<intpu type="text" id="name" title="名前" />
<span id="nameMessage">dummy</span>
例:レンダリング結果

ポストバック 時,バリデーションでエラーになると次のように表示されます.

<intpu type="text" id="name" name="form:name" title="名前" class="onTeedaError" />
<span id="nameMessage">値を入力してください(名前)</span>

項目名をプロパティファイルから表示するには

ラベルリソース ファイルに pagename.id または id という名前のプロパティを定義します. id は, バリデーション対象となる <input> 要素等の id 属性の値です.

あるいは,バリデーション対象となる <input> 要素等に title 属性を付け, その値を key + Label とします. ラベルリソース ファイルに pagename.key または key という名前のプロパティを定義します.

例:テンプレートHTML (foo.html)
<intpu type="text" id="name" />
<span id="nameMessage">dummy</span>

あるいは,

<intpu type="text" id="name" title="nameLabel" />
<span id="nameMessage">dummy</span>
例:ラベルリソースファイル (label_ja.properties)
name=名前
例:レンダリング結果

ポストバック 時,バリデーションでエラーになると次のように表示されます.

<intpu type="text" id="name" name="form:name" class="onTeedaError" />
<span id="nameMessage">値を入力してください(名前)</span>