Ich versuche, eine URL in einer JSP aus einer Map<String, Object>
Parameter zu erstellen. Die bestehenden Code durchläuft die Karte und fügt c: params für die Schlüssel und Werte:Holen Sie den Klassennamen eines Arrays in JSTL
<c:url value="/">
<c:forEach items="${myParamMap}" var="parameter">
<c:param name="${parameter.key}" value="${parameter.value}" />
</c:forEach>
</c:url>
ich in dem Fall ausgeführt haben, wenn der Wert eines Eintrags in der Karte tatsächlich ein Array von Objekten ist. Mein nächster Versuch war eine verschachtelte Schleife hinzuzufügen über die Werte nach Bedarf zu wiederholen:
<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>
Aber natürlich diese durchbrechen die normale Situation, wenn der Wert nicht iterable ist.
Meine nächste Idee war es, über eine Art "instanceof" -Prüfung zu überprüfen, ob der Wert ein Array ist. Der einzige Weg, den ich im Internet finden konnte, war: ${object.class.className == 'Whatever'}
.
Diese nicht für Arrays in JSTL nicht arbeiten, weil die für die Expression ${someArray.class}
versucht JSTL den .class
Teil in eine ganze Zahl zu konvertieren, um sie als Index (I jemand kann nicht glauben, dachte, das war eine gute Idee) zu verwenden, .
Mein nächster Schritt ist Scriptlets zu verwenden, aber ich bin immer noch neugierig zu sehen, ob es eine Möglichkeit gibt, dies mit reinem JSTL zu tun.
Mit Scriptlets ist in diesem Fall der Weg zu gehen. Am Ende hatte ich so etwas wie:
<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>
Die '$ {ParamValues}' ist eigentlich ein 'Map'. Warum behandelst du es nicht entsprechend? Zu deinem konkreten Problem benutze einfach 'object [0] .class.name', aber du bekommst immer' java.lang.String'. –
BalusC
Mein Fehler, ich benutze keine paramValues. Ich verwende eine Map aus einer hauseigenen Bibliothek. Ich werde meinen Beitrag bearbeiten, um dies zu berücksichtigen. –