【发布时间】:2016-03-12 00:29:05
【问题描述】:
我有一个在 JSP 中使用的自制标签库。我的contains -tag 有问题。
这是一个通用的包含检查,它接受一个列表和一个对象,并执行一个简单的检查列表是否包含该对象。但是,当列表包含整数值时,我遇到了问题。
这就是我对标签的称呼:
<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",没有区别...
【问题讨论】:
-
"...更正式地说,当且仅当此列表包含至少一个元素 e 满足 (o==null ? e==null : o.equals(e)) 时才返回 true。 " 在你的情况下这永远不会是真的,因为 1 被视为字符串并且(我猜)你的 List 的成员是整数。所以要么你应该使用一些Generics 或者使用一个字符串列表。
-
您是说没有办法将值作为数字整数传递吗?目前我正在研究是否可以使用反射来类型转换值,如果它们不是同一类型。但是,如果我可以指定该值应该是数字,它会更加简单和干净。
-
这就是我建议泛型的原因。不要使用
Object,而是使用 T 作为类型。如果允许列表实际上是整数列表而不是对象列表,我认为应该可以将 1 视为数字 1。如果这里可以的话。我对 JSTL 没有太多经验... -
通用类型无关紧要。无论如何,它们都被删除了。所以你的评论无处可去,菲尔多。 EL 中的硬编码数字仅被解释为
Long,它永远不会等于Integer。尽管如此,为什么要使用整个标签而不是${someList.contains(object)},或者您还没有使用 Servlet 3.0 / EL 2.2? (虽然这已经 6 年了) -
听起来很有趣。我对泛型不是很流利,但我会试一试。无论如何,它似乎比反射更干净!
标签: jsp el strong-typing custom-tags