【问题标题】:How do you get the length of a list in the JSF expression language?在 JSF 表达式语言中如何获取列表的长度?
【发布时间】:2010-09-17 09:30:29
【问题描述】:

如何使用 JSF EL 表达式获得 ArrayList 的长度?

#{MyBean.somelist.length}

不工作。

【问题讨论】:

  • @GBa 你可以使用#{MyBean.somelist.size()} 来显示列表的大小。
  • 您也可以使用 c:forEach 循环遍历列表并在循环体中将计数值分配给变量,例如: 。无论如何,当您在列表中循环时尤其有用。

标签: java jsp jsf jstl el


【解决方案1】:

是的,因为 Java API 创建委员会中的一些天才决定,即使某些类具有 size() 成员或 length 属性,它们也不会实现 JSF 和大多数其他标准的 getSize()getLength()要求,你不能做你想做的事。

有几种方法可以做到这一点。

一:给你的Bean添加一个返回长度的函数:

在 MyBean 类中: public int getSomelistLength() { return this.somelist.length; } 在您的 JSF 页面中: #{MyBean.somelistLength}

二:如果你正在使用 Facelets(哦,天哪,你为什么不使用 Facelets!),你可以添加 fn 命名空间并使用长度函数

在 JSF 页面中: #{ fn:length(MyBean.somelist) }

【讨论】:

  • fn 可能是要走的路,不幸的是它只在 JSTL 版本大于 1.1 中可用。
  • 使用 fn:length 对我来说适用于裸 JSP(没有 JSF、Facelets;超遗留项目在逐步淘汰之前进行了轻微更新)。要使用的正确标记库:<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
  • 对于像我一样登陆这里的人,仍然是 2 年后,考虑到您可以将以下命名空间添加到您的 facelet:xmlns:fn="http://java.sun.com/jsp/jstl/functions"
【解决方案2】:

你的意思是 size() 不是吗?

#{MyBean.somelist.size()}

为我工作(使用具有 Jboss EL 扩展的 JBoss Seam)

【讨论】:

  • 也许EL的较新规格支持size方法?任何人都可以确认或否认这一点吗?
  • @nemo - 这将在 JSR245 维护版本中得到解决:blogs.sun.com/kchung/entry/jsr_245_mr_part_i(就 JEE 规范而言,这将是 JEE6)
  • @McDowell,感谢您提供的信息,我真的很惊讶他们花了这么长时间才解决这个问题。
  • 谢谢。它也对我有用。 +1。但在 JEE 6 得到广泛支持之前,我可能会坚持使用“更标准”的 JSTL 功能。
  • 顺便说一句,它可能在 JBoss 中只说 #{MyBean.somelist.size} (末尾没有括号)。
【解决方案3】:

您最终可以使用 EL Functor 扩展 EL 语言,这将允许您调用任何 Java bean 方法,即使带有参数...

【讨论】:

    【解决方案4】:

    注意:此解决方案更适合旧版本的 JSTL。对于大于 1.1 的版本,我建议按照Bill James 的建议使用fn:length(MyBean.somelist)


    This article 有一些更详细的信息,包括另一种可能的解决方案;

    问题是我们正在尝试调用列表的 size 方法(这是一个有效的 LinkedList 方法),但它不是符合 JavaBeans 的 getter 方法,因此无法计算表达式 list.size-1。

    有两种方法可以解决这个难题。首先,您可以使用 RT Core 库,如下所示:

    <c_rt:out value='<%= list[list.size()-1] %>'/>
    

    其次,如果您想在 JSP 页面中避免使用 Java 代码,您可以实现一个简单的包装类,该类包含一个列表,并使用符合 JavaBeans 的 getter 方法提供对列表大小属性的访问。清单 2.25 中列出了该 bean。

    c_rt 方法的问题是你需要手动从请求中获取变量,否则它无法识别它。此时,您正在为应该内置的功能输入大量代码。这是 EL 中的 GIANT 缺陷。

    我最终使用了“包装器”方法,这是它的类;

    public class CollectionWrapper {
    
        Collection collection;
    
        public CollectionWrapper(Collection collection) {
            this.collection = collection;
        }
    
        public Collection getCollection() {
            return collection;
        }
    
        public int getSize() {
            return collection.size();
        }
    }
    

    没有人提到的第三个选项是将列表大小作为单独的属性放入模型中(假设您使用 MVC)。因此,在您的模型中,您将有“someList”,然后是“someListSize”。这可能是解决此问题的最简单方法。

    【解决方案5】:
    <%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
    
    <h:outputText value="Table Size = #{fn:length(SystemBean.list)}"/>
    

    在屏幕上显示表格大小

    示例:Table Size = 5

    【讨论】:

    • 是的,我发现这是最简单的方法。我将 websphere6 与 JSP(遗留系统)一起使用。使用相同的tablib,然后使用“美元符号”而不是“哈希”,因为哈希不起作用。即:{fn:length(SystemBean.list)}
    【解决方案6】:

    您可以使用以下EL获取长度:

    #{Bean.list.size()}

    【讨论】:

    • 这与Damo's的答案基本相同。
    • 作为@ArtjomB。建议,在这里发布与其他人已经发布的答案相同的答案通常并不好。在这种情况下,差不多 六年前
    【解决方案7】:

    7 年后……facelets 解决方案对于我作为 jsf 用户的我来说仍然可以正常工作

    将命名空间包含为 xmlns:fn="http://java.sun.com/jsp/jstl/functions"

    并使用 EL 作为 #{fn:length(myBean.someList)} 例如,如果在 jsf ui:fragment 中使用下面的示例工作正常

    <ui:fragment rendered="#{fn:length(myBean.someList) gt 0}">
        <!-- Do something here-->
    </ui:fragment>
    

    【讨论】:

      猜你喜欢
      • 2013-02-15
      • 1970-01-01
      • 2012-07-05
      • 2011-06-24
      • 2015-02-03
      • 2011-01-13
      • 2013-03-20
      • 2012-10-19
      • 1970-01-01
      相关资源
      最近更新 更多