java - JSTL 访问 HashMap 中的整数/长键

标签 java hashmap jstl el

我在 JSTL 中使用 EL 时遇到一些问题,无法按照我的意愿访问 Java Hash Map。我知道在 EL 中,如果 Integer 被作为 Long 访问,则该键是关键。我尝试在 JSTL 中访问以下 HashMap 定义 -

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

在JSP页面中,我需要检查 map 是否包含特定键。我尝试通过检查是否不为空来做到这一点,如下所示 -

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

我还可以在代码中的某个位置访问 map 的键值,如下所示 -

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

现在的问题 -

如果我将上面的 map 定义为 <Integer, Object>那么第一个 c:if 可以工作,但第二个失败(因为第二个尝试以 Long 形式访问它)。但是,如果我将上面的 map 定义为 <Long, Object>第一个 if 检查总是失败,因为它总是将其识别为空,但我检查值的第二个 if 语句有效。

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

最佳答案

什么是 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 引擎负责必要的类型强制转换(从 currValInteger 结果到 所需的 Long toLong() 方法。您的方法只是用来指示所需的类型;没有它,JSP 引擎会看到 testMap.get(Object) 参数的(已删除的)类型,并且认为不需要执行任何强制转换,因为 Integer 是一个 Object

关于java - JSTL 访问 HashMap 中的整数/长键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10418624/

相关文章:

java - 多模式使用的副作用

java - Fragment 中的 RecyclerView 初始化

javascript - 在不知道其名称的情况下获取 HashMap 的键

Java HashMap 将值添加到列表的头部

java - c :forEach returning String instead of Object

java - 使用 Stripes,我可以将 ActionBean 的输出分辨率包含到 jsp 中吗?

java - 如何用 JTable 搜索的列填充 JTextFields?

python - 内部字典顺序可以改变吗?

javascript - 将确认消息的结果传递给 spring mvc Controller

java - 背景图像不工作 javaFX