0

我正在尝试从一个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 做到这一点。


在这种情况下,使用 scriptlet 是可行的方法。我最终得到了类似的东西:

<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>
4

1 回答 1

1

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

例如,您也可以在 params 中使用 scriptlet:

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

或者

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

请记住,如果您想a在 scriptlet 中使用,您必须从 pageContext 中获取它,例如:

<% Object a = pageContext.getParameter("innerValue"); %>
于 2012-04-12T19:44:12.160 回答