2012-04-12 8 views
0

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> 
+0

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

+0

Mein Fehler, ich benutze keine paramValues. Ich verwende eine Map aus einer hauseigenen Bibliothek. Ich werde meinen Beitrag bearbeiten, um dies zu berücksichtigen. –

Antwort

1

Öffnen Sie ein jsp scriptlet <% ... %>. In diesen nicht standardmäßigen Situationen glaube ich, dass es besser ist, Java direkt zu verwenden.

Zum Beispiel Sie scriptlet innen verwenden können params auch:

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

oder

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

Denken Sie daran, dass, wenn Sie a in scriptlet verwenden möchten Sie es von pagecontext bekommen haben, zum Beispiel:

<% Object a = pageContext.getParameter("innerValue"); %>