JSP中的表达式语言:算术运算符分区

时间:2014-03-05 15:53:15

标签: java jsp java-ee servlets el

我需要澄清关于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是一个在任何范围内都不可用的变量。

请帮助我理解这种行为。

谢谢!

1 个答案:

答案 0 :(得分:1)

Hello JavaHopper以及其他所有人。

我想,我找到了解决方案。

我的设置:

  • NetBeans 8.2(Build 201609300101)
  • Java EE6
  • Apache Tomcat 8.0.27.0

  • Tomcat的碧玉8.0.0-RC1-sources.jar

从此页面: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);