这是一个我已经和我斗争了几个小时的问题,现在我将不胜感激任何帮助。
我使用了如下的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返回单个字符串,我如何确保它被分配给数组
谢谢
答案 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>