2012-04-12 125 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"); %>