2011-02-06 51 views
1

我知道,使用JSF 2,facelets是首選的視圖聲明語言。JSF視圖計算

JSP是否被jsf棄用?

無論如何,我需要創建一個特殊的佈局,所以我不能使用Datatable。相反,我有6個div,我用它作爲列刪除一系列文章。 我的問題是,我有一個JSF複合材料部件,注射有一個Collection 答:

List<Article> 

對象。

該組件然後需要將集合的大小劃分爲每列相等的部分。然後設置此時,相應的偏移和大小各

<ui:repeat></ui:repeat> 

,所以我結束了這個

<!-- INTERFACE --> 
<cc:interface> 
    <cc:attribute name="featuredArticles" required="true" type="java.util.List;" /> 
</cc:interface> 

<!-- IMPLEMENTATION --> 
    <cc:implementation> 
    <div class="col"> 
     <ui:repeat value="#{cc.attrs.featuredArticles}" var="art" offset="??" size="??"> 
      <mycomps:article art="#{art}" /> 
     </ui:repeat> 
    </div> 
    <div class="col"> 
     <ui:repeat value="#{cc.attrs.featuredArticles}" var="art" offset="??" size="??"> 
      <mycomps:article art="#{art}" /> 
     </ui:repeat> 
    </div> 
    <div class="col"> 
     <ui:repeat value="#{cc.attrs.featuredArticles}" var="art" offset="??" size="??"> 
      <mycomps:article art="#{art}" /> 
     </ui:repeat> 
    </div> 
    <div class="col"> 
     ...same here... 
    </div> 
    <div class="col"> 
     ...same here... 
    </div> 
</cc:implementation> 

那麼,如何計算這些偏移和大小,使每個列遍歷集合的一部分?或者也許有更好的方法?

+0

Facelet技術比JSP更適合JSF。 – 2011-02-06 10:12:22

+0

要回答您的問題的第一部分,在JSF 2.0中,不推薦使用JSP。從wikipedia開始:'最初,Facelets作爲JSF 1.1和JSF 1.2的一個單獨的替代視圖聲明語言提供,它們都使用JSP作爲默認視圖聲明語言。從JSF 2.0開始,Facelets已經被JSF專家組提升爲默認的視圖聲明語言。 JSP已被棄用作爲傳統的後退[2] [3]'。 – 2011-02-06 14:07:46

回答

3

您可以通過fn:length獲取藏品的尺寸,EL中有基本的算術運算符。

<ui:composition xmlns:fn="http://java.sun.com/jsp/jstl/core"> 
    ... 
    <ui:param name="size" value="#{fn:length(featuredArticles)/6}" /> 
    ... 
    <ui:repeat size="#{size}"> 
    ... 
</ui:composition> 

更新:爲四捨五入,這很麻煩。在舊的JSP中,您可以使用JSTL <fmt:formatNumber>來實現此目的,該屬性可以導出到var屬性,而不是直接在視圖中顯示它。

<fmt:formatNumber var="size" value="${fn:length(featuredArticles)/6}" pattern="0" /> 

但是JSTL fmt在Facelets中不可用。

一個奇怪的方法是使用fn:substringBefore拆分分數。

<ui:param name="size" value="#{fn:substringBefore(fn:length(featuredArticles)/6, '.')}" /> 

但這始終幾輪下來。

最好的方法是創建一個自定義EL功能。你可以在this answer找到一個例子。對於JSF 2.0,您只需將已廢棄的<param-name>facelets.LIBRARIES</param-name>替換爲<param-name>javax.faces.FACELETS_LIBRARIES</param-name>即可。最後,你會落得像爲:

<ui:param name="size" value="#{x:roundUp(fn:length(featuredArticles)/6)}" /> 

作爲一個完全不同的選擇,你也可以在構造函數中,init或吸氣託管bean的做這個工作。