JSTL、Bean 和方法调用

JSTL, Beans, and method calls

提问人:Zack The Human 提问时间:10/23/2008 最后编辑:Zack The Human 更新时间:2/14/2012 访问量:36166

问:

我正在开发一个 JSP,我需要在来自 Bean 的对象上调用方法。该页面的早期版本不使用 JSTL,并且工作正常。我的新版本有这样的设置:

<jsp:useBean id="pageBean" scope="request" type="com.epicentric.page.website.PageBean" />
<c:set var="pageDividers" value="<%= pageBean.getPageDividers() %>" />
<c:set var="numColumns" value="${pageDividers.size()}" />

变量是一个对象。pageDividersList

我遇到了这个问题:当我询问 的大小时,会抛出异常。我知道这是一个简单的 JTSL 错误——我做错了什么?pageDivider

错误消息为:

未指定默认命名空间时,函数大小必须与前缀一起使用

如何正确访问或调用对象的方法?pageDividers

Java 异常 JSP JSTL 小插曲

评论


答:

2赞 Vincent Ramdhanie 10/23/2008 #1

要使用 EL 访问 Bean 的属性,只需命名该属性(而不是调用该方法)。因此,假设您在 bean 中有一个名为 getSize() 的方法

${pageDividers.size}

注意没有 ()。

编辑:对不起...在原来的帖子中犯了一个错误。

27赞 abahgat 10/23/2008 #2

在 JSTL 中使用点运算符进行属性访问时,(不需要 () )会导致调用名为 的方法。
由于 java.util.List 提供了一个名为(而不是 )的方法,因此您将无法使用该代码访问列表长度。
${pageDividers.size}getSize()size()getSize()


为了访问列表大小,JSTL 提供了 fn:length 函数,其用法类似于

${fn:length(pageDividers)}

请注意,为了使用 fn 命名空间,您应该按如下方式声明它

<%@ taglib uri="http://java.sun.com/jsp/jstl/functions" prefix="fn" %>

此外,相同的函数可以用于任何集合类型,也可以用于 Strings。

评论

1赞 MetroidFan2002 10/23/2008
要小心。我在 Websphere 6.12 中遇到了一个晦涩难懂的错误 - 当在标签体中执行 JSTL 函数时发生。这在 Websphere 6.13+ 中已修复,但不低于 6.13。当我们使用 6.11 时,我们实际上必须为我们使用的函数创建自定义标签,并委托给实际代码。
5赞 mjs 4/10/2012
这很糟糕。为什么他们不让你使用类/实例本身调用方法!?你在JEE平台上遇到了各种各样的虫洞......FFS!