JSF 2.0の複数コンポーネントバリデーター
JSFでは、複数のコンポーネントまたはフィールドを検証する公式な方法はありません。これを解決するには、カスタムバリデーターを作成する必要があります。このチュートリアルでは、パスワードと確認パスワードの複数のコンポーネントを検証するためのバリデータを作成する2つの非公式な方法を示します。
2つの方法:1. `PostValidateEvent`を登録し、内部に検証を入れます。 2.標準バリデータを作成し、 `f:attribute`を介して他のコンポーネントを取得します。
この例は、次のテクノロジでテストされています。
-
JSF 2.1.11
-
Tomcat 6,7
-
Java 1.6
-
Maven 3
1. PostValidateEventの検証
javax.faces.event.PostValidateEventは、すべてのコンポーネントが検証された後に起動するシステムイベントです。このアイデアは「PostValidateEvent」を登録し、検証メソッドにアタッチします。以下を参照してください:
<f:event listener="#{bean.methodToValidateMultipleFields}" type="postValidate"/>
default.xhtml
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:body>
<h1>Multiple-Components Validator in JSF 2.0</h1>
<h:form id="register">
<h:message for="RegisterGroupPanel" style="color:red;"/>
<h:panelGrid columns="3" id="RegisterGroupPanel">
<!-- register a PostValidateEvent -->
<f:event listener="#{user.validatePassword}" type="postValidate"/>
<h:outputLabel for="username" value="Username : "/>
<h:inputText id="username" value="#{user.username}" required="true"
requiredMessage="Please enter username"/>
<h:message for="username" style="color: red;"/>
<h:outputLabel for="password" value="Password : "/>
<h:inputSecret id="password" value="#{user.password}" required="true"
requiredMessage="Please enter password"/>
<h:message for="password" style="color: red;"/>
<h:outputLabel for="confirmPassword" value="Confirm password : "/>
<h:inputSecret id="confirmPassword" required="true"
requiredMessage="Please enter confirm password"/>
<h:message for="confirmPassword" style="color: red;"/>
</h:panelGrid>
<h:commandButton action="thanks" value="register"/>
</h:form>
</h:body>
</html>
PostValidateEvent`では、" listener "メソッドはこの署名
public void method-name(ComponentSystemEvent event) `を持っていなければなりません。コードの残りの部分は自明です。
UserBean.java – パスワードを検証し、パスワードコンポーネントを確認するメソッドがあります。
package com.mkyong;
import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.SessionScoped;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.event.ComponentSystemEvent;
@ManagedBean(name = "user")
@SessionScoped
public class UserBean {
public String username;
public String password;
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getPassword() {
return password;
}
public void setPassword(String password) {
this.password = password;
}
public void validatePassword(ComponentSystemEvent event) {
FacesContext fc = FacesContext.getCurrentInstance();
UIComponent components = event.getComponent();
//get password
UIInput uiInputPassword = (UIInput) components.findComponent("password");
String password = uiInputPassword.getLocalValue() == null ? ""
: uiInputPassword.getLocalValue().toString();
String passwordId = uiInputPassword.getClientId();
//get confirm password
UIInput uiInputConfirmPassword = (UIInput) components.findComponent("confirmPassword");
String confirmPassword = uiInputConfirmPassword.getLocalValue() == null ? ""
: uiInputConfirmPassword.getLocalValue().toString();
//Let required="true" do its job.
if (password.isEmpty() || confirmPassword.isEmpty()) {
return;
}
if (!password.equals(confirmPassword)) {
FacesMessage msg = new FacesMessage("Password must match confirm password");
msg.setSeverity(FacesMessage.SEVERITY__ERROR);
fc.addMessage(passwordId, msg);
fc.renderResponse();
}
}
}
2.カスタムバリデータ
このメソッドは、この記事(http://balusc.blogspot.com/2007/12/validator-for-multiple-fields.html[複数フィールドのバリデータ])からコピーされています。
“confirmPassword”コンポーネントを `#{confirmPassword}`として定義し、 `f:attribute`を介して” password “コンポーネントにアタッチします。
<h:inputSecret id="password" value="#{user.password}" required="true"
requiredMessage="Please enter password">
<f:validator validatorId="passwordValidator"/>
<f:attribute name="confirmPassword" value="#{confirmPassword}"/>
</h:inputSecret>
<h:inputSecret id="confirmPassword" required="true"
binding="#{confirmPassword}"
requiredMessage="Please enter confirm password"/>
default.xhtml
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:body>
<h1>Multiple-Components Validator in JSF 2.0</h1>
<h:form id="register">
<h:message for="RegisterGroupPanel" style="color:red;"/>
<h:panelGrid columns="3" id="RegisterGroupPanel">
<h:outputLabel for="username" value="Username : "/>
<h:inputText id="username" value="#{user.username}" required="true"
requiredMessage="Please enter username"/>
<h:message for="username" style="color: red;"/>
<h:outputLabel for="password" value="Password : "/>
<h:inputSecret id="password" value="#{user.password}" required="true"
requiredMessage="Please enter password">
<f:validator validatorId="passwordValidator"/>
<f:attribute name="confirmPassword" value="#{confirmPassword}"/>
</h:inputSecret>
<h:message for="password" style="color: red;"/>
<h:outputLabel for="confirmPassword" value="Confirm password : "/>
<h:inputSecret id="confirmPassword" required="true"
binding="#{confirmPassword}"
requiredMessage="Please enter confirm password"/>
<h:message for="confirmPassword" style="color: red;"/>
</h:panelGrid>
<h:commandButton action="thanks" value="register"/>
</h:form>
</h:body>
</html>
カスタムバリデータクラス、 `component.getAttributes`で確認パスワードコンポーネントを取得します。
PasswordValidator.java – JSFカスタムバリデーター
package com.mkyong;
import javax.faces.application.FacesMessage;
import javax.faces.component.UIComponent;
import javax.faces.component.UIInput;
import javax.faces.context.FacesContext;
import javax.faces.validator.FacesValidator;
import javax.faces.validator.Validator;
import javax.faces.validator.ValidatorException;
@FacesValidator("passwordValidator")
public class PasswordValidator implements Validator {
@Override
public void validate(FacesContext context, UIComponent component,
Object value) throws ValidatorException {
String password = value.toString();
UIInput uiInputConfirmPassword = (UIInput) component.getAttributes()
.get("confirmPassword");
String confirmPassword = uiInputConfirmPassword.getSubmittedValue()
.toString();
//Let required="true" do its job.
if (password == null || password.isEmpty() || confirmPassword == null
|| confirmPassword.isEmpty()) {
return;
}
if (!password.equals(confirmPassword)) {
uiInputConfirmPassword.setValid(false);
throw new ValidatorException(new FacesMessage(
"Password must match confirm password."));
}
}
}
デモ
上記の2つのソリューションは同じことをしており、パスワードとパスワードを確認する2つのコンポーネントを検証します。
入力がなく、 `required =” true “`が実行されます。

複数のコンポーネント/フィールドを検証します。パスワードが確認パスワードと等しいことを確認してください。

ソースコードをダウンロードする
ダウンロードする – リンク://wp-content/uploads/2010/11/JSF-Validator-Multiple-Components-Example.zip[JSF-バリデーター – マルチプル – コンポーネント – サンプル.zip](27 KB)
参考文献
2 PostValidateEvent JavaDoc]。
http://javaserverfaces.java.net/nonav/docs/2.1/vdldocs/facelets/f/event.html
[List
JSF 2イベントの概要]