当我编写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会对我们这么做吗?
答案 0 :(得分:4)
你们中的任何人都可以帮助我理解为什么JCP会对我们这么做吗?
这是Java程序员某个子集的bondage and discipline思维模式的一部分,他们知道每个人应该创作应用程序的The One True Way。
在编写模板时,您无法信任您可以使用完整的语言,因为您可能会滥用它来将业务逻辑和表示混合在一起,就像那些可怕的,粗鲁的PHP编码器那样。呃,想象一下!
程序员是敌人,必须防止做恶。可能会发现程序员实际上只是在尝试调试某些东西,或者快速入侵以使应用程序暂时运行。或者可能会发现存在表示逻辑这样的事情,并且让你将这些东西移动到应用程序中的一堆标记和bean类中,这与其他方式一样令人不快。
但没关系!为了捍卫Java贞操的目的,非常值得为您带来不便。
[对不起,但这已经是一个非常严重的问题了。]
PS。我猜想总是有Groovy。
答案 1 :(得分:3)
您想要的功能在JSR 245(more here)中定义。如果您现在需要,请从UEL project或替代实施(例如JUEL)下载。如果您需要等待它成为标准的一部分,它将包含在JEE6中。在那之前......好吧,你已经知道了你的选择。
答案 2 :(得分:2)
看看Seam!通过Seam,EL成为应有的方式。即使使用参数调用方法也很轻松。
答案 3 :(得分:0)
我希望目标是强制执行严格的模型 - 视图分离,如StringTemplate。
这个想法非常简单:如果您无法访问方法,那么您将被迫在控制器中计算所有数据,然后在视图中对其进行格式化。当然,他们通过允许您访问函数来混淆消息,并且他们没有得到帮助,因为在Java中构建元组映射列表(读取:没有类的结构化数据)并不容易。 Python,Ruby等
无论如何,这里有一篇关于编写标记的文章,可以让你调用arbitrary methods,可能会觉得它很有帮助。