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