【问题标题】:JSF view calculationsJSF 视图计算
【发布时间】:2011-06-22 04:44:17
【问题描述】:

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

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>

那么我如何计算这些偏移量和大小,以便每列迭代集合的一部分?或者也许有更好的方法?

【问题讨论】:

  • facelet 技术比 JSP for JSF 效果更好。
  • 要回答您问题的第一部分,在 JSF 2.0 中,已弃用 JSP。来自维基百科:“最初,Facelets 可作为 JSF 1.1 和 JSF 1.2 的单独替代视图声明语言使用,它们都使用 JSP 作为默认视图声明语言。从 JSF 2.0 开始,JSF 专家组将 Facelets 推广为默认的视图声明语言。 JSP 已被弃用为遗留的回退 [2] [3]'。
  • 这是否意味着在某些时候 jsp 将被完全弃用?它声明它已被弃用为 jsf 的默认 VDL,但如果它被 facelets 替换,是否应该完全弃用它?
  • 如果“完全弃用”是指“已移除”,那么不,这永远不会发生,至少从标准 API 中弃用部分的经验来看。它可能会得到更少/更慢的错误修复、更少的文档,并且可能不会扩展以支持新功能。

标签: java jsf jsf-2 composite-component


【解决方案1】:

您可以使用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 &lt;fmt:formatNumber&gt;,它可以导出到 var 属性,而不是直接在视图中显示。

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

但 JSTL fmt 在 Facelets 中不可用。

一个 hacky 方法是使用 fn:substringBefore 拆分分数。

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

但这总是四舍五入。

最好的方法是创建一个自定义 EL 函数。您可以在this answer 中找到示例。对于 JSF 2.0,您只需将已弃用的 &lt;param-name&gt;facelets.LIBRARIES&lt;/param-name&gt; 替换为 &lt;param-name&gt;javax.faces.FACELETS_LIBRARIES&lt;/param-name&gt;。最后你会变成这样:

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

作为一个完全不同的替代方案,您也可以在托管 bean 的构造函数、init 或 getter 中完成这项工作。

【讨论】:

  • BalusC 伙计,你什么都知道。无论如何我可以围捕这个部门吗?它返回一个浮点值加上如果它不是一个整数我不能告诉 迭代 3.7 次。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-01-03
  • 2018-09-02
  • 1970-01-01
  • 2011-01-11
  • 2012-09-26
相关资源
最近更新 更多