如何在我的自定义 JSP 标记中将整数值作为参数传递?

Posted

技术标签:

【中文标题】如何在我的自定义 JSP 标记中将整数值作为参数传递?【英文标题】:How can I pass an integer value as a parameter in my custom JSP tag? 【发布时间】: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 年了) 听起来很有趣。我对泛型不是很流利,但我会试一试。无论如何,它似乎比反射更干净! 【参考方案1】:

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

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

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

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

解决问题的一种方法是使用List&lt;Long&gt; 而不是List&lt;Integer&gt;,或者让自定义标签比较双手的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

【讨论】:

非常感谢您的回答。即使它没有具体说明,我在两行之间读到指定参数是整数值是不可能的。感谢您澄清 EL 默认为 long 。使用长列表而不是整数的建议是有道理的,但对我来说似乎很脏。我的整数值可能永远不会是两位数长,为此使用 long 会让我感觉很不对劲。我将考虑升级到 servlet 3.0/EL 2.2,使用反射进行类型转换,和/或为 containsInteger 创建一个新的特定标记。不过非常感谢! 如果1 是一个基于整数的bean 属性,比如$someBean.userProfile,而不是硬编码值,它会起作用。您没有在任何地方说明具体的功能要求,但如果我做一个有根据的猜测,我认为您实际上最终需要枚举。 嗯。我的用户资料是基于数据库的。如果我提取它们并将它们传递给 sessionScoped 全局应用程序数据,我可以从那里获取相关的整数值。那将是一个很好的方式。枚举也可能是一个好主意,但在我目前的水平上,我很难在这种情况下思考如何使用枚举。不过,我确实认为我现在会让这项工作变得非常漂亮和干净!你很棒。 (如果您需要跳伞课程,请告诉我。对于聋人来说,这是一项完美的运动)

以上是关于如何在我的自定义 JSP 标记中将整数值作为参数传递?的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Delphi 2010 中将参数传递给 flash 电影?

如何收听Android中的自定义标记位置变化?

REACT - 如何在 Mui-Datatables 中将逗号分隔符添加到整数值

如何在颤动中将十六进制颜色代码解析为它们各自的整数值

如何将参数传递给 JSP 组件?

如何在 Android Java 中将 Color.RED 代码转换为颜色的整数值? [复制]