我有一个在JSP中使用的自制标记库。我的contains
标签有问题。
这是一个通用的包含检查,它接受一个列表和一个对象,并对列表是否包含对象执行简单的检查。但是,当列表包含Integer值时,我遇到了问题。
这就是我所说的标签:
<custom:contains object="1" list="${sessionScope.USER.userProfiles}"/>
这是它调用的Java类:
public class ContainsTag extends SimpleTagSupport{
private List<Object> list;
private Object object;
public void setList(List<Object> list) {
this.list = list;
}
public void setObject(Object object) {
this.object = object;
}
@Override
public void doTag() throws JspException, IOException {
boolean result;
try {
if(list == null || object == null){
result = false;
}
else{
result = list.contains(object);
}
getJspContext().getOut().print(result);
} catch (Exception e) {
e.printStackTrace();
// stop page from loading further by throwing SkipPageException
throw new SkipPageException("Exception in checking if " + list
+ " contains " + object);
}
}
}
Printline语句显示,即使对象已打印1
,列表也已打印[1]
,结果仍为false
。由于标签适用于其他类型的对象(字符串等),因此得出的结论是对象是字符串值,因此在整数列表中找不到。我也不能将对象精确地转换为整数,因为我的标记不再通用。
有没有一种方法可以指定参数是EL中的整数?我是否需要制作另一个名为的标签ContainsInteger
?还是对此问题有其他解决方案?
更新:
将对象值设置为"${1}"
而不是"1"
,没有区别...
该object="1"
不会起作用,因为它代表了一个String
。
String string1 = "1";
Integer integer1 = new Integer(1);
System.out.println(string1.equals(integer1)); // false
将object="${1}"
在EL默认不起作用,因为基于整数的数字Long
。见“B 1.7.1二元运算- - A {* +,}”中的“表达式语言规范”(由指定的JSR-341有详细介绍)。
Long long1 = new Long(1L);
Integer integer1 = new Integer(1);
System.out.println(long1.equals(integer1)); // false
解决问题的一种方法是使用List<Long>
代替List<Integer>
,或者让自定义标签比较toString()
两只手的结果。
String string1 = "1";
Integer integer1 = new Integer(1);
System.out.println(string1.toString().equals(integer1.toString())); // true
Long long1 = new Long(1L);
Integer integer1 = new Integer(1);
System.out.println(long1.toString().equals(integer1.toString())); // true
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句