【问题标题】:JSTL, Beans, and method callsJSTL、Bean 和方法调用
【发布时间】:2010-09-18 15:44:18
【问题描述】:

我正在开发一个 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()}" />

变量pageDividers 是一个List 对象。

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

错误信息是:

未指定默认命名空间时,函数大小必须带前缀

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

【问题讨论】:

    标签: java exception jsp jstl vignette


    【解决方案1】:

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


    为了获取列表的大小,JSTL 提供了 fn:length 函数,用法类似

    ${fn:length(pageDividers)}
    

    注意,为了使用 fn 命名空间,你应该如下声明它

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

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

    【讨论】:

    • 小心。我在 Websphere 6.12 中遇到了一个不为人知的错误,该错误是在标记正文中执行 JSTL 函数时发生的。这在 Websphere 6.13+ 中已修复,但不低于 6.13。当我们使用 6.11 时,我们实际上必须为我们使用的函数创建自定义标签,委托给实际代码。
    • 这太糟糕了。为什么他们不允许您使用类/实例本身调用方法!?你在 JEE 平台上遇到各种各样的虫洞...... ffs!
    【解决方案2】:

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

    ${pageDividers.size}
    

    注意没有()。

    编辑:对不起...在原始帖子中出错了。

    【讨论】:

      猜你喜欢
      • 2015-04-04
      • 1970-01-01
      • 1970-01-01
      • 2014-06-26
      • 1970-01-01
      • 1970-01-01
      • 2013-12-26
      • 1970-01-01
      • 2012-09-15
      相关资源
      最近更新 更多