我正在阅读一些关于EL用户定义函数的JSP文本,并且作者说这些函数必须声明为静态并且没有给出其他解释。我试图声明非静态函数并获得org.apache.jasper.JasperException: java.lang.NullPointerException.....
有人可以详细说明吗?
答案 0 :(得分:1)
如果它们不是静态的,运行时将负责创建包含这些函数的类的实例。导致对这些对象进行状态管理 - 这实际上意味着您应该编写自定义标记。您应该将 EL函数视为帮助程序,在大多数情况下,您需要创建自定义标记。
答案 1 :(得分:1)
如果这些函数不是静态的,你需要一些实例来调用这些方法。
这是最新版本的Expression Language(来自JSP 2.1)允许您这样做。它可以调用方法(非静态函数):
${bean.doSomethingGreat('with arguments')}
(原始EL允许您仅使用${bean.property}
语法调用getter。)
答案 2 :(得分:1)
简短回答:因为JavaServer Pages Specification, JSP.2.10 Functions说:
函数映射到Java类中的公共静态方法。
为什么它必须是静态的两个提示:
由于历史原因,
出于表现原因。
今天使用no-arg构造函数创建一个新的对象实例然后调用函数方法并让垃圾收集器去除实例并不是什么大问题。如果你在一个大循环中使用该功能,它可能会受到伤害,但通常不是问题。
实例方法更适合测试驱动的世界,因为它在测试中比静态方法更容易模拟。