在 JSF 表达式语言中如何获取列表的长度?
Posted
技术标签:
【中文标题】在 JSF 表达式语言中如何获取列表的长度?【英文标题】:How do you get the length of a list in the JSF expression language? 【发布时间】:2010-09-17 09:30:29 【问题描述】:如何使用 JSF EL 表达式获得 ArrayList
的长度?
#MyBean.somelist.length
不工作。
【问题讨论】:
相关:How to display value of List#size() in JSF EL? @GBa 你可以使用#MyBean.somelist.size() 来显示列表的大小。 您也可以使用 c:forEach 循环遍历列表并在循环体中将计数值分配给变量,例如:是的,因为 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”。这可能是解决此问题的最简单方法。
【讨论】:
还有***.com/questions/1332169/…【参考方案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>
【讨论】:
以上是关于在 JSF 表达式语言中如何获取列表的长度?的主要内容,如果未能解决你的问题,请参考以下文章