パラメータから JSP で URL を作成しようとしていMap<String, Object>
ます。既存のコードはマップを反復処理し、キーと値の c:params を追加します。
<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 の配列では機能しません。式 の場合、JSTL はその部分をインデックスとして使用するために整数に${someArray.class}
変換しようとするためです (誰かがこれを良いアイデアだと思ったとは信じられません)。.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>