2010-11-11 73 views
0

我有這樣一段代碼:混合JSTL標籤JSF標籤給出了奇怪的結果

<c:if test="#{utils.getCounterOfCharOccurence(hideTypes, ';') != 0}"> 
    <ui:repeat value="#{document.instanceList}" var="instance"> 
    <c:set var="columnRendered" value="true"></c:set> 
    <c:forEach items="${hideTypes.split(';')}" 
       var="hideType"> 
    <h:outputText value="#{hideType eq instance.documentInstanceType.mimeType}"/> 
    <c:if test="#{hideType eq instance.documentInstanceType.mimeType}"> 
     <c:set var="columnRendered" value="false"></c:set> 
     <h:outputText value="#{columnRendered}|"/> 
    </c:if> 
    </c:forEach> 
    <a:outputPanel rendered="#{columnRendered == 'true'}"> 
    <up:mimeTypeIcon type="#{instance.documentInstanceType.mimeType}" 
         icon="#{instance.documentInstanceType.iconPath}" 
         key="#{instance.instanceKey}" referenced="false"/> 
    </a:outputPanel> 
    </ui:repeat> 

    </c:if> 

正如你看到的,我渲染outputPanel只有當columnRendered是真實的。

嗯,有這種情況的情形(僅用於測試批准它應該做的):

<h:outputText value="#{hideType eq instance.documentInstanceType.mimeType}"/> 

是真實的,所以應該在C輸入:if和switch columnRendered爲false。但它沒有,所以columnRendered是真的永遠...

你知道爲什麼嗎?

回答

4

JSF和JSTL不會像編碼期望的那樣同步運行。 JSTL在構建視圖的時間(當JSF組件樹將被填充時)以及JSF在視圖組件樹的渲染時間(當要生成HTML輸出時)中運行時運行。您可以按如下方式對其進行可視化:JSTL首先從上到下運行,然後將結果移交給JSF,然後JSF又從上到下運行。

在您的具體情況下,對象instance從未出現在JSTL中。

而不是c:forEach,您應該使用ui:repeat而不是c:if您應該使用JSF組件的rendered屬性。我想重寫一下代碼,但hideTypes的用法是一團糟。相反,在模型中將其轉換爲List<String>,使用純JSF將會更容易。假設hideTypesList<String>

<h:panelGroup rendered="#{not empty hideTypes}"> 
    <ui:repeat value="#{document.instanceList}" var="instance"> 
     <a:outputPanel rendered="#{!hideTypes.contains(instance.documentInstanceType.mimeType)}"> 
      <up:mimeTypeIcon type="#{instance.documentInstanceType.mimeType}" 
       icon="#{instance.documentInstanceType.iconPath}" 
       key="#{instance.instanceKey}" referenced="false"/> 
     </a:outputPanel> 
    </ui:repeat> 
<h:panelGroup> 
+0

嗨。感謝您的評論...問題是,我想渲染outputPanel當且僅當document.instanceList的MIME類型中沒有隱藏類型...因此檢查每個文檔實例MIME類型集以查看是否在hideTypes組。如果沒有,渲染它....我想我會只是在java iso jsf :) :) – 2010-11-11 13:44:44

+0

我更新了一個有教養的猜測答案。 – BalusC 2010-11-11 13:48:43

+0

gr8..but hideTypes是String []。 jsf中是否有任何方法:Arrays.asList(...)。contains(...)? – 2010-11-11 13:53:08