我正在尝试从Map<String, Object>
参数在JSP中构建URL。现有代码遍历地图,并为键和值添加c:params:
<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
部分转换为整数以便将其用作索引(我不敢相信有人认为这是一个好主意) 。我的下一个步骤是使用scriptlet,但我仍然很好奇,看看是否有办法使用纯JSTL做到这一点。
在这种情况下,使用脚本是一种方法。我最终得到了这样的东西:
<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>
最佳答案
打开一个jsp scriptlet <% ... %>
。在这种非标准情况下,我认为最好直接使用Java语言。
例如,您也可以在params中使用scriptlet:
<c:set var="className" value="<%= ... get class name ... %>" />
要么
<c:set var="isArray" value="<%= a.getClass().isArray() %>" />
请记住,如果要在scriptlet中使用
a
,则必须从pageContext获取它,例如:<% Object a = pageContext.getParameter("innerValue"); %>