2011-09-01 48 views
4

我已經爲jsf編寫了一個自定義組件。渲染器擴展com.sun.faces.renderkit.html_basic.ListboxRenderer。我的組件位於「javax.faces.SelectMany」-Family中。JSF自定義組件:如何獲取屬性<f:ajax />

在JSF頁面的代碼如下所示:

<tb:myMenu id="testId" value="#{valueForm.someValue}"> 
    <f:selectItem /> 
    <f:selectItems value="#{dao.getSomething()}" /> 
    <f:ajax render=":myTestForm:myId"/> 
</tb:myMenu> 

我怎樣才能在我的渲染器渲染屬性的值?我只需要這個值,應該不會寫入我的組件(就像RenderKitUtils類一樣)

我現在的解決方案如下所示。它有效,但我不高興。

if (component instanceof ClientBehaviorHolder) { 
     Map<String, List<ClientBehavior>> behaviors = ((ClientBehaviorHolder)component).getClientBehaviors(); 
     if (behaviors != null && behaviors.keySet().contains("valueChange")) { 
      for (ClientBehavior cb: behaviors.get("valueChange")) { 
       if (cb instanceof AjaxBehavior) { 
        System.out.println("AJAX: " + ((AjaxBehavior) cb).getRender()); 
       } 
      } 
     } 
    } 

回答

1

你究竟對此不滿意?太冗長了?那麼,確實沒有JSF API提供的實用方法,也沒有Mojarra impl提供的實用方法。它只是停在這裏。你必須自己寫。

至少,在你的代碼段第二if支票null是多餘的,因爲它never回報null。此外,同一行上的behaviors.keySet().contains(key)也可以簡化爲behaviors.containsKey(key)。鑑於它永遠不會返回null的事實,您也可以立即獲取行爲列表,而不用檢查它。

終於只是隱藏它在一些實用的方法。

public static Set<String> getClientBehaviorRenderIds(UIComponent component, String behaviorName) { 
    Set<String> clientBehaviorRenderIds = new HashSet<String>(); 

    if (component instanceof ClientBehaviorHolder) { 
     List<ClientBehavior> clientBehaviors = ((ClientBehaviorHolder) component).getClientBehaviors().get(behaviorName); 

     if (clientBehaviors != null) { 
      for (ClientBehavior clientBehavior : clientBehaviors) { 
       if (clientBehavior instanceof AjaxBehavior) { 
        clientBehaviorRenderIds.addAll(((AjaxBehavior) clientBehavior).getRender()); 
       } 
      } 
     } 
    } 

    return clientBehaviorRenderIds; 
} 

,這樣就可以按如下方式使用它:

Set<String> renderIds = getClientBehaviorRenderIds(component, "valueChange"); 
// ... 

如果是嵌套檢查這是令人不安的,你也可以做相反的檢查(這也是鑽嘴魚科是怎麼寫的一般;深if嵌套確實是一個貧窮的做法):

public static Set<String> getClientBehaviorRenderIds(UIComponent component, String behaviorName) { 
    Set<String> clientBehaviorRenderIds = new HashSet<String>(); 

    if (!(component instanceof ClientBehaviorHolder)) { 
     return clientBehaviorRenderIds; 
    } 

    List<ClientBehavior> clientBehaviors = ((ClientBehaviorHolder) component).getClientBehaviors().get(behaviorName); 

    if (clientBehaviors == null) { 
     return clientBehaviorRenderIds; 
    } 

    for (ClientBehavior clientBehavior : clientBehaviors) { 
     if (clientBehavior instanceof AjaxBehavior) { 
      clientBehaviorRenderIds.addAll(((AjaxBehavior) clientBehavior).getRender()); 
     } 
    } 

    return clientBehaviorRenderIds; 
} 
+0

好了,我想有可能是一個實用的方法,這是我看到didn't。 感謝反向檢查的東西;) – Lodger

相關問題