为什么jsp中的EL函数必须声明为静态的?

为什么jsp中的EL函数必须声明为静态的?,jsp,el,Jsp,El,我正在阅读一些关于EL用户定义函数的JSP文本,作者说这些函数必须声明为静态的,并且没有给出其他解释。我试图声明非静态函数,得到了一个org.apache.jasper.jaspereException:java.lang.NullPointerException….. 有人能详细说明一下吗?如果它们不是静态的,运行时将负责创建包含函数的类的实例。导致对这些对象进行状态管理——这实际上意味着您应该编写一个自定义标记。您应该仅将EL函数视为助手,在大多数情况下,您将希望创建自定义标记。如果这些函数

我正在阅读一些关于EL用户定义函数的JSP文本,作者说这些函数必须声明为静态的,并且没有给出其他解释。我试图声明非静态函数,得到了一个
org.apache.jasper.jaspereException:java.lang.NullPointerException…..


有人能详细说明一下吗?

如果它们不是静态的,运行时将负责创建包含函数的类的实例。导致对这些对象进行状态管理——这实际上意味着您应该编写一个自定义标记。您应该仅将EL函数视为助手,在大多数情况下,您将希望创建自定义标记。

如果这些函数不是静态的,您将需要一些实例来调用这些方法

这是最新版本的表达式语言(来自JSP2.1)允许您执行的操作。它可以调用方法(非静态函数):

${bean.doSomethingGreat('with arguments')}

(原始EL只允许您使用
${bean.property}
语法调用getter)。

简短回答:因为

函数映射到Java类中的公共静态方法

为什么它必须是静态的两个技巧:

  • 由于历史原因,

  • 出于性能原因

今天,用无参数构造函数创建一个新的对象实例,然后调用function方法并让垃圾收集器除去该实例,这并不是什么大不了的事情。如果在大循环中使用该函数,可能会造成伤害,但通常不会有问题

实例方法更适合测试驱动的世界,因为在测试中模拟比静态方法更容易