9

JSF検証の特定のユースケースがあります。たとえば、次のinputTextフィールドがあります。

<p:inputText id="input" required="#{myBean.required}" value="#{myBean.value}" maxlength="20" disabled="#{myBean.disabled}">
  <p:ajax event="blur" process="@this" update="name" listener="#{myBean.listener}"/>
</p:inputText>

入力の値は数値です (これは複合コンポーネントの一部であるため、場合によっては文字列になることもありますが、これが数値であると想定した方が問題はより適切に説明されます)。この入力はフォームの一部であり、フォームの最後に送信ボタンがあります。

<p:commandButton value="Save" actionListener="#{myBean.save}"/>

私のリクエストは何ですか:

  1. 送信ボタンが押されると、すべての検証が処理され、これで問題ありません。これは正常に機能します。
  2. フィールドが空でない場合に入力フィールドでぼかしイベントが発生すると、数値の検証を処理する必要があり、これも問題ありません。最後にname、いくつかの値を持つ id でフィールドを更新します。
  3. 今、私は問題を抱えています。私の 3 番目の要求は、入力が空の場合、入力の検証を処理すべきではありません。これは、 id でフィールドをクリアする特殊なケースnameです。これは、入力に既に入力されているテキストを削除し、コンポーネントからフォーカスを削除する場合 (たとえば TAB を押す) の場合にも当てはまります。その場合、AJAX 要求も処理する必要があり、名前の入力もクリアされます。

この入力フィールドが空の場合、この ajax イベントに対してのみ、この入力フィールドの検証を無効にするにはどうすればよいですか?

4

2 に答える 2

12

入力のrequired属性で、保存ボタンが押されているかどうかを確認します (これは、要求パラメーター マップ内のクライアント ID の存在によって識別できます)。

<h:form>
    <p:inputText ... required="#{not empty param[save.clientId] and myBean.required}" />

    <p:commandButton binding="#{save}" ... />
</h:form>

(注: Bean プロパティにバインドしないでください。コードはそのままです)

この方法ではtrue、保存ボタンが実際に押されたときにのみ評価されます。

または、bindingボタンのクライアント ID のハードコーディングに問題がある、または問題がない場合:

<h:form id="formId">
    <p:inputText ... required="#{not empty param['formId:buttonId'] and myBean.required}" />

    <p:commandButton id="buttonId" ... />
</h:form>
于 2013-02-06T13:48:39.340 に答える
2

入力が空の場合は、入力を受け入れるときに必要な属性を削除するだけです。次に、空の入力または数値入力のみを受け入れるカスタムバリデーターを記述します。

<p:inputText id="input" value="#{myBean.value}" maxlength="20" disabled="#{myBean.disabled}" validator="customerNumericInputValidator">   <p:ajax event="blur" process="@this" update="name" listener="#{myBean.listener}"/> </p:inputText>
public class customerNumericInputValidator implements Validator {

    @Override
    public void validate(FacesContext facesContext, UIComponent uIComponent,
            Object object) throws ValidatorException {

        String number = (String) object;
        number = Strings.nullToEmpty(number).trim();

        //if the request is a full request then number can not be empty
        if(!FacesContext.getCurrentInstance().isPostback() && Strings.isNullOrEmpty(number))
        {
             FacesMessage message = new FacesMessage();
             message.setSummary(Messages.getMessage("error empty value"));
             message.setSeverity(FacesMessage.SEVERITY_ERROR);
             throw new ValidatorException(message);
        } 

        if(!Strings.isNullOrEmpty(number))
        { 
            if(!isNumber(number))
            {
               FacesMessage message = new FacesMessage();
               message.setSummary(Messages.getMessage("error not numerical value"));
               message.setSeverity(FacesMessage.SEVERITY_ERROR);
               throw new ValidatorException(message);
            }
        }
    }

}
于 2013-02-06T13:21:17.423 に答える