Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/11.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java spring form taglib disabled属性真的必须解析为字符串吗?_Java_Spring_Jsp_Spring Mvc - Fatal编程技术网

Java spring form taglib disabled属性真的必须解析为字符串吗?

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元素 这向我表明标记需要该属性中的字符串,并且拒绝强制任何布尔值(可能先检查类型) 其影响是,我无法执行类似于的操作,这在我们的系统中

我最近一直在玩spring表单taglib,遇到了一个相当令人不安的现象

<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}" />