5

当我编写 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

4 回答 4

4

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

这是某些 Java 程序员子集的束缚和纪律心态的一部分,他们知道每个人都应该编写应用程序的唯一正确方法。

在编写模板时,你不能相信你有一个功能强大的语言供你使用,因为你可能会滥用它来混合业务逻辑和表示,就像那些糟糕、粗俗的 PHP 编码人员所做的那样。呃,想象一下!

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

不过没关系!为维护 Java 的纯洁性而服务,给您带来不便是非常值得的。

[对不起,这已经是一个很无聊的问题了。嗯。]

PS。我想总是有 Groovy 的。

于 2009-03-28T23:30:15.140 回答
3

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

于 2009-03-28T14:24:19.787 回答
2

看看!有了 Seam,EL 就成为了它应有的样子。即使使用参数调用方法也很容易。

于 2009-03-29T12:39:20.687 回答
0

我希望目标是强制执行严格的模型视图分离,就像在StringTemplate中一样。

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

无论如何,这是一篇关于编写允许您调用任意方法的标签的文章,可能会有所帮助。

于 2009-03-28T12:19:29.433 回答