2011-12-20 93 views
3

我的代碼在這裏遍歷每行的列,並且rendered屬性每次迭代計算一次,過度調用testRule如何在JSF中設置變量?

<p:dataTable ...> 
    <p:column ...> 
     ... 
    </p:column> 

    <p:column rendered="#{managedBean.testRule('rules.canDoActions')}"> 
     <!-- Action buttons --> 
     <h:commandButton ...> 
     <h:commandButton ...> 
    </p:column> 
</p:dataTable> 

爲了獲得更好的性能,我想知道結果設置成變量,但我不知道如何......這將成爲這樣的:

<?:??? var="canDoActions" value="#{managedBean.testRule('rules.canDoActions')}"> 
    <p:dataTable ...> 
     <p:column ...> 
      ... 
     </p:column> 

     <p:column rendered="#{canDoActions}"> 
      <!-- Action buttons --> 
      <h:commandButton ...> 
      <h:commandButton ...> 
     </p:column> 
    </p:dataTable> 

另外,我'不允許使用核心標籤庫,這意味着<c:set ../>是無可爭議的。

在那個範圍內,我怎麼能設置一個變量?或者,如果不可能,您建議如何解決這個問題?

+1

你爲什麼不 「允許」 使用JSTL核心標籤庫? – BalusC 2011-12-20 18:57:01

+0

@BalusC:建築師決定不使用JSF的JSTL,因爲(如果我沒有錯的話)它運行在其他標籤的不同階段,這裏的人們在亂用它,混合東西,出現很多錯誤和混淆(如果我沒有錯,JSTL核心不會在ajax調用上重新運行)。 JSTL是爲JSP創建的,並且是爲其設計的。我知道它可以與JSF一起使用,但是,在這裏,架構師決定使用JSTL並不是最佳實踐。儘管我們犧牲了JSTL,但我們的問題已經解決了(相信JSTL不是那麼必要)。很高興和你談談,@BalusC! – falsarella 2011-12-20 19:21:03

+4

JSTL確實沒有必要。但是,當您想要動態構建視圖時,它可能會有所幫助。另請參見http://stackoverflow.com/questions/3342984/jstl-in-jsf2-facelets-makes-sense雖然您的架構師肯定有一個有效的點(它確實經常令啓動者感到困惑),但完全限制它有點過分熱情。那麼''就是你的問題的答案。如果這不是一個選項(或者顯示其他問題;例如,它與視圖範圍的bean不能很好地協作),那麼你必須在getter中緩存自己。參見Jigar的答案。 – BalusC 2011-12-20 19:29:42

回答

5

我不能使用的核心標籤庫,至極意味着<c:set ../>是毫無疑問的

然後你可以把它保存在bean本身並檢查是否爲空calculateRules和設定值或者乾脆返回。

例如:

HashMap<String, Boolean> map; 

public boolean testRule(String stringInput) { 
    Boolean result = map.get(stringInput); 

    if (result == null) { 
     //calculate and set in map 
    } 

    return result; 
}