私は、パラメータを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'}
でした。
${someArray.class}
の式のために、JSTLは.class
部分を整数に変換してインデックスとして使用しようとしています(これは良い考えだとは思えません) 。
次に、スクリプトレットを使用しますが、純粋なJSTLでこれを行う方法があるかどうかはまだ分かりません。
この場合、スクリプトレットを使用する方法があります。私は次のようなものになりました。
<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
私の間違い、私はparamValuesを使用していません。私は、社内のライブラリからMapを使用しています。これを反映するために投稿を編集します。 –