2012-05-02 10 views
2

JSTLでELを使用する際に問題があり、Javaハッシュマップにアクセスできない場合があります。私は、ELのキーでIntegerがLongとしてアクセスされるかどうかを知っています。私はJSTLにアクセスしようとしているハッシュマップの定義以下のいる -JSTLハッシュマップの整数/ロングキー

Map<Long, Object> testMap = new HashMap<Long, Object>(); 

JSPページでは、私はマップが特定のキーが含まれているかいないかどうかを確認する必要があります。私は、次のように空になっていないかどうかをチェックすることによってこれを行うにしよう -

<c:if test='${ ! empty testMap[currObj.currVal]}'> 

私もどこかに以下のようなコードでのキーのマップの値にアクセス -

<c:if test='${ testMapMap[5].data == 'something'}'> 

問題 -

もし私が上記のマップを<Integer, Object>と定義すると、最初のc:ifは動作しますが、2番目のマップは失敗します(2番目のマップはLongとしてアクセスしようとします)。しかし、私が上記のマップを<Long, Object>と定義した場合、最初のifチェックは常に空であると認識されるので、常に失敗しますが、値をチェックする2番目のifステートメントが機能します。

両方のifステートメントのHashMapに正しくアクセスするための良い方法はありますか?私は意見を感謝します。

+0

「5L」は2番目のものに対応していますか? –

+0

上記の例では、2番目のマップは正しくLongにアクセスしていますので、マップの最後に "L"を付ける必要はありませんでした。 – JUG

+0

ああ、申し訳ありませんが、それを後方に読んでください。 –

答えて

4

currObjとは何ですか? currValのメンバーをLong(またはlong)と再定義できますか?


数値リテラルは(EL構文のIntegerLiteral生産に一致)Longとして表されます。式currObj.currValは、Integerと評価されます。 A Long決してequals()Integerなので、1つの式は異なる型になるはずです。

本質的に必要なのは、明示的な型変換です。このようなものはELに組み込まれていませんが、カスタムEL関数を作成してそれを行うことができます。これはJavaで実装し、次にTLDで記述する静的関数です。パッケージングの私のgives an exampleの別の答え。あなたの場合に関数とその使用法がどのように見えるかは次のとおりです。

package com.y.taglib.core; 

public final class CoercionUtil { 

    public static Long toLong(Long n) { 
    return n; 
    } 

} 

TLDは、次のようになります。あなたのJSPで

<taglib xmlns="http://java.sun.com/xml/ns/j2ee" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://java.sun.com/xml/ns/j2ee http://java.sun.com/xml/ns/j2ee/web-jsptaglibrary_2_0.xsd" version="2.0"> 
    <tlib-version>1.0</tlib-version> 
    <short-name>x-c</short-name> 
    <uri>http://dev.y.com/taglib/core/1.0</uri> 
    <function> 
    <description>Coerce to a java.lang.Long.</description> 
    <display-name>long</display-name> 
    <name>long</name> 
    <function-class>com.y.taglib.core.CoercionUtil</function-class> 
    <function-signature>java.lang.Long toLong(java.lang.Long)</function-signature> 
    </function> 
</taglib> 

<%@taglib uri="http://dev.y.com/taglib/core/1.0" prefix="my" %> 
... 
<c:if test='${ ! empty testMap[my:long(currObj.currVal)]}'> 

JSPエンジンはcurrValInteger結果からに(必要な型変換の面倒を見ますtoLong()メソッドで必要とされるLongがあります。メソッドでは、必要な型を指定するだけで、JSPエンジン引き数testMap.get(Object)の(消去された)タイプを除き、IntegerObjectなので強制を実行する必要はありません。

+0

残念ながら、私はそれを所有者ではないため再定義できません。他の外部コンポーネント同様、 'currObj'の' currVal'は整数を返します – JUG

+0

@JUG私の更新を見てください – erickson

+0

ありがとう、私はこれを避けることを望んでいましたが、私はそれ以外の方法はありません。他の誰かからより良い解決策が聞こえない場合は、あなたの助けを感謝します。 – JUG

関連する問題