2012-04-12 29 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'}でした。

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

'$ {paramValues}'は実際には 'Map 'です。それに応じてそれだけを扱うのはなぜですか?あなたの具体的な問題に関しては、 'object [0] .class.name'を使ってください。しかし、常に' java.lang.String'が得られます。 – BalusC

+0

私の間違い、私はparamValuesを使用していません。私は、社内のライブラリからMap を使用しています。これを反映するために投稿を編集します。 –

答えて

1

jspスクリプトレット<% ... %>を開きます。この非標準的な状況で私は直接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"); %> 
関連する問題