2011-02-06 15 views
1

私は、JSF 2ではfaceletsが好ましいビュー宣言言語であることを知っています。JSFビューの計算

JSP to jsfは非推奨ですか?

とにかく、私はDatatableを使用できないので、特別なレイアウトを作成する必要があります。代わりに、私は記事のコレクションをドロップする列として私が使用する6 divsを持っています。

List<Article> 

オブジェクト: 私の問題は、それがコレクション Aを注入されて、私はJSF複合コンポーネントを持っているということです。

コンポーネントは、コレクションのサイズを各列ごとに等しく分割する必要があります。次に、各

<ui:repeat></ui:repeat> 

のオフセットappropiateとサイズを設定するので、私は、各列が繰り返されるように、どのように私はコレクションの一部の上にそれらのオフセットとサイズを計算します。この

<!-- 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テクノロジーはJSF用のJSPより優れています。 –

+0

質問の最初の部分に答えるために、JSF 2.0では、JSPは推奨されていません。 wikipediaから:「当初FaceletsはJSF 1.1とJSF 1.2のための別々の代替ビュー宣言言語として利用できました。どちらもJSPをデフォルトのビュー宣言言語として使用しました。 JSF 2.0以降、FaceletsはJSFエキスパートグループによってデフォルトのビュー宣言言語として宣伝されています。 JSPは従来のフォールバックとして非難されています[2] [3] '。 –

+0

は、ある時点ではjspは完全に廃止されることを意味しますか?それは、jsfのデフォルトのVDLとして推奨されなくなりましたが、faceletsに置き換えられた場合、完全に廃止されるべきですか? – arg20

答えて

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)}" /> 

、あなたはまた、コンストラクタで初期化や管理対象Beanのゲッターを、この仕事をすることができます。

+0

BalusC男あなたはすべてを知っています。とにかく私は部門を切り上げることができますか?丸数字でない場合はfloat値を返します。に3.7回反復するように指定することはできません。 – arg20