2

我有一个在 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",没有区别......

4

1 回答 1

2

object="1"不起作用,因为它代表一个String.

String string1 = "1";
Integer integer1 = new Integer(1);
System.out.println(string1.equals(integer1)); // false

object="${1}"不起作用,因为 EL 中基于整数的数字默认为Long. 有关详细信息,请参阅“表达式语言规范”(由JSR-341指定)中的“1.7.1 二元运算符 - A {+,-,*} B”部分。

Long long1 = new Long(1L);
Integer integer1 = new Integer(1);
System.out.println(long1.equals(integer1)); // false

解决问题的一种方法是使用 aList<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
于 2015-12-07T12:24:51.207 回答