2010-09-14 33 views
22

我在尋找一個支持的方式呈現在JSF代碼段,我通常使用這種方法:替代UI:在JSF片段

<ui:fragment rendered="#{condition}"> 
    <h:outputText value="text 1"/> 
    <h:outputText value="text 2"/> 
    <h:outputText value="text 3"/> 
</ui:fragment> 

由於UI:片段不支持呈現最IDE(如NetBeans的將其標記爲錯誤,但它的作品,因爲在JSF參數繼承。解決這個

一種方法是使用其他結構(例如,如果你使用SEAM),可以使用

<s:div rendered="#{condition}"> 
    .... 
</s:div> 

另一種方式是設置在這樣所有內部內容的呈現:

<h:outputText value="text 1" rendered="#{condition}"/> 
<h:outputText value="text 2" rendered="#{condition}"/> 
<h:outputText value="text 3" rendered="#{condition}"/> 

但是,因爲你必須添加呈現給每一個元素,我不喜歡這種方式。

另一種方法是使用<c:if test="#{condtion}"> BUT c:如果從JSF樹中刪除元素,而不是你總是想要做的事,特別是如果你使用AJAX。

所以你們有另一種解決方案?

回答

46

由於ui:fragment不支持渲染最IDE的(像Netbeans的將其標記爲錯誤,但它的作品,因爲在JSF參數繼承)

這其實是一個錯誤的JSF 2.0的Facelets標記文件聲明(在Mojarra,這是com/sun/faces/metadata/taglib/ui.taglib.xml文件)。 rendered屬性在標籤文件聲明中(也在JSF 2.0 <ui:fragment> tag documentation中)被忽略並丟失,而真的存在於UIComponent中。 IDE驗證基於標籤文件聲明,因此它提供了誤導性的驗證錯誤。這個問題在JSF 2.1中得到解決,缺少的屬性被添加到標記文件聲明中(也在JSF 2.1 <ui:fragment> tag documentation中)。

如果要麼只是忽略了IDE的警告或升級到JSF 2.1是不是一種選擇,那麼你可以考慮使用the <h:panelGroup> component代替:

<h:panelGroup rendered="#{condition}"> 
    <h:outputText value="text 1"/> 
    <h:outputText value="text 2"/> 
    <h:outputText value="text 3"/> 
</h:panelGroup> 

它輸出反正沒事,如果你不指定idstylestyleClass等屬性,否則將呈現簡單的<span>

如果您擁有的是純粹的香草HTML(即無JSF組件),那麼您還可以考慮使用<f:verbatim>

<f:verbatim rendered="#{condition}"> 
    text 1 
    text 2 
    text 3 
</f:verbatim> 

然而,<f:verbatim>在JSF 2.0棄用(這又還通過的方式記錄錯誤時,JSF 2.0 <f:verbatim> tag documentation沒有提到棄用,但JSF 2.1 <f:verbatim> tag documentation一樣)。