2012-04-12 71 views
0

我试图从参数的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> 
+0

'$ {paramValues}'实际上是一个'Map '。为什么不相应地对待它呢?至于你的具体问题,只需使用'object [0] .class.name',但你总会得到'java.lang.String'。 – BalusC 2012-04-12 19:28:54

+0

我的错误,我没有使用paramValues。我正在使用来自内部库的Map 。我会编辑我的帖子以反映这一点。 – 2012-04-12 19:32:28

回答

1

打开一个jsp scriptlet <% ... %>。在这种非标准的情况下,我认为最好直接使用Java语言。

例如,你可以在里面用小脚本PARAMS太:

<c:set var="className" value="<%= ... get class name ... %>" /> 

<c:set var="isArray" value="<%= a.getClass().isArray() %>" /> 

记住,如果你想在小脚本使用a你必须从pageContext中得到它,例如:

<% Object a = pageContext.getParameter("innerValue"); %>