spring form taglib disabled属性是否必须解析为字符串?

我最近一直在玩弹簧forms的taglib并遇到了一个相当令人不安的现象。

将呈现未禁用的select元素

  

将呈现禁用的select元素。

这向我表明标签需要该属性中的字符串并且拒绝强制任何布尔值(可能首先检查类型)。

影响是我无法做像

这样的事情,这在我们的系统中经常发生。

我只是遗漏了表单taglibsfunction的一部分吗? 这是一个合法的设计决定吗? 缺陷?

好吧,我做了一些更多关于这个,因为解决方案看起来太难看了。

http://forum.springsource.org/showthread.php?t=84102

问题是JSP正在评估el,并使用“true”.equals盲目地比较评估结果

使用该方法将String与布尔值进行比较将始终返回false,因为类型不匹配,因此它肯定是一个缺陷。

幸运的是,故障中的isDisabled方法是一个受保护的单线程,因此我能够通过扩展8输入标记的影响并覆盖该方法来进行稍微更稳健的比较。

所以答案是,是的,这是一个缺陷,并且从skaffman的评论看起来,当JSP EL实现时,旧库没有得到很好的更新,这看起来有些问题。

谢谢你们的回答

这有点奇怪,对吧。 Spring源代码显示SelectTagdisabled属性是String ,而不是boolean 。 这显然不是正确的做法,但我怀疑它仍然是出于传统原因(spring-form.tld早于JSP EL)。

这使得JSP运行时将一个boolean强制转换为String ,显然它不会这样做。 我对此并不感到惊讶,因为JSP EL非常有限。

所以你陷入了两个半破坏的实现之间。 您只需要确保将String值传递给该属性。

这种设计的原因是它们有一个特殊的回退代码,当容器不对它进行评估时强制进行EL表达式评估。 例如,这段代码:

 <%@ page isELIgnored = "true" %> ... ${'Simple text'}  

生成${'Simple text'} Message text

可能,它对一些奇怪的传统容器配置很有用。

也就是说,如果它们使disabled属性boolean ,则以下代码将不起作用:

 <%@ page isELIgnored = "true" %> ...