我试图从参数的Map<String, Object>
的JSP中构建一个url。现有的代码遍历地图并添加C:PARAMS用于键和值:获取JSTL中数组的类名称
<c:url value="/">
<c:forEach items="${myParamMap}" var="parameter">
<c:param name="${parameter.key}" value="${parameter.value}" />
</c:forEach>
</c:url>
我碰到其中在映射中的条目的值实际上是对象的阵列的情况。我的下一个尝试是添加一个嵌套的循环来遍历必要的值:
<c:url value="/">
<c:forEach items="${myParamMap}" var="parameter">
<c:forEach items="${parameter.value}" var="innerValue">
<c:param name="${parameter.key}" value="${innerValue}" />
</c:forEach>
</c:forEach>
</c:url>
但当然,这破坏了正常情况下的值不迭代。
我的下一个想法是通过某种“instanceof”检查来检查值是否是一个数组。我可以在互联网上找到这样做的唯一方法是:${object.class.className == 'Whatever'}
。
这对于JSTL中的数组不适用,因为对于表达式${someArray.class}
,JSTL会尝试将.class
部分转换为整数以便将其用作索引(我不相信有人认为这是个好主意) 。
我的下一步是使用scriptlets,但我仍然好奇是否有办法用纯JSTL来做到这一点。
使用scriptlets是在这种情况下去的方法。我结束了类似于:
<c:set var="val" value="${parameter.value}">
<% boolean isArray = pageContext.getAttribute("val").getClass().isArray(); %>
<c:choose>
<c:when test="<%= isArray >">
... forEach loop to set all the params ...
</c:when>
<c:otherwise>
... just set the param with key & value ...
</c:otherwise>
</c:choose>
'$ {paramValues}'实际上是一个'Map'。为什么不相应地对待它呢?至于你的具体问题,只需使用'object [0] .class.name',但你总会得到'java.lang.String'。 –
BalusC
2012-04-12 19:28:54
我的错误,我没有使用paramValues。我正在使用来自内部库的Map。我会编辑我的帖子以反映这一点。 –
2012-04-12 19:32:28