我正在使用JSF 2.0和Glassfish开发纯JavaEE6应用程序 . 我的JSF实现是Primefaces(除了Glassfish提供的Mojarra) .
我想验证JSF表单中2个密码字段的值是否相等 . 使用Seam,有一个整洁的组件 <s:validateEquality for="pw1"/>
. 我想在没有Seam的情况下做同样的事情,只使用JSF(或者可能是JSF库的一个组件) . 到目前为止,我只看到了使用自定义验证器验证表单的示例 . 但我想比较这些字段而不编写Java代码或Javascript代码 . 那可能吗?
这与Seam一样:
...
<h:inputSecret id="passwort" value="#{personHome.instance.password}"
redisplay="true" required="true">
<f:validateLength minimum="8"/>
<a:support event="onblur" reRender="passwortField" bypassUpdates="true" ajaxSingle="true" />
</h:inputSecret>
...
<h:inputSecret id="passwort2" required="true" redisplay="true">
<!-- find the JSF2.0-equivalent to this tag: -->
<s:validateEquality for="passwort"/>
<a:support event="onblur" reRender="passwort2Field" bypassUpdates="true" ajaxSingle="true" />
</h:inputSecret>
...
7 回答
Seam3 Faces module将支持"Cross-field form validation"即将发布的Alpha3版本 . 这是最小的代码解决方案的最佳选择,请参阅blog了解howto .
或者,我通过使用f:attribute标记将另一个表单字段的clientId传递给自定义验证器,然后使用传递给自定义验证器的UIComponent通过id访问另一个字段来以编程方式完成此操作 .
这是facelet文件:
这是验证器类:
我必须使用两种答案的混合才能成功 .
我使用ifischers短解决方案,但我的bean密码字段为空 .
所以我使用Brian Leathem的行来从上下文中获取UIInput:
你可以用这种非常简单的方式使用Primefaces标签:
Edited :在阅读之前,请考虑一下这个解决方案是否完美,答案是从2012年7月开始,所以请不要因为你不喜欢它而投票给我 . 世界发生了变化,现在我们有更好的组件和解决方案 .
没有解决方案,我被迫以丑陋的方式进行验证(不推荐) . 至少它有效,直到我找到更好的解决方案 .
在返回操作的方法中,我检查两个值,如果值不同,我在上下文中添加错误消息并返回null到导航处理程序 .
}
如果您正在使用JSF实用程序库OmniFaces,则可以使用<o:validateEqual> . 它还允许设置自定义消息 . showcase有一个实例,演示了验证密码确认的常用用法 . 在调用验证器之前,甚至不需要ajax来更新模型(如your own approach那样) .
这是最低必要代码:
不需要Java代码 .
您可以使用Apache MyFaces ExtVal轻松完成 .
这是我最终做到这一点的方式,我喜欢它因为它简短而容易 . 唯一的问题是它不是真的可以重复使用,但因为我只需要在一个案例中使用它,我宁愿保存一些LOC并以这种方式执行 . 我认为的片段:
我的支持 beans (只是重要部分):