【发布时间】:2010-12-10 11:49:28
【问题描述】:
我的表单中存在用户必须填写至少一个字段的情况。使用“必需”命令,我不能这样做。在 seam 中验证这一点的最佳方法是什么?我不想使用 javascript。
谢谢!
【问题讨论】:
标签: jsf seam validation
我的表单中存在用户必须填写至少一个字段的情况。使用“必需”命令,我不能这样做。在 seam 中验证这一点的最佳方法是什么?我不想使用 javascript。
谢谢!
【问题讨论】:
标签: jsf seam validation
JSF2 将允许您进行表单级别的验证。现在,您将不得不使用以下任一方法:
【讨论】:
让required 属性的结果取决于请求参数映射中其他输入字段的存在。
<h:form id="form">
<h:inputText id="input1" value="#{bean.input1}" required="#{empty param['form:input2'] and empty param['form:input3']}" />
<h:inputText id="input2" value="#{bean.input2}" required="#{empty param['form:input1'] and empty param['form:input3']}" />
<h:inputText id="input3" value="#{bean.input3}" required="#{empty param['form:input1'] and empty param['form:input2']}" />
</h:form>
或者,您也可以使用组件绑定并使用UIInput#getValue() 来检查先前组件的值,并使用UIInput#getSubmittedValue() 来检查它们是否有待验证的组件(组件按顺序处理为它们出现在组件树中)。这样您就不需要硬编码客户端 ID。您只需要确保绑定名称不会与现有托管 bean 名称冲突。
<h:form>
<h:inputText binding="#{input1}" required="#{empty input2.submittedValue and empty input3.submittedValue}" />
<h:inputText binding="#{input2}" required="#{empty input1.value and empty input3.submittedValue}" />
<h:inputText binding="#{input3}" required="#{empty input1.value and empty input2.value}" />
</h:form>
【讨论】:
如果你不想使用 required 属性或 javascript,那么有两种方法。
其中一个是创建验证器,但在我看来这太过分了。
我只会检查您的 bean 中的输入是否为空或为空。
if ("".equals(theFieldYouWantToCheck) || theFieldYouWantToCheck == null) {
//Either throw exception or return "false" so that you can handle it
}
【讨论】:
如果您使用的是 RichFaces,那么您可以执行如下验证(请参阅 http://mkblog.exadel.com/ria/richfaces-ria/richfaces-built-in-client-functions/):
<h:form id="form">
<h:inputText id="input1" value="#{bean.input1}" />
<h:inputText id="input2" value="#{bean.input2}"
required="#{empty rich:findComponent('input1').submittedValue}"
requiredMessage="At least one of the fields input1 and input2 must be filled."/>
</h:form>
注意表达式rich:findComponent('input1') 等价于uiComponent['input1']。原因是Seam提供了动态映射uiComponent来查找UI组件。
【讨论】: