1

JSF 2 では facelets が優先されるビュー宣言言語であることを知っています。

JSP から jsf への変換は非推奨ですか?

とにかく、特別なレイアウトを作成する必要があるため、Datatable を使用できません。代わりに、記事のコレクションをドロップする列として使用する 6 つの div があります。私の問題は、コレクション A が注入された JSF 複合コンポーネントがあることです。

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>

では、各列がコレクションの一部を反復処理するように、これらのオフセットとサイズを計算するにはどうすればよいでしょうか? それとももっと良い方法がありますか?

4

1 に答える 1

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では、ビューに直接表示する代わりに属性に<fmt:formatNumber>エクスポートできるJSTL を使用できました。var

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

ただし、JSTLfmtは Facelets では使用できません。

ハックな方法は、 を使用して分数を分割することfn:substringBeforeです。

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

しかし、これは常に切り捨てられます。

最善の方法は、カスタム EL 関数を作成することです。この回答で例を見つけることができます。<param-name>facelets.LIBRARIES</param-name>JSF 2.0 の場合、非推奨のをに置き換えるだけで済みます<param-name>javax.faces.FACELETS_LIBRARIES</param-name>。最終的には次のようになります。

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

まったく別の方法として、マネージド Bean のコンストラクター、init、またはゲッターでこのジョブを実行することもできます。

于 2011-02-07T10:44:50.307 に答える