【问题标题】:Does spring form taglib disabled attribute really have to resolve to a string?spring form taglib disabled 属性真的必须解析为字符串吗?
【发布时间】:2010-02-02 21:29:15
【问题描述】:

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

<form:select path="whatever" disabled="${true}">

将呈现未禁用的选择元素

<form:select path="whatever" disabled="${'true'}">

将呈现一个被禁用的选择元素。

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

影响是我无法执行 &lt;form:select path="whatever" disabled="${someOtherfield.selectedId != -1}" /&gt; 之类的操作,这在我们的系统中经常发生。

我只是缺少表单标记库功能的某些部分吗?这是一个合法的设计决定吗?缺陷?

【问题讨论】:

  • 我本来打算在 Spring 论坛和/或 JIRA 上提出这个建议,但我看到你自己已经有了一个完整的线程和一个 JIRA 问题 :)
  • 我在春季论坛上的任何问题都没有得到答复,我认为这已经是几年来大约 10 个左右的主题了。因此,尽管我仍在继续尝试,但我真的只是在那里发帖,因为我觉得这是正确的地方。不是因为我觉得它可能会产生任何答案。

标签: java spring jsp spring-mvc


【解决方案1】:

好的,我对此进行了更多挖掘,因为变通方法看起来太丑陋了。

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

问题在于 JSP 正在评估 el,并使用 "true".equals 盲目地比较该评估的结果

使用该方法将 String 与 Boolean 进行比较将始终返回 false,因为类型不匹配,所以这绝对是一个缺陷。

幸运的是,错误的 isDisabled 方法是一个受保护的单行,所以我已经能够通过扩展 8 个输入标签的影响并覆盖该方法来进行更稳健的比较来解决它。

所以答案是,是的,这是一个缺陷,从 skaffman 的 cmets 看来,在实施 JSP EL 时,旧库没有得到很好的更新,这似乎有点问题。

谢谢你们的回答

【讨论】:

    【解决方案2】:

    这有点奇怪,没错。 Spring源码显示SelectTagdisabled属性是String,而不是boolean。这显然不是正确的做法,但我怀疑由于遗留原因(spring-form.tld 早于 JSP EL),它仍然是这种方式。

    这让 JSP 运行时将boolean 强制转换为String,显然它不会这样做。我对此并不感到惊讶,因为 JSP EL 是出了名的受限。

    因此,您被夹在两个半损坏的实现之间。您只需要确保将字符串值传递给该属性。

    【讨论】:

    • 据我所知,tld 使用了同时支持 JSP2 EL 和 JSP1 EL 的 spring eval 机制,所以我认为这只是实现中的一个小错误,它试图保持向后兼容性,而不是一个可恶的设计缺陷
    【解决方案3】:

    这种设计的原因是他们有一个特殊的后备代码来在容器不评估它时强制 EL 表达式评估。例如这段代码:

    <%@ page isELIgnored = "true" %>
    ...
    ${'Simple text'} <spring:message text = "${'Message text'} />"
    

    产生${'Simple text'} Message text

    可能它对一些奇怪的遗留容器配置很有用。

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

    <%@ page isELIgnored = "true" %>
    ...
    <form:select ... disabled = "${true}" />    
    

    【讨论】:

      猜你喜欢
      • 2012-03-29
      • 1970-01-01
      • 2019-03-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-09-28
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多