2

JSTLでELを使用する際に問題が発生し、Javaハッシュマップにアクセスできません。ELで、整数がLongとしてアクセスされる場合のキーを認識しています。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としてマップにアクセスしようとするため)。ただし、上記のマップを最初のifチェックとして定義すると、<Long, Object>常に空として認識されるため失敗しますが、値をチェックする2番目のifステートメントは機能します。

両方のifステートメントでHashMapに正しくアクセスできるようにするための良い方法はありますか?ご意見をいただければ幸いです。

4

1 に答える 1

4

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


数値リテラル(IntegerLiteralEL構文の生成に一致)は、として表されますLong。式currObj.currValはに評価されますIntegerLong決してequals()、ではIntegerないので、1つの式は別の型になる必要があります。

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

package com.y.taglib.core;

public final class CoercionUtil {

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

}

TLDは次のようになります。

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

JSPの場合:

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

JSPエンジンは、必要な型の強制を処理します(メソッドのInteger結果currValからLong必要なものまでtoLong()。メソッドは単に必要な型を示すためにあります。それがないと、JSPエンジンは、の引数の(消去された)型を認識しますtestMap.get(Object)。でIntegerあるため、強制を実行する必要はありませんObject

于 2012-05-02T17:26:57.013 に答える