Jsp CQ5 properties.get(";foo";)String Array.length-JSTL等效项

Jsp CQ5 properties.get(";foo";)String Array.length-JSTL等效项,jsp,properties,get,jstl,aem,Jsp,Properties,Get,Jstl,Aem,这是一个我已经和之斗争了几个小时的问题,如果有任何帮助,我将不胜感激 我使用了scriplets,如下所示 然后 按预期返回筛选器[]的长度 现在我必须从代码中删除所有的scriplets 所以我做了: <cq:defineObjects /> <c:set var="filters" value="${fn:length(properties.filters)}" /> <c:out value="${filters}"/> 问题是:如果prope

这是一个我已经和之斗争了几个小时的问题,如果有任何帮助,我将不胜感激

我使用了scriplets,如下所示
然后

按预期返回筛选器[]的长度

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

所以我做了:

<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中强制变量类型为字符串数组,或者如果其CQ返回单个字符串,如何确保将其分配给数组


谢谢

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

因此,我们不能总是保证properties.get会返回数组,因此我们显式指定String[].class作为返回值应转换为的类型

但是,使用CQ中的servlet版本(我猜是2.5)在EL中传递参数是不可能的,尽管使用servlet 3.0中的EL 2.2也是可能的

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

<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>

如果您有一个property对象,可以使用isMultiple()方法检查它是否为多值属性。例如:

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

谢谢您的解释!在一个稍微不同的问题上帮了我很多