ベーシック
必須項目が入力されたかチェックするには
必須項目であるページクラスのプロパティにアノテーションで
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;
ポストバック
時,
pwd1
と
pwd2
に入力された値が異なると,バリデーションでエラーとなります.
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
を使います.
ValidatorChain
の
add(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>