0

JSF 2.0を使用してWebアプリケーションを作成しており、フルネームの検証を行っています。

<h:inputText value="#{PersonalInformationDataBean.fullName}" size="75" id="fullName" >
     <f:validator validatorId="fullNameValidator" />
</h:inputText>
<font color="red"><br /><h:message for="fullName"/></font>

以下のJavaで私が持っているものです

public class FullNameValidator implements Validator {

    public void validate(FacesContext context, UIComponent component, Object value)
            throws ValidatorException {

        String enteredName = (String) value;
        // Pattern p = Pattern.compile("([a-zA-Z]+|[a-zA-Z]+\\s[a-zA-Z]+)");
        Pattern p = Pattern.compile("([a-zA-Z\\s]+)");
        Matcher m = p.matcher(enteredName.trim());
        System.out.println("trimmed data is " + enteredName.trim());
        boolean matchFound = m.matches();

        if (enteredName.trim().length() == 0) {
            FacesMessage message = new FacesMessage();
            message.setSummary("Please enter name.");
            throw new ValidatorException(message);
        }

        if (enteredName.trim().length() < 10) {
            FacesMessage message = new FacesMessage();
            message.setSummary("Name should be atleast 10 characters.");
            throw new ValidatorException(message);
        }

        if (!matchFound) {
            FacesMessage message = new FacesMessage();
            message.setSummary("Invalid Name.");
            throw new ValidatorException(message);
        }

//        FacesMessage message = new FacesMessage();
//        message.setSummary("");
//        throw new ValidatorException(message);

    }
}

プロジェクトをローカルで実行すると、完全に実行されます。

このプロジェクトをオンラインで行ったとき、私は問題に直面しています。

++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ fullName data as        +   Error Message                      +
+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
+ 123343543534545         +   Invalid Name                       +
+ fahim                   +   Full name should be 10 characters  +
+ null (blank)            +   NO MESSAGE, here I was expecting   +
+                         +   result as Please enter name        +
++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++

値を渡さないのに、名前を入力してくださいというエラーメッセージが表示されないのはなぜかわかりません。私がここで何を見逃しているのか分かりますか?

ノート:

私は私が下に印刷したすべてのメッセージを受け取るファイルにtrimmed data isさえ入りませんcatalina.outSystem.out.println

問題は、その時点でデータを渡すと、検証のみが呼び出されることです。それ以外の場合、検証は行われません。ここで欠けているものを教えてください。

4

3 に答える 3

1

あなたの質問の理由は、空の値を検証したい場合は、web.xml空のフィールドを許可するように設定を変更する必要があるためかもしれません。

  <context-param>
    <param-name>javax.faces.VALIDATE_EMPTY_FIELDS</param-name>
    <param-value>true</param-value>
  </context-param>

しかし、この方法は当局によって提案されていません。jsfドキュメントは次のように述べています:

バリデーターがバージョン2以降の仕様に完全に準拠するためには、特にnullまたは空の値に対処することを意図していない限り、nullまたは空の値の検証に失敗してはなりません。JSF1.2用に設計されたバリデーターがJSF2以降で動作できるように、アプリケーション全体が提供されます。この下位互換性の動作を有効にするには、javax.faces.VALIDATE_EMPTY_FIELDSをfalseに設定する必要があります。] 1

したがって、jsf2.0を使用している場合、空の値を検証する別の方法は、次のように追加できることです。
<h:inputText value="#{PersonalInformationDataBean.fullName}" size="75" id="fullName" required="true" requiredMessage="Please enter name." > また、次のようにweb.xml'設定を確認してください。

<context-param>
  <param-name>javax.faces.INTERPRET_EMPTY_STRING_SUBMITTED_VALUES_AS_NULL</param-name>
  <param-value>true</param-value>
</context-param>

しかし、この方法は別の不合理なことを非難します。名前を入力すると何かが起こり、このフォームはこのsumbitで失敗します。ユーザーが名前フィールドの値を空白に削除すると、名前メッセージを入力してくださいがスローされます。ページはまだ前の値です(空白ではありません)。
これはJSFのバグです。これを修正するには、HtmlBasicRenderer#getCurrentValue()の最初の部分を変更する必要があります。これを見てください:JSF 2-Bean Validation:検証に失敗しました->空の値は最後の有効な値に置き換えられます管理対象Beanからの値

于 2012-09-03T01:48:50.523 に答える
0

入力値が入力されていない場合、バリデーターは呼び出されません。検証するものがないという考えです。これは少し直感的ではありませんが、required = "true"属性を使用して、値が必要かどうかを確認する必要があります。別の方法があります:

<h:inputText label="Username" validatorMessage="The value entered for #{component.label} is invalid">
      <f:validateRegex pattern="[A-Za-z]{10,30}"/>
</h:inputText>

==0と<10の両方は必要ありません。<10だけです。属性requiredMessageを使用して、必要な属性に独自のメッセージを追加します。

StringUtils.isNotEmpty(String)を使用する必要はなく、次のようにするだけであることに注意してください。

String s;
if(s.isEmpty() {
...

フォントタグはHTML4.01で非推奨になっていることにも注意してください。これを試してください:

<h:message for="fullName" style="color: red"/>
于 2012-09-02T12:21:52.217 に答える
0

バリデーターによって渡された値が空でないかどうかを検証するかもしれないと思います

StringUtils.isNotEmpty(String) 

ValidatorExceptionサイズを確認する前にを投げます。

フィールドが必須の場合は、使用を検討することもできますrequired="true"

次のコードスニペットを追加することを検討してください。

String enteredName = (String) value;
// checks for null and empty String values
if ( StringUtils.isEmpty(enteredName) ) {
    FacesMessage message = new FacesMessage();
    message.setSummary("Please enter name.");
    throw new ValidatorException(message);
}
// rest of your validation code
于 2012-09-02T12:12:43.857 に答える