我正在阅读一些关于EL用户定义函数的JSP文本,作者说这些函数必须声明为静态,并没有给出任何其他解释。我试图申报非静态功能,并得到了一个org.apache.jasper.JasperException: java.lang.NullPointerException.....
为什么jsp中的EL函数必须声明为静态?
请问能有人详细说明吗?
我正在阅读一些关于EL用户定义函数的JSP文本,作者说这些函数必须声明为静态,并没有给出任何其他解释。我试图申报非静态功能,并得到了一个org.apache.jasper.JasperException: java.lang.NullPointerException.....
为什么jsp中的EL函数必须声明为静态?
请问能有人详细说明吗?
如果它们不是静态的,运行时将负责创建包含函数的类的实例。导致对这些对象进行状态管理 - 这实际上意味着你应该写一个自定义标签。您应该只将EL功能作为助手,在大多数情况下您需要创建自定义标签。
如果这些函数不是静态的,则需要一些实例来调用这些方法。
这是最新版本的表达式语言(来自JSP 2.1)允许您执行的操作。它可以调用方法(非静态函数):
${bean.doSomethingGreat('with arguments')}
(原EL允许你只叫干将,使用${bean.property}
语法)。
简短的回答:因为JavaServer Pages Specification, JSP.2.10 Functions说:
功能映射到Java类的public static方法。
两个小技巧,为什么它必须是静态的:
由于历史的原因,
出于性能的考虑。
今天,它不是一个大问题,以创建一个新的对象实例与一个无参数的构造函数,然后调用函数方法,让垃圾回收器摆脱实例。如果你在大循环中使用函数,它可能会受到伤害,但通常这不是问题。
实例方法更适合测试驱动的世界,因为它比测试静态方法更容易模拟测试。