我在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?我会很感激的意见。
答案 0 :(得分:4)
什么是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引擎负责必要的类型强制(从Integer
currVal
结果到Long
方法所需的toLong()
。您的方法就在那里指示所需类型;没有它,JSP引擎会看到testMap.get(Object)
参数的(已擦除)类型,并且由于Integer
是一个{{Object
,因此不需要执行任何强制操作1}}。