我試圖從參數的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