h:项目在线时消息验证无效

时间:2012-09-02 12:00:37

标签: jsf web-applications jsf-2 validation

我正在使用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.out,我在System.out.println

下收到了所有邮件

问题是当我在那时传递数据时,只调用验证。其他验证没有发生。请告诉我这里缺少的东西。

3 个答案:

答案 0 :(得分:1)

您的问题的原因可能是,如果您要验证空值,则应更改web.xml的设置,以允许空字段。

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

但是权威并没有建议这种方式。 jsf医生说:

  

验证器完全符合版本2及更高版本   规范,它必须不会失败验证null或空值   除非它专门用于解决空值或空值。一个   提供应用程序范围以允许验证器   专为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失败了。用户将名称字段的值删除为空白,它将抛出请输入名称信息。但是页面中的名称字段仍然是预值(非空白) 所以这是一个JSF错误。为了解决这个问题,你要改变HtmlBasicRenderer#getCurrentValue()的第一部分,请看一下:JSF 2 - Bean Validation: validation failed -> empty values are replaced with last valid values from managed bean

答案 1 :(得分: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

答案 2 :(得分: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和&lt; 10,只是&lt; 10.使用属性requiredMessage为所需属性添加自己的消息。

请注意,您不需要使用StringUtils.isNotEmpty(String),只需:

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

另请注意,HTML 4.01中不推荐使用font标记,请尝试以下操作:

<h:message for="fullName" style="color: red"/>