我知道我不能在jsf页面的组件中使用<c:choose>
。我想看看是否有其他选择。我看着战斧,这不是我真正需要的。我试图在列中验证负数和正数。我希望能够在我创建的2个验证器标签之间进行选择。我尝试使用呈现的属性,但它仍然无法正常工作。下面是我正在寻找的东西,但它不像我想要的那样工作。有没有人有任何建议?
提前致谢。
<c:choose>
<c:when test="#{entry.dataEntry.posValue}">
<f:validator validatorId="hits.positiveNumberValidator"/>
</c:when>
<c:otherwise test="#{entry.dataEntry.negValue}">
<f:validator validatorId="hits.negativeNumberValidator"/>
</c:otherwise>
</c:choose>
答案 0 :(得分:1)
换行另一个验证器并将它们添加为属性。
<f:validator validatorId="hits.numberValidator"/>
<f:attribute name="posValue" value="#{entry.dataEntry.posValue}" />
<f:attribute name="negValue" value="#{entry.dataEntry.negValue}" />
然后在NumberValidator
:
Boolean negValue = component.getAttributes().get("negValue");
if (posValue != null && posValue) {
new PositiveNumberValidator().validate(context, component, value);
}
Boolean posValue = component.getAttributes().get("posValue");
if (negValue != null && negValue) {
new NegativeNumberValidator().validate(context, component, value);
}
请注意,当#{entry}
实际上是var
或h:dataTable
的{{1}}属性中声明的迭代项时,这不起作用,因为{{1} }绑定到JSF组件,而不是它的输出。由于变量名称ui:repeat
暗示实际情况更少或更多,因此您可以采用以下方式。
将收藏品包裹在DataModel
:
f:attribute
在#{entry}
或private DataModel entries;
public Bean() {
entries = new ListDataModel(someDAO.list());
}
// ...
中使用它,如下所示:
h:dataTable
在ui:repeat
中实现验证器,如下所示:
<h:dataTable value="#{bean.entries}" var="entry">
<h:column>
<h:inputText validator="#{bean.numberValidator}" />
</h:column>
</h:dataTable>
(您可能希望使这些验证器成为bean的实例变量(仅当它们是线程安全的时))