1

我知道对于 JSF 2,facelets 是首选的视图声明语言。

JSP 到 jsf 是否已弃用?

无论如何,我需要创建一个特殊的布局,所以我不能使用 Datatable。相反,我有 6 个 div 用作我删除文章集合的列。我的问题是我有一个 JSF 复合组件,它注入了一个 Collection A:

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 中不可用。

一个 hacky 方法是使用fn:substringBefore.

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

但这总是四舍五入。

最好的方法是创建一个自定义 EL 函数。你可以在这个答案中找到一个例子。对于 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 的构造函数、init 或 getter 中完成这项工作。

于 2011-02-07T10:44:50.307 回答