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