2011-01-06 6 views
1

<c:choose>をjsfページのコンポーネント内で使用することはできません。私は、代替があるかどうかを調べようとしています。私はトマホークを見ました。それは私が本当に必要なものではありません。私は列の負の数と正の数を検証しようとしています。私が作成した2つのバリデータタグの中から選択できるようにしたい。私はレンダリングされた属性を使ってみましたが、それでも動作しません。以下は私が探しているものですが、私が望むように動作していません。誰にも何か提案はありますか?c:JSFでf:validatorを使用する場合の選択肢がありますか

ありがとうございます。

<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

別のバリデータをラップし、属性として追加します。

NumberValidator
<f:validator validatorId="hits.numberValidator"/> 
<f:attribute name="posValue" value="#{entry.dataEntry.posValue}" /> 
<f:attribute name="negValue" value="#{entry.dataEntry.negValue}" /> 

そして:f:attributeが結ばれているので#{entry}が、実際にh:dataTableまたはui:repeatvar属性で宣言されているような反復項目であるとき、これは動作しないことを

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); 
} 

注意その出力ではなく、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); 
    } 
} 

(これらのバリデータをスレッドセーフである場合のみ)代わりにインスタンス変数にすることができます(スレッドセーフである場合のみ)

+0

ありがとうBalusC!最初のオプションが働いた。 – Perry