我需要澄清关于JSP中的EL片段
$ {5/x} : ${5/x}
$ {10/0} : ${10/0}
$ {5/2} : ${5/2}
$ {x/10} : ${x/10}
$ {5 div null} : ${5 div null}
$ {x/x} : ${x/x}
$ {0/0} : ${0/0}
$ {x/null} : ${x/null}
$ {null div x} : ${null div x}
$ {null/null} : ${null/null}
上面jsp的输出是
$ {5/x} : Infinity
$ {10/0} : Infinity
$ {5/2} : 2.5
$ {x/10} : 0.0
$ {5 div null} : Infinity
$ {x/x} : 0
$ {0/0} : NaN
$ {x/null} : 0
$ {null div x} : 0
$ {null/null} : 0
我已经读过EL在处理空值或任何不在任何范围内的对象时都足够聪明。此外,EL中的除法运算符遵循浮点运算。
对于在任何范围内找不到的任何变量或null关键字,EL在那里放置值0。如果是这样,为什么$ {x / x},$ {x / null},$ {null div x}和$ {null / null}导致0? 我的猜测是,它应该是NaN,就像$ {0/0}一样。 (因为,null或un-available变量为'0')
注意:在上面的代码段中,x是一个在任何范围内都不可用的变量。
请帮助我理解这种行为。
谢谢!
答案 0 :(得分:1)
Hello JavaHopper以及其他所有人。
我想,我找到了解决方案。
我的设置:
和
从此页面:http://www.java2s.com/Code/Jar/t/Downloadtomcatjasper800rc1sourcesjar.htm
用于调试。
正如你所说,如果两个操作数都是“ null ”,那么你会得到 0 。
如果我让它进行调试,那么它将调用一个名为:
的方法public static final Number divide(final Object obj0, final Object obj1)
可以在这里找到:
org.apache.el.lang.ELArithmetic.divide(obj0, obj1)
这是完整的方法:
public static final Number divide(final Object obj0, final Object obj1) {
if (obj0 == null && obj1 == null) {
return ZERO;
}
final ELArithmetic delegate;
if (BIGDECIMAL.matches(obj0, obj1))
delegate = BIGDECIMAL;
else if (BIGINTEGER.matches(obj0, obj1))
delegate = BIGDECIMAL;
else
delegate = DOUBLE;
Number num0 = delegate.coerce(obj0);
Number num1 = delegate.coerce(obj1);
return delegate.divide(num0, num1);
}
正如您在方法开始时所看到的,如果两个操作数都是 null ,则检查它们。
如果是,则返回 0(ZERO),并在JSP站点上显示为String。
所以它与数学规则没有关系。
希望,这有点帮助。
祝你好运
rikku47
PS:
简而言之,您可以致电:
org.apache.el.lang.ELArithmetic.divide(null, null);