【问题标题】:Optional field with minimum length validation in JSFJSF 中具有最小长度验证的可选字段
【发布时间】:2013-08-28 10:14:41
【问题描述】:

我有一个带有可选字段的注册表单,但如果您输入任何值,它应该超过 2 个字符。 如果用户将该字段留空,如何跳过验证?

 <h:inputText id ="fooid" maxlength="50" tabindex="4" value="#{registrationBean.foo}"  validatorMessage="Please enter two or more characters">
 <f:validateRegex pattern="^[A-Za-z-_./\s]{2,50}$"/>
 <f:ajax event="blur" render="fooPanel" />
 </h:inputText>

任何帮助将不胜感激。

【问题讨论】:

  • 不熟悉JSF,但是你能用模式写“或”运算符吗?然后模式将变为 "(^$|^A-Za-z-_./\s]{2,50}$)" 表示“空字符串,或者 2 个或更多字母”
  • 您使用的是哪个 JSF impl/version?这个结构对我来说很好。如果字段为空,则不会调用验证正则表达式。顺便说一句,你忘记了maxlength="50" 在场上。
  • @balusc 我正在使用 jsf-impl-2.0.3-b05.jar。
  • 哇,那是古老的(3 岁)。目前已经有 30 多个新版本。最新的是 2.1.25(暂时不要抢 2.2.x)。去这里获取它:javaserverfaces.java.net 并重试。顺便说一句,如果您发现 100 个其他(次要)问题和烦恼通过这一重大升级步骤立即得到解决,请不要感到惊讶。
  • 感谢@BalusC,我使用新的 2.1.25 impl javax.faces-2.1.25.jar 进行了测试。还是同样的问题。我觉得这与正则表达式模式有关。

标签: ajax validation jsf facelets


【解决方案1】:

如果您添加以下上下文参数,它会按预期工作:

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

这将告诉 JSF 将提交的空字符串值解释为 null。如果值为null,则只有required="true" 验证器会被触发,而其他验证器不会。另一个好处是,当最终用户没有填写输入时,它可以让您的模型没有杂乱的空字符串。

如果由于某种原因这不是一个选项,例如当您的模型错误地依赖空字符串时,您最好的选择是也检查正则表达式中的空字符串:

 <f:validateRegex pattern="^$|^[A-Za-z-_./\s]{2,50}$" />

【讨论】:

  • 多年后这对我有所帮助。似乎很奇怪,这不是使用 f:validateLongRange 的数字的默认行为。
猜你喜欢
  • 2023-01-30
  • 1970-01-01
  • 1970-01-01
  • 2018-05-29
  • 2016-10-03
  • 1970-01-01
  • 2015-12-01
  • 2015-04-09
  • 1970-01-01
相关资源
最近更新 更多