是的,因为 Java API 创建委员会中的某个天才决定,即使某些类具有 size()
成员或 length
属性,它们也不会实现 JSF 和大多数其他标准所要求的 getSize()
或 getLength()
,您不能做你想做的事。
有几种方法可以做到这一点。
一:向您的 Bean 添加一个返回长度的函数:
In class MyBean: public int getSomelistLength() { return this.somelist.length; } In your JSF page: #{MyBean.somelistLength}
二:如果你在使用 Facelets(哦,天哪,你为什么不使用 Facelets!),你可以添加 fn 命名空间并使用长度函数
In JSF page: #{ fn:length(MyBean.somelist) }
你的意思是 size() 不是吗?
#{MyBean.somelist.size()}
为我工作(使用具有 Jboss EL 扩展的 JBoss Seam)
#{MyBean.somelist.size}
(最后没有括号)。
注意:此解决方案更适合旧版本的 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 中的一个巨大缺陷。
我最终使用了“包装器”方法,这是它的类;
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”。这可能是解决此问题的最简单方法。
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn"%>
<h:outputText value="Table Size = #{fn:length(SystemBean.list)}"/>
在屏幕上显示表格大小
示例:Table Size = 5
7 年后……作为 jsf 用户,facelets 解决方案仍然适用于我
将命名空间包含为 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>
您可以使用以下 EL 获取长度:
#{Bean.list.size()}
<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>
xmlns:fn="http://java.sun.com/jsp/jstl/functions"