CQ5 properties.get(“foo”)String Array.length - 等效的JSTL

时间:2014-03-05 17:09:06

标签: jsp properties get jstl cq5

这是一个我已经和我斗争了几个小时的问题,现在我将不胜感激任何帮助。

我使用了如下的scriplets <%String[] filters = (String[])properties.get("formfactors" ,String[].class) ;%> 然后<%=filters.length%>

按预期返回filters []的长度。

现在我必须删除代码中的所有scriplet

所以我做了:

<cq:defineObjects />

<c:set var="filters" value="${fn:length(properties.filters)}" />

<c:out value="${filters}"/>

问题是:如果properties.filters.length == 1

,则返回字符串properties.filters [0]的长度

像JSTL或CQ一样自动将存储库变量类型从String []转换为String

希望这一切都有意义。

问题是我如何在JSTL中强制变量类型为String Array,或者如果它的CQ返回单个字符串,我如何确保它被分配给数组

谢谢

1 个答案:

答案 0 :(得分:1)

如果作者只提供一个值,则多字段将存储为字符串;如果作者提供多个值,则将字段存储为字符串数组。这是默认行为,除非您覆盖默认的多字段,否则无法更改。

因此,我们不能总是保证为properties.get返回一个数组,因为我们明确地指定String [] .class作为返回值应转换为的类型。

但是,使用CQ中存在的servlet版本(我猜2.5)不可能在EL中传递参数,尽管可以使用作为Servlet 3.0的一部分的EL 2.2。

实现此目的的一种方法是使用JSP表达式获取值,如下所示。这将确保您的过滤器始终是一个数组,无论它是存储为String还是String数组。

<c:set var="filters" value="<%= properties.get("filters", String[].class) %>" />
<c:out value="${ fn:length(filters) }" />
<c:forEach items="${ filters }" var="filter" >
    <!-- Your logic -->
</c:forEach>

如果您有属性对象,可以使用isMultiple()方法检查它是否是多值属性。对于Ex:

    <c:if test="${ prop.multiple }" >
        <c:set var="filters" values="${ prop.values }" />
        <!-- Your logic -->
    </c:if>