1

私は JSF を初めて使用し、1 つの JSF アプリケーションを使用しています。

空白文字列の 1 つのパスワード フィールドを検証したいと考えています。

私はJavascriptでそれを行う代わりに、検証のために関数を呼び出していることを知っています.

私の必要性は、パスワードフィールドの値が空白の場合、バリデーター関数から検証され、今まで正しく進んでいますが、検証後、その時点で UI bav=ck に =s が来ると、パスワードフィールドは空でなければなりません。

パスワードフィールドが空(スペースのみを含む)の場合は、空白に設定するか、データをそのまま保持します。

今までの私の試み、JSFビューページ singin.xhtml

                    <h:outputText styleClass="outputBox" style="margin: 3px;"
                        value="Password" />
                    <h:inputSecret id="password" required="true" 
                        requiredMessage="Please enter your password"
                        value="#{userActionManager.dto.password}" 
                        validator="#{userActionManager.validateSamePassword}">

                            <a4j:ajax event="change" execute="@this" bypassUpdates="true" />
                    </h:inputSecret>

バリデーターメソッド。

    public void validateSamePassword(FacesContext fc, UIComponent component, Object obj) {
         System.out.println("UserActionManager.validateSamePassword()");

         String confirmPassword = (String)obj;
         System.out.println("Password is :" + confirmPassword);
            if(confirmPassword!=null && confirmPassword.trim().equals("")) {
              FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR, "Password cannot be blank", " detail Passwords do not match!");

//            System.out.println(component.getFamily());
//            String field1Id = (String) component.getAttributes().get("password");

              // Find the actual JSF component for the client ID.
//            UIInput textInput = (UIInput) fc.getViewRoot().findComponent("password");
//            textInput.setValue("");

              dto.setPassword(null);

              throw new ValidatorException(message);
            }else{
                dto.setPassword(confirmPassword);
            }
    }

オプション dto.setPassword(null); を試しました。しかし、表示に戻ると、パスワードフィールドに空白が残っているため、手動で削除する必要があります。

私は何が欠けていますか?

4

2 に答える 2

1

バリデーター内で、引数として渡され resetValue()たのインスタンスを呼び出しますUIComponent

public void validateSamePassword(FacesContext fc, UIComponent component, Object obj) {
     System.out.println("UserActionManager.validateSamePassword()");

     String confirmPassword = (String)obj;
     System.out.println("Password is :" + confirmPassword);
        if(confirmPassword!=null && confirmPassword.trim().equals("")) {
          FacesMessage message = new FacesMessage(FacesMessage.SEVERITY_ERROR,   "Password cannot be blank", " detail Passwords do not match!");

          component.resetValue();

          throw new ValidatorException(message);
        }else{
            dto.setPassword(confirmPassword);
        }
}

dto.setPassword(null)入力コンポーネントは、検証に失敗する原因となった値を保持するように設計されているため、パスワード ボックスの値には影響しません。resetValue()コンポーネントの値を初期化されていない状態にリセットするメソッドです。

編集:上記の解決策は、入力値を時期尚早にリセットします。ValidationException技術的には、 aがスローされるまで検証は失敗しません。フィールドを効果的にリセットするには:

  1. 検証が失敗した場合にのみコンポーネントの値をリセットするリスナー イベントを定義します。

    public void resetPwd(ComponentSystemEvent evt) throws IOException {
    HtmlInputSecret txt = (HtmlInputSecret) evt.getComponent();
    if(!txt.isValid()){ //make sure that the validation failed 
        txt.resetValue();
       }
    
    }
    
  2. postValidateリスナー イベントをパスワード コンポーネントのイベント リスナーにアタッチします。これにより、検証が失敗した後にのみ値がリセットされるようになります。

      <h:inputSecret id="password" required="true" 
                    requiredMessage="Please enter your password"
                    value="#{userActionManager.dto.password}" 
                    validator="#{userActionManager.validateSamePassword}">
                        <f:event name="postValidate" listener="#{userActionManager.resetPwd}"/>
                        <a4j:ajax event="change" execute="@this" bypassUpdates="true" />
                </h:inputSecret>
    

ここで重要なのは、適切なタイミングで値をリセットすることです。時間のその他のオプションには、preRenderViewイベントとpostAddToViewイベントが含まれます。全てはタイミング次第

于 2013-03-17T07:27:25.450 に答える
1

コンポーネントが無効とマークされている場合、モデル値 (この場合は からの値dto) は再表示されません。代わりに、送信された値を再表示します。送信された値を空の文字列に設定するだけです。

交換

dto.setPassword(null);

((UIInput) component).setSubmittedValue("");
于 2013-03-17T15:05:46.523 に答える