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 iscatalina.out文件中获取我打印的所有消息System.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 版及更高版本,它不能对空值或空值进行验证失败,除非它专门用于处理空值或空值。提供了一个应用程序范围,以允许为 JSF 1.2 设计的验证器与 JSF 2 及更高版本一起使用。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是失败的。并且用户将名称字段的值删除为空白,它会抛出请输入名称消息。但是名称字段在page 仍然是预值(不是空白)。
所以这是一个 JSF 错误。要解决这个问题,您必须更改 HtmlBasicRenderer#getCurrentValue() 的第一部分,请看一下:JSF 2 - Bean Validation: validation failed -> empty values are replaceed with last valid来自托管 bean 的值

于 2012-09-03T01:48:50.523 回答
0

我猜您可能会验证 Validator 传递的值是否不为空

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 回答
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() {
...

另请注意,字体标签在 HTML 4.01 中已弃用,试试这个:

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