2011-04-07 16 views
1

在數據表中的值,不需要工作時,在一定條件適用於翻譯(啓用鏈接):<c:choose> DataTable中

<h:outputLink disabled="#{pluginSummary.linkEnabled}" target="_blank" value="http://www.nessus.org/plugins/index.php"> 
    <c:choose> 
     <c:when test="#{not pluginSummary.isLinkEnabled()}" > 
      <h:outputText value="#{pluginSummary.pluginid}"/> 
     </c:when> 
     <c:otherwise> 
      <h:outputText value="#{texts[pluginSummary.pluginid]}"/> 
     </c:otherwise> 
    </c:choose> 
    <f:param name="id" value="#{pluginSummary.pluginid}"/> 
    <f:param name="view" value="single"/> 
</h:outputLink> 

但奇怪的是隻有第一個條件滿足,從來就沒有翻譯。爲了調試,我還添加了一個<h:outputText value="#{pluginSummary.isLinkEnabled()}/>,在那裏我看到了不同的真假條目,但是我的文本從未被翻譯過。

有沒有人知道,如果c:選擇在數據表中工作?我有什麼選擇?

回答

2

JSTL標籤和JSF標籤不會像編碼期望的那樣同步運行。 JSTL標籤在視圖構建時運行,JSF標籤在視圖渲染時運行。您可以按照以下方式對其進行可視化:JSTL首先從上到下運行,然後將生成的結果(不帶任何JSTL標記!)交給JSF,JSF再次從上到下運行以生成Web瀏覽器的HTML。

據我所知,#{pluginSummary}被定義爲數據表的var。在JSTL運行的那一刻,這個變量不可用,所以在那個點上它總是null

您需要改用JSF標籤/屬性。在這種情況下,您希望使用JSF rendered屬性。

<h:outputText value="#{pluginSummary.pluginid}" rendered="#{not pluginSummary.linkEnabled}" /> 
<h:outputText value="#{texts[pluginSummary.pluginid]}" rendered="#{pluginSummary.linkEnabled}"/> 

(請注意,我也改變了方法調用的性質,因爲這是清晰,因爲你並不需要傳遞任何參數)

+0

有時候,解決辦法是那麼容易。非常感謝。 – reen 2011-04-07 12:09:27

+0

不客氣。 – BalusC 2011-04-07 12:12:10

0

一個是jstl標籤,其他的是jsf組件。他們有不同的評估時間。

您應該使用組件的rendered屬性來有條件地呈現它們。