JSTL访问哈希映射中的整数/长键

时间:2012-05-02 17:19:57

标签: java hashmap jstl el

我在JSTL中使用EL时遇到了一些问题,并且无法按照我的意愿访问Java Hash Map。我知道在EL中键,如果Integer被访问为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有效但第二个失败(因为第二个尝试将其作为Long访问)。但是,如果我将上面的地图定义为<Long, Object>,则第一个检查总是失败,因为它总是将其识别为空,但是第二个if语句我检查该值是否有效。

有没有什么好方法可以确保我正确地访问if语句的HashMap?我会很感激的意见。

1 个答案:

答案 0 :(得分:4)

什么是currObj?您可以将currVal成员重新定义为Long(或long)吗?


数字文字(与EL语法中的IntegerLiteral作品相匹配)将表示为Long。表达式currObj.currVal的计算结果为IntegerLong从不equals()Integer,因此一个表达式必须导致不同的类型。

基本上,您需要的是显式类型转换。 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看起来像这样:

<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,因此不需要执行任何强制操作1}}。