7

JSF2.0とGlassfishを使用して純粋なJavaEE6アプリケーションを開発しています。私のJSF実装はPrimefacesです(Glassfishが提供するMojarraのほかに)。

JSFフォームの2つのパスワードフィールドの値が等しいかどうかを確認したいと思います。Seamには、きちんとしたコンポーネントがあります<s:validateEquality for="pw1"/>。Seamを使用せずに、JSF(またはJSFライブラリのコンポーネント)を使用して同じことを実行したいと思います。これまで、カスタムバリデーターを使用してフォームを検証する例しか見ていませんでした。しかし、JavaコードやJavascriptコードを記述せずにフィールドを比較したいと思います。それは可能ですか?

Seamでは次のようになります。

...
<h:inputSecret id="passwort" value="#{personHome.instance.password}" 
    redisplay="true" required="true">
  <f:validateLength minimum="8"/>
  <a:support event="onblur" reRender="passwortField" bypassUpdates="true" ajaxSingle="true" />
</h:inputSecret>
...    
<h:inputSecret id="passwort2" required="true" redisplay="true">
  <!-- find the JSF2.0-equivalent to this tag: -->
  <s:validateEquality for="passwort"/>
  <a:support event="onblur" reRender="passwort2Field" bypassUpdates="true" ajaxSingle="true" />
</h:inputSecret>
...
4

7 に答える 7

8

Primefacesタグは、次の非常に簡単な方法で使用できます。

<p:password id="password" value="#{bean.password}" match="repeated_password" />

<p:password id="repeated_password" value="#{bean.password}" />
于 2014-05-19T15:03:00.770 に答える
6

Seam3 Facesモジュールは、差し迫ったAlpha3リリースで「クロスフィールドフォーム検証」をサポートします。これは、最小限のコードソリューションに対する最善の策です。ハウツーについては、このブログを参照してください。

または、f:attributeタグを使用して別のフォームフィールドのclientIdをカスタムバリデーターに渡し、次にカスタムバリデーターに渡されたUIComponentを使用してidでファイルされた他のファイルにアクセスすることにより、プログラムでこれを行いました。

フェイスレットファイルは次のとおりです。

<h:outputLabel value="Enter your email address" rendered="#{!cc.attrs.registration.subRegistration}" />
<h:inputText label="Email" id="textEmail1" value="#{cc.attrs.registration.email}" rendered="#{!cc.attrs.registration.subRegistration}" required="true" maxlength="128" size="35"></h:inputText>
<h:message for="textEmail1" rendered="#{!cc.attrs.registration.subRegistration}"></h:message>

<h:outputLabel value="Re-enter your email address confirmation:" rendered="#{!cc.attrs.registration.subRegistration and cc.attrs.duplicateEmailRequired}" />
<h:inputText label="Email repeat" id="textEmail2" rendered="#{!cc.attrs.registration.subRegistration and cc.attrs.duplicateEmailRequired}" maxlength="64" size="35">
    <f:validator validatorId="duplicateFieldValidator" />
    <f:attribute name="field1Id" value="#{component.parent.parent.clientId}:textEmail1" />
</h:inputText>
<h:message for="textEmail2" rendered="#{!cc.attrs.registration.subRegistration and cc.attrs.duplicateEmailRequired}"></h:message>

バリデータークラスは次のとおりです。

package ca.triumf.mis.trevents.jsf.validator;

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(value="duplicateFieldValidator")
public class DuplicateFieldValidator implements Validator {

@Override
public void validate(FacesContext context, UIComponent component, Object value)
        throws ValidatorException {
    // Obtain the client ID of the first field from f:attribute.
    System.out.println(component.getFamily());
    String field1Id = (String) component.getAttributes().get("field1Id");

    // Find the actual JSF component for the client ID.
    UIInput textInput = (UIInput) context.getViewRoot().findComponent(field1Id);
    if (textInput == null)
        throw new IllegalArgumentException(String.format("Unable to find component with id %s",field1Id));
    // Get its value, the entered text of the first field.
    String field1 = (String) textInput.getValue();

    // Cast the value of the entered text of the second field back to String.
    String confirm = (String) value;

    // Check if the first text is actually entered and compare it with second text.
    if (field1 != null && field1.length() != 0 && !field1.equals(confirm)) {
        throw new ValidatorException(new FacesMessage("E-mail addresses are not equal."));
    }
}
}
于 2010-06-03T03:49:31.790 に答える
5

成功するには、両方の答えを組み合わせて使用​​する必要がありました。

ifischersの短いソリューションを使用しましたが、Beanのパスワードフィールドがnullでした。

そこで、Brian Leathemの行を使用して、コンテキストからUIInputを取得しました。

public void passwordValidator(FacesContext context, UIComponent toValidate, Object value) {

    UIInput passwordField = (UIInput) context.getViewRoot().findComponent("registerForm:password");
    if (passwordField == null)
        throw new IllegalArgumentException(String.format("Unable to find component."));
    String password = (String) passwordField.getValue();
    String confirmPassword = (String) value;
    if (!confirmPassword.equals(password)) {
        FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Passwords do not match!", "Passwords do not match!");
        throw new ValidatorException(message);
    }
}
于 2011-08-20T05:38:26.850 に答える
4

JSFユーティリティライブラリOmniFacesを使用している場合は、を使用できます<o:validateEqual>。また、カスタムメッセージを設定することもできます。ショーケースには、パスワード確認を検証する一般的な使用例を示す実例があります。バリデーターを呼び出す前にモデルを更新するためにajaxも必要ありません(独自のアプローチのように)。

最低限必要なコードは次のとおりです。

<h:inputSecret id="password" value="#{personHome.person.password}" />
<h:message for="password" />

<h:inputSecret id="password2" />
<h:message for="password2" />

<o:validateEqual components="password password2" 
    message="Passwords do not match!" showMessageFor="password2" />

Javaコードは必要ありません。

于 2014-05-28T08:52:33.877 に答える
3

これが私が最終的にやった方法です。短くて簡単だからです。唯一の問題は、実際には再利用できないことですが、これが必要なのは1つの場合だけなので、LOCをいくつか保存して、この方法で実行します。私の見解からのスニペット:

<h:inputSecret id="password" value="#{personHome.person.password}">
  <f:ajax event="blur" render="passwordError" />
</h:inputSecret> 
<h:message for="password" errorClass="invalid" id="passwordError" />

<h:inputSecret id="password2" validator="#{personHome.validateSamePassword}">
  <f:ajax event="blur" render="password2Error" />
</h:inputSecret> 
<h:message for="password2" errorClass="invalid" id="password2Error" />

私のバッキングビーン(重要な部分だけ):

@Named @ConversationScoped
public class PersonHome {
  private Person person;

  public Person getPerson() {
    if (person == null) return new Person();
    else return person;
  }

  public void validateSamePassword(context:FacesContext, toValidate:UIComponent, value:Object) {
    String confirmPassword = (String)value;
    if (!confirmPassword.equals(person.getPassword()) {
      FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Passwords do not match!", "Passwords do not match!")
      throw new Validatorexception(message);
    }
  }
于 2010-06-04T10:54:18.093 に答える
0

ApacheMyFacesExtValを使用して簡単に行うことができます。

于 2012-03-23T23:00:30.667 に答える
-1

編集:読む前に、この解決策が完全に機能することを考慮してください。答えは2012年7月のものです。したがって、気に入らなかったという理由だけで私に反対票を投じないでください。世界は変化し、今ではより優れたコンポーネントとソリューションがあります。

解決策がなければ、私は醜い方法で検証を行うことを余儀なくされました(推奨されません)。少なくとも、より良い解決策が見つかるまでは機能します。

アクションを返すメソッドでは、両方の値をチェックします。値が異なる場合は、コンテキストにエラーメッセージを追加し、ナビゲーションハンドラーにnullを返します。

package com.jsf.beans.user;

import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.component.html.HtmlInputSecret;

import org.apache.commons.lang.StringUtils;

import com.pichler.jsf.beans.base.JsfViewBean;

 @ManagedBean(name = "changePassword")
 @RequestScoped
 public class ChangePassword extends JsfViewBean {
private HtmlInputSecret inputSecret1, inputSecret2;

/**
 * @return the inputSecret1
 */
public HtmlInputSecret getInputSecret1() {
    return inputSecret1;
}

/**
 * @param inputSecret1
 *            the inputSecret1 to set
 */
public void setInputSecret1(HtmlInputSecret inputSecret1) {
    this.inputSecret1 = inputSecret1;
}

/**
 * @return the inputSecret2
 */
public HtmlInputSecret getInputSecret2() {
    return inputSecret2;
}

/**
 * @param inputSecret2
 *            the inputSecret2 to set
 */
public void setInputSecret2(HtmlInputSecret inputSecret2) {
    this.inputSecret2 = inputSecret2;
}

private String password1, password2;

public String alterar() {
    if (!StringUtils.equals(password1, password2)) {
        addErrorMessage(inputSecret1.getClientId(),
                "As senhas não coincidem");
        addErrorMessage(inputSecret2.getClientId(),
                "As senhas não coincidem");
        return null;
    }
    return null;
}

/**
 * @return the password1
 */
public String getPassword1() {
    return password1;
}

/**
 * @param password1
 *            the password1 to set
 */
public void setPassword1(String password1) {
    this.password1 = password1;
}

/**
 * @return the password2
 */
public String getPassword2() {
    return password2;
}

/**
 * @param password2
 *            the password2 to set
 */
public void setPassword2(String password2) {
    this.password2 = password2;
}

}

* JsfViewBeanは、「addMessages」のようないくつかの一般的なメソッドを持つ単なるクラスです。

于 2012-07-27T01:21:48.963 に答える