JavaのWebアプリケーションフレームワークであるJSFを仕事で使う機会があったので、
備忘録を残そうと思います。
- 使用環境
- NetBeans8.2
- JavaEE7.0
- GlassFish4.1.1
JSFのバリデーションクラス
前回の続きでJSFでのバリデータの紹介になります。
今回はバリデーション用のクラスの作成を行い、バリデーションを定義したメソッドを自作します。
【バリデーションクラス】
import java.util.regex.Matcher; import java.util.regex.Pattern; import javax.faces.application.FacesMessage; import javax.faces.component.UIComponent; import javax.faces.context.FacesContext; import javax.faces.validator.FacesValidator; import javax.faces.validator.Validator; import javax.faces.validator.ValidatorException; @FacesValidator(value = "testValidator") public class TestValidator implements Validator{ public TestValidator(){ } @Override public void validate(FacesContext context, UIComponent component, Object value){ //半角英数字チェック Pattern p = Pattern.compile("^[a-zA-Z0-9]+$"); Matcher m = p.matcher((String)value); if(!m.matches()){ throw new ValidatorException(new FacesMessage("半角英数字で入力してください")); } //半角英数字8桁以上チェック p = Pattern.compile("^[a-zA-Z0-9]{8,}+$"); m = p.matcher((String)value); if(!m.matches()){ throw new ValidatorException(new FacesMessage("半角英数字8桁以上の入力が必要です")); } //半角英数字8桁以上 大文字小文字数字1種類以上使用 p = Pattern.compile("^(?=.*?[a-z])(?=.*?[A-Z])(?=.*?\\d)[a-zA-Z\\d]{8,}+$"); m = p.matcher((String)value); if(!m.matches()){ throw new ValidatorException(new FacesMessage("アルファベット大文字小文字と数字が最低1桁ずつ必要です(合計8桁以上)")); } } }
【view】
<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html" xmlns:f="http://xmlns.jcp.org/jsf/core"> <h:head> <title>validation sample</title> </h:head> <h:body> <h:form> テキストボックス: <h:inputText id="inputText" value="#{managedBean.txtInput}" validator="testValidator" /> <h:message for="inputText" style="color: #FF0000"/> <div><h:commandButton value="バリデータテスト" /></div> </h:form> </h:body> </html>
【ManagedBean】(前回と変わりませんが一応)
import javax.inject.Named; import javax.enterprise.context.Dependent; @Named(value = "managedBean") @Dependent public class ManagedBean { private String txtInput; public String getTxtInput() { return txtInput; } public void setTxtInput(String txtInput) { this.txtInput = txtInput; } }
【実行例】
必要な作業は主に3つです。
以上の工程でそれぞれのコンポーネントに自由にバリデータの設定ができます。
Bean Validationの利用
ここまでに紹介したバリデータの設定方法以外にもJavaにはBeanValidationという
一般的によく知られた方法があります。
こちらはJSFに限らずどのプロジェクトでも使用可能な方法なので、個人的に一番おすすめです。
【view】
<?xml version='1.0' encoding='UTF-8' ?> <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd"> <html xmlns="http://www.w3.org/1999/xhtml" xmlns:h="http://xmlns.jcp.org/jsf/html"> <h:head> <title>validationbeansample</title> </h:head> <h:body> <h:form> <h:messages/> <h:inputText value="#{managedBean.input}" /> <h:commandButton value="テスト" actionListener="#{managedBean.test()}" /> </h:form> </h:body> </html>
【BeanValidation】
package perfect.javaee.mavenproject2; import javax.inject.Named; import javax.enterprise.context.Dependent; import javax.validation.constraints.Size; @Named(value = "managedBean") @Dependent public class ManagedBean { @Size(max = 5) private String input; public String getInput() { return input; } public void setInput(String input) { this.input = input; } public void test(){ System.out.print("入力値OK"); } }
【実行例】
BeanValidationの変数inputの宣言の際、@Size制約を付与しています。
こちらは標準で定義された制約条件で、他にも以下のようなものが存在します。
- @Null:nullであることを検証
- @NotNull:nullでないことを検証
- @AssertFalse:値がFalseであることを検証
- @AssertTrue:値がTrueであることを検証
- @Size:Stringは文字数を検証。Collectionなどは要素数を検証
- @Min:指定の最小値以上であることを検証
- @Max:指定の最大値以下であることを検証
- @DecimalMin:最小値を設定。@Minと違い境界値を含まないように設定可能
- @DecimalMax:最大値を設定。@Maxと違い境界値を含まないように設定可能
- @Digits:数値の整数部の桁数、小数部の桁数を検証
- @Past:日時が過去であるか検証
- @Future:日付が未来であることを検証
- @Pattern:正規表現を指定
これらの制約条件を設定すると、そのパラメータに対し値を設定する際に自動で検証が行われます。
もし満たせてない場合はリクエストが中断され、上記サンプルで本来実行されるべき
actionListener=”#{managedBean.test()}のtestメソッドの呼び出しは行われず、
デフォルトで設定されたエラーメッセージを付与したレスポンスが返ります。
バリデーションについては以上になります。
コメント