在页面上处理Java表达式语言

时间:2010-11-23 22:04:01

标签: java javascript jsp el

我正在开发一个项目的前端,它可以让我使用Java Expression Language标签。在一个实例中,我需要查看它是返回数组还是只返回一位数据而我不知道如何使用它。

示例:

页面有

<p>${WebAppContext.buildings[0].location.name}</p>

将输出如下内容:

<p>Acme</p>

问题是,如果建筑物中有更多位,我需要输出更多:

类似(伪代码):

if isArray(${WebAppContext.buildings}){
 foreach(${WebAppContext.buildings} as foo){
    //iterate over whatever is in the array
}
}

所以我可以输出如下内容:

<p>${WebAppContext.buildings[0].location.name}</p>
<p>${WebAppContext.buildings[1].location.name}</p>

我问负责生成此代码的Java人员,他们说“Dunnokindofbusyrightnowbuhbye”。所以我希望大家会有一些见解。

除了在页面中粘贴代码之外,我还不知道如何使用这种Java表达式语言(我甚至不得不仔细查看它的内容)。所以任何建议/资源都会有所帮助。


修改

我尝试了以下操作,但没有得到任何结果:

<c:forEach var='building' items='${WebAppContext.buildings}'>
  <p>${building.location.name}</p>
</c:forEach>

在页面的来源中,它只显示:

<c:forEach var='meeting' items='[Lorg.foo.bar.baz.bat.serviceapi.webserviceobject.xsd.BuildingsWSO;@3823ff8'>
  <p></p>
</c:forEach>

我承认,在不了解Java表达式语言的任何内容之后,我不明白为什么items =''会像它一样被翻译,尽管我可以看到它遵循我们使用的设置中的路径。 现在我用的时候:

<p>${WebAppContext.buildings[0].location.name}</p>
<p>${WebAppContext.buildings[1].location.name}</p>

我明白了:

<p>Krustylu Studios</p>
<p>Springfield Nuclear Power Plant</p>

4 个答案:

答案 0 :(得分:4)

我认为EL不支持这种高级功能;您可以尝试使用JSTL c:forEach标记迭代列表。

答案 1 :(得分:3)

如果您在浏览器中查看网页来源时看到<c:forEach var='meeting' items='[Lorg.foo.bar.baz.bat.serviceapi.webserviceobject.xsd.BuildingsWSO;@3823ff8'>,则表示未处理<c:forEach>代码。

确保您已在JSP页面中声明了标记库:

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

prefix="c"是您获得c: <c:forEach>部分的地方...如果您要prefix="foo",则标记将为<foo:forEach> < / p>

答案 2 :(得分:2)

这应该是可能的:

<c:forEach var='building' items='${WebAppContext.buildings}'>
  <p>${building.location.name}</p>
</c:forEach>

现在,您将如何检查WebAppContext.buildings是否实际上是一个数组?使用JSTL 没有直接简单的方法,除非你有能力扩展本地自定义的EL函数套件以便在JSTL中使用。

答案 3 :(得分:1)

如果您确实需要知道对象是否是数组,则可以创建自定义JSP函数。

public static boolean isArray(final Object o) {
    return o instanceof Object[];
}

然后将其映射到TLD中,例如:

<function>
    <description>
        Checks if the supplied object is an array.
    </description>
    <name>isArray</name>
    <function-class>com.example.JspFunctions</function-class>
    <function-signature>boolean isArray(java.lang.Object)</function-signature>
    <example>
        ${f:isArray(someVar)}
    </example>
</function>