是否有替代c:在使用f:validator时选择JSF

时间:2011-01-06 21:35:04

标签: jsf

我知道我不能在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>

1 个答案:

答案 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}实际上是varh: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的实例变量(仅当它们是线程安全的时))