我在 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
计算结果为 Integer
。 Long
永远不会 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 引擎负责必要的类型强制转换(从 currVal
的 Integer
结果到 所需的
方法。您的方法只是用来指示所需的类型;没有它,JSP 引擎会看到 Long
toLong()testMap.get(Object)
参数的(已删除的)类型,并且认为不需要执行任何强制转换,因为 Integer
是一个 Object
。
关于java - JSTL 访问 HashMap 中的整数/长键,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10418624/