包裹在另一個驗證器中,並將它們添加爲屬性。
<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}
實際上就像是在的h:dataTable
或ui:repeat
var
屬性聲明一個迭代的項目,因爲f:attribute
綁工作,到JSF組件,而不是它的輸出。由於變量名稱#{entry}
暗示事實上是這樣,所以下面介紹如何做到這一點。
裹在DataModel
集合:
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
實現驗證如下:
public void numberValidator(FacesContext context, UIComponent component, Object value) throws ValidatorException) {
Entry entry = (Entry) entries.getRowData();
if (entry.isPosValue()) {
new PositiveNumberValidator().validate(context, component, value);
}
if (entry.isNegValue()) {
new NegativeNumberValidator().validate(context, component, value);
}
}
(你可能想讓這些驗證器代替bean的實例變量(僅當它們是線程安全的時候))
謝謝BalusC!第一個選項奏效。 – Perry 2011-01-10 21:15:22