Java spring form taglib disabled属性真的必须解析为字符串吗?
我最近一直在玩spring表单taglib,遇到了一个相当令人不安的现象Java spring form taglib disabled属性真的必须解析为字符串吗?,java,spring,jsp,spring-mvc,Java,Spring,Jsp,Spring Mvc,我最近一直在玩spring表单taglib,遇到了一个相当令人不安的现象 <form:select path="whatever" disabled="${true}"> 将呈现未禁用的select元素 <form:select path="whatever" disabled="${'true'}"> 将呈现禁用的select元素 这向我表明标记需要该属性中的字符串,并且拒绝强制任何布尔值(可能先检查类型) 其影响是,我无法执行类似于的操作,这在我们的系统中
<form:select path="whatever" disabled="${true}">
将呈现未禁用的select元素
<form:select path="whatever" disabled="${'true'}">
将呈现禁用的select元素
这向我表明标记需要该属性中的字符串,并且拒绝强制任何布尔值(可能先检查类型)
其影响是,我无法执行类似于
的操作,这在我们的系统中非常常见
我是否只是缺少表单taglibs功能的某些部分?这是合法的设计决定吗?缺陷?这有点奇怪,没错。Spring源代码显示
SelectTag
的disabled
属性是String
,而不是boolean
。这显然不是正确的做法,但我怀疑出于遗留的原因(spring-form.tld早于jspel)
这就让JSP运行时将布尔值
强制转换为字符串
,显然它不会这样做。我对此并不感到惊讶,因为jspel是出了名的有限的
因此,您被夹在两个半中断的实现之间。您只需要确保将字符串值传递给该属性。这种设计的原因是它们有一个特殊的回退代码,当容器不计算EL表达式时,它会强制EL表达式计算。例如,此代码:
<%@ page isELIgnored = "true" %>
...
${'Simple text'} <spring:message text = "${'Message text'} />"
好的,我在这件事上做了更多的挖掘,因为周围的工作看起来太难看了 问题是JSP正在评估el,并且盲目地使用“true.equals”比较评估结果 使用该方法将字符串与布尔值进行比较将始终返回false,因为类型不匹配,所以这肯定是一个缺陷 幸运的是,isDisabled方法是一个受保护的单行程序,因此我能够通过扩展8输入标记的影响并覆盖该方法来解决这个问题,从而进行更稳健的比较 所以答案是,是的,这是一个缺陷,从skaffman的评论来看,旧库在实现JSP EL时没有得到很好的更新似乎有点问题
谢谢你们的回答,伙计们我本打算建议在春季论坛和/或JIRA上提出这个问题,但我看到你们已经有了一个完整的主题和一个JIRA问题:)我还没有对我在春季论坛上的任何问题做出回应,我想这是几年来大约10个主题中的一个。所以,虽然我仍在努力,但我真的只是在那里发帖,因为我觉得那是个合适的地方。并不是因为我觉得它可能会给出任何答案。从我所看到的情况来看,tld使用了一种spring eval机制,它支持JSP2 EL和JSP1 EL,所以我认为这只是一个试图保持向后兼容性的实现中的小错误,而不是一个令人憎恶的设计缺陷
<%@ page isELIgnored = "true" %>
...
<form:select ... disabled = "${true}" />