EL中的方法调用

时间:2009-03-28 11:13:15

标签: java jsp jstl

当我编写Java webapps时,我通常使用JSTL标记。我认为这些标签很棒,除了一件令我生气的事情:虽然表达式语言允许你访问bean属性,但它不允许你调用它的方法。

在1.0版中,甚至无法获得字符串的长度或集合中的元素数。从版本1.1开始,添加了fn:length函数,因此您可以执行以下操作:

...
<%@ taglib prefix="fn" uri="http://java.sun.com/jsp/jstl/functions" %>
...
<c:if test="${fn:length(str) > 10}">
    ...
</c:if>
...

哪个更啰嗦,更丑陋(恕我相信)比:

...
<c:if test="${str.length() > 10}">
    ...
</c:if>
...

接缝JSTL 2.0将允许您定义新功能,但是您需要专门为此目的编写一个类,您将在其中定义(静态)方法,并且还需要编写TLD文件将包含在将使用这些函数的每个jsp中。

无论您是定义自定义函数还是使用其他解决方法,都需要编写许多其他代码。

我在某处读过JCP自愿禁止从表达式语言中调用方法。

你们中的任何人都可以帮助我理解为什么JCP会对我们这么做吗?

4 个答案:

答案 0 :(得分:4)

  

你们中的任何人都可以帮助我理解为什么JCP会对我们这么做吗?

这是Java程序员某个子集的bondage and discipline思维模式的一部分,他们知道每个人应该创作应用程序的The One True Way。

在编写模板时,您无法信任您可以使用完整的语言,因为您可能会滥用它来将业务逻辑和表示混合在一起,就像那些可怕的,粗鲁的PHP编码器那样。呃,想象一下!

程序员是敌人,必须防止做恶。可能会发现程序员实际上只是在尝试调试某些东西,或者快速入侵以使应用程序暂时运行。或者可能会发现存在表示逻辑这样的事情,并且让你将这些东西移动到应用程序中的一堆标记和bean类中,这与其他方式一样令人不快。

但没关系!为了捍卫Java贞操的目的,非常值得为您带来不便。

[对不起,但这已经是一个非常严重的问题了。]

PS。我猜想总是有Groovy。

答案 1 :(得分:3)

您想要的功能在JSR 245more here)中定义。如果您现在需要,请从UEL project或替代实施(例如JUEL)下载。如果您需要等待它成为标准的一部分,它将包含在JEE6中。在那之前......好吧,你已经知道了你的选择。

答案 2 :(得分:2)

看看Seam!通过Seam,EL成为应有的方式。即使使用参数调用方法也很轻松。

答案 3 :(得分:0)

我希望目标是强制执行严格的模型 - 视图分离,如StringTemplate

这个想法非常简单:如果您无法访问方法,那么您将被迫在控制器中计算所有数据,然后在视图中对其进行格式化。当然,他们通过允许您访问函数来混淆消息,并且他们没有得到帮助,因为在Java中构建元组映射列表(读取:没有类的结构化数据)并不容易。 Python,Ruby等

无论如何,这里有一篇关于编写标记的文章,可以让你调用arbitrary methods,可能会觉得它很有帮助。