EL中的方法调用

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

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

...  ...  10}"> ...  ... 

哪个更冗长,更丑陋(恕我直言)比:

 ...  10}"> ...  ... 

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

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

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

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

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

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

它是Java程序员某个子集的束缚和纪律思维的一部分,他们知道每个人应该编写应用程序的The One True Way。

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

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

但没关系! 为了捍卫Java的贞洁而服务是非常值得的。

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

PS。 我想总有Groovy。

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

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

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

无论如何,这里有一篇关于编写允许你调用任意方法的标签的文章,可能会发现它很有帮助。