Jsp CQ5 properties.get(";foo";)String Array.length-JSTL等效项
这是一个我已经和之斗争了几个小时的问题,如果有任何帮助,我将不胜感激 我使用了scriplets,如下所示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
所以我做了:
<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>
谢谢您的解释!在一个稍微不同的问题上帮了我很多