2010-12-02 95 views
4

我想創建複合組件,並將一些驗證程序附加到它的子項,但我希望來自驗證的消息被附加到複合組件,而不是它的子項。JSF複合組件驗證

在使用複合材料部件的頁面我想是這樣的:

<zzz:mycomponent id="my" /> 
<h:message for="my" /> 

現在,這是行不通的,因爲消息是通過組件的孩子,不是複合組件本身。如何使整個組件?

甚至更​​好,我想驗證添加到複合材料部件,如:

<zzz:mycomponent id="my" validator="#{bean.validateComposite}" /> 

和接收器像布爾數組作爲值,因爲複合材料構件內有h:selectBooleanCheckbox元素。那可能嗎?

回答

1

也許很遲在這個問題上作出迴應,但是這是我應該做的:

<zzz:mycomponent id="my"> 
    <f:event type="postValidate" listener="#{bean.doValidation}"/> 
</zzz:mycomponent> 

的doValidation孩子的在「容器」驗證後,然後調用。該方法llooks這樣的:

public void doValidation(ComponentSystemEvent event) { 
    ... 
} 

而且你必須在方法2個選項:子組件(event.getComponent()的getChildren()),並做你想做的

  • 訪問處理這些孩子提交的價值觀。

  • 或者遍歷用FacesMessages和重新分配的clientId使他們放在容器組件(ID =我)

1

你必須把下一個代碼的複合定義中

 <cc:interface> 
      ..... 
      <cc:editableValueHolder name="attName" targets="Idcomponent" /><!--It allows to acces to the composite--> 
      <cc:facet name="textMessage"/>         <!--Define the Facet--> 
     </cc:interface> 
     <cc:implementation id="#{cc.attrs.id}" > 
      ...... 
      <h:inputText id="Idcomponent" value="#{cc.attrs.value}" required="#{cc.attrs.required}"/> 
      <cc:renderFacet name="textMessage"/> 
     </cc:implementation> 

您可以在JSF頁面

 <zzz:textBox id="txbTest" label="#{}" value="#{}" > 
      <f:validateLongRange for="attName" minimum="-10" maximum="10"/> 
      <f:facet name="textMessage"> 
       <h:message for="value" style="color: blue"/> 
      </f:facet> 
     </zzz:textBox> 

或者另一種選擇使用可以是:

 <zzz:textBox id="txbTest" label="#{}" value="#{}" validator="#{bean.yourValidateMethod}" > 
      <f:facet name="textMessage"> 
       <h:message for="value" style="color: blue"/> 
      </f:facet> 
     </zzz:textBox>