Creator2でValidatorの実装
今日は、JSFのバリデータを取り上げます。 まず、「ValidatorTest」という新規プロジェクトを作成して下さい。 そして、今までと同様、ドラッグ&ドロップにてコンポーネントを貼り付けます。 今回は、「Label」コンポーネントを2つ貼り付けて、プロパティを変更します。 ここでは「名前(漢字)」、「名前(カナ)」とします。 次に、「TextField」を2つ貼り付けてください。 そして「Message」コンポーネントを2つ貼り付けてください。 最後にボタンを2つ貼り付けます。 画面作成イメージ次に、「TextField」コンポーネントと「Message」コンポーネントとの関連付けを 行います。 「Message」コンポーネント上で「Ctrl+Shiftキーを押した状態で マウスでドラッグ」してください。そして「TextField」上でドロップしてください。 コンポーネントをドラッグした状態でマウスを移動すると「Message」 コンポーネントが青枠で囲まれて、波線が表示されます。 そして「TextField」上でドロップすると「Message summary for textField**」という 文字列が「Message」コンポーネント上に表示されます。 これで、「TextField」コンポーネントと「Message」コンポーネントの関連付けが完了です。
Validatorの設定(標準Validatorの利用) それでは、実際にValidatorを使用していきます。 まず始めはJSF標準のValidatorを利用します。 今回は、入力された文字列の長さを検証する「LengthValidator」を使用します。 そして5文字以上10文字以内でなければエラーを出力するようにします。 それでは「TextField」コンポーネントのプロパティより「validator」のコンボボックスを 開き「(new LengthValidator)」を選択して下さい。 すると、プロパティの値は「lengthValidator1」に変更されます。
「maxLength」はValidatorの最大値の設定項目ではありません。 入力値の範囲の設定は、「Outline」タブの「lengthValidator1」を選択し 設定します。 「Outline」タブより「lengthValidator1」を押下してください。 すると、「Properties」タブに「maximum」、「minimum」を設定する項目が 表示されます。ここに適切な値(範囲)を設定してください。 今回は、maximum=15,minimum=5を入力します。
この状態で、プログラムを1度ビルドしてデプロイ、実行してみてください。 すると下記のような実行結果が得られます。 以上で、標準Validatorを使用したサンプルができましたが、如何でしょうか?
補足: 標準Validatorのエラーメッセージは、プロパティの値を上書きしていただく事で メッセージを変更できます。例えば、LengthValidatorの場合、下記のプロパティを 作成して下さい。(詳細はJSFの関連書籍を参考にしてください。) message.properties javax.faces.validator.LengthValidator.MAXIMUM=15文字以上入力できません。 javax.faces.validator.LengthValidator.MINIMUM=5文字以上入力してください。 Validatorの設定(独自Validatorの作成) 次に独自のValidatorを作成しましょう。 まず、「TextField」でマウス右クリックをし「Edit Event Handler」から 「validate」を選択してください。
すると下記のコードが自動的に作成されるかと思います。 public void textField2_validate(FacesContext context, UIComponent component, Object value) { // TODO: Check the value parameter here, and if not valid, do something like this: // throw new ValidatorException(new FacesMessage("Not a valid value!")); } この部分に独自コードを実装します。例えば半角カナと空白のみ入力を 受け付けるコードは下記のようになります。 public void textField2_validate(FacesContext context, UIComponent component, Object value) { // TODO: Check the value parameter here, and if not valid, do something like this: // throw new ValidatorException(new FacesMessage("Not a valid value!")); if(value instanceof String){ if(isKatakanaString((String)value) == false){ showErrorMessage("カタカナを入力してください。"); } }else{ showErrorMessage("不正な値です。"); } } /** * 引数で与えられた文字列をMessageコンポーネントに表示する。 * * @param value - エラーメッセージ */ private void showErrorMessage(String errorMessage){ FacesMessage message = new FacesMessage(errorMessage); message.setSeverity(FacesMessage.SEVERITY_ERROR); throw new ValidatorException(message); } /** * 入力された文字がカタカナかを判定する。 * * @param value - 判定する文字列 * @return true:全角・半角カタカナ・全角空白・空白 false:不正文字列 */ private boolean isKatakanaString(String value){ logger.debug("isKatakanaString() started."); boolean returnValue = false; for(int i=0;i<value.length();i++){ char code = value.charAt(i); //カタカナと全角空白・半角空白ならばOK /* if(code >= 0x30a1 && code <= 0x30fe){ //全角カナ returnValue = true; }else if(code == 0x3000 || */ if(code == 0x20){ //半角空白・全角空白 returnValue = true; }else if(code >= 0xff61 && code <= 0xff9f){ //半角カナ returnValue = true; }else{ returnValue = false; return returnValue; } } return returnValue; } 上記で、showErrorMessage()メソッドは重要ですが、ここで独自のエラーメッセージを 設定し、ValidatorException()を送出しています。 上記のコードの実行結果は下記の通りです。 実行例1
実行例2
補足 独自Validatorは、実際のプロジェクトでは標準Validatorを利用する以上に よく使われるかと思います。しかし、isKatakanaString()メソッドのように切り分ける事で JSFに精通していないJavaエンジニアも検証用のコードを記述することが可能になります。 そこでこのValidatorの実装はできるだけ作業分担しましょう。 最後に、今回紹介したValidatorも重要ですが、今後AJAXと併用してリアルタイムで バリデーションを行う機能や入力補完機能と共に使われることも多くなってくるのでは ないかと思いますので是非下記もチェックしてみてください。 https://bpcatalog.dev.java.net/nonav/ajax/textfield-jsf/design.html(AJAX Auto-Completion) https://bpcatalog.dev.java.net/nonav/ajax/validation/design.html(Realtime Valiadtion) 次回は、コンバータかFileUploadを紹介します。

