2011-01-06 10 views
1

我知道我不能在jsf頁面的組件中使用<c:choose>。我想看看是否有其他選擇。我看着戰斧,那不是我真正需要的。我試圖驗證列中的負數和正數。我希望能夠在我創建的2個驗證器標籤之間進行選擇。我嘗試使用呈現的屬性,但它仍然無法正常工作。下面是我正在尋找的東西,但它不像我想要的那樣工作。有沒有人有什麼建議??是否有替代c:使用f:驗證器時在JSF中選擇

在此先感謝。

<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

包裹在另一個驗證器中,並將它們添加爲屬性。

<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:dataTableui:repeatvar屬性聲明一個迭代的項目,因爲f:attribute綁工作,到JSF組件,而不是它的輸出。由於變量名稱#{entry}暗示事實上是這樣,所以下面介紹如何做到這一點。

裹在DataModel集合:

private DataModel entries; 

public Bean() { 
    entries = new ListDataModel(someDAO.list()); 
} 

// ... 

如下使用它h:dataTableui: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的實例變量(僅當它們是線程安全的時候))

+0

謝謝BalusC!第一個選項奏效。 – Perry 2011-01-10 21:15:22