当我编写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>
...
Run Code Online (Sandbox Code Playgroud)
哪个更冗长,更丑陋(恕我直言)比:
...
<c:if test="${str.length() > 10}">
...
</c:if>
...
Run Code Online (Sandbox Code Playgroud)
它接缝JSTL 2.0将允许您定义新功能,但您需要专门为此目的编写一个类,您将在其中定义(静态)方法,并且您还需要编写一个TLD文件.包含在将使用这些功能的每个jsp中.
无论您是定义自定义函数还是使用其他解决方法,都需要编写大量其他代码.
我在某处读过JCP自愿禁止从表达式语言中调用方法.
你们中的任何人都可以帮助我理解为什么JCP会对我们这么做吗?
您想要的功能在JSR 245中定义(更多信息请参见此处)。如果您现在需要它,请从UEL 项目或替代实现(例如JUEL )下载它。如果需要等待它成为标准的一部分,它将包含在 JEE6 中。在那之前......好吧,你已经知道你的选择了。