2012-10-15 108 views
6

我有以下的複合成分:有條件地呈現元素的屬性在複合組件

<?xml version="1.0" encoding="UTF-8"?> 
<ui:component xmlns="http://www.w3.org/1999/xhtml" 
    xmlns:h="http://java.sun.com/jsf/html" 
    xmlns:ui="http://java.sun.com/jsf/facelets" 
    xmlns:c="http://java.sun.com/jsp/jstl/core" 
    xmlns:f="http://java.sun.com/jsf/core" 
    xmlns:p="http://primefaces.org/ui" 
    xmlns:fn="http://java.sun.com/jsp/jstl/functions" 
    xmlns:composite="http://java.sun.com/jsf/composite"> 

    <composite:interface> 
     <composite:attribute required="true" name="field" /> 
     <composite:attribute required="true" name="value" /> 
     <composite:attribute required="false" name="size"/> 
    </composite:interface> 

    <composite:implementation> 
    ... 
      <div class="wrapper"> 
       <h:inputText value="#{cc.attrs.value}" 
        id="#{field.id}" 
        rendered="#{field.rendered}" 
        size="#{cc.attrs.size}"> 
       </h:inputText> 
       <h:messages for="#{field.id}" styleClass="errorMessage"/> 
      </div> 
    ... 
    </composite:implementation> 
</ui:component> 

的問題是,當我使用該組件沒有設置其size屬性,它仍然得到了呈現爲size=0 html輸入元素。

我想要的是僅當嵌套的h:inputText的屬性具有有效值(例如非空)時才呈現它。或者,我想公開所有嵌套元素的屬性,如果他們沒有明確覆蓋。

怎麼可能?

+0

請注意標記,複合組件不是自定義組件。另見http://stackoverflow.com/questions/5704620/what-is-the-difference-between-custom-components-and-composite-components – BalusC

+0

感謝您的更正。我意識到這一點,但我有點粗心,也許我需要休息幾分鐘:S –

回答

10

可以使用JSTL <c:if>有條件和<f:attribute>構建視圖指定單獨的屬性:

<h:inputText ...> 
    <c:if test="#{not empty cc.attrs.size}"> 
     <f:attribute name="size" value="#{cc.attrs.size}" /> 
    </c:if> 
</h:inputText> 

另一種方法是指定複合部件屬性的缺省:

<cc:attribute name="size" required="false" default="10" /> 
+0

謝謝!它的作品,但我很奇怪,如果我直接添加''或''我得到'javax.servlet.ServletException:參數類型不匹配',並且如果我添加''我得到'預期對於屬性「value」'打開引號。 –

+0

它必須是一個「整數」而不是「字符串」。 – BalusC

+0

是的,但如何在'value'屬性中添加'Integer'?用引號將其解釋爲'String',不帶引號則異常不同。 –

1

附加到BalusC的帖子:

您必須使用

在CC

類型= 「INT」:屬性標籤:

CC:屬性名= 「最大長度」 類型= 「INT」

0

相信有用於訪問的屬性的替代方法。在訪問使用java保留關鍵字命名的屬性時,我將它用於JSF 2。

{cc.attrs ['size']}