在 JSTL/EL 中,枚举到字符串的比较究竟应该如何工作?
In JSTL/EL, how exactly are enum-to-string comparisons supposed to work?
给定一个 JSP 页面,并且一些对象绑定到一个名为 "foo" 的请求属性,我可以参考 "foo" 与:
${foo}
如果 "foo" 的值有一个 bean 属性 调用,比如说 "type",并且 "type" 的类型是一些 enum
class,那么为了进行比较,我会使用一个字符串:
<c:if test='${foo.type == "WHATEVER"}'>
然后假设我的 enum
class 中的常量之一具有名称 "WHATEVER",该比较应该有效,并产生 true
或 false
.
现在我想知道 servlet 容器应该如何准确地执行该比较。一些 Oracle 文档(here)暗示(模糊地)发生的事情是将字符串常量转换为 enum
类型,然后进行比较。
我正在调查一种情况,我 认为 在 Jetty/Tomcat(即 Apache)和 Resin 之间工作方式不同。 Apache 世界似乎在做正确的事情,或者至少是我根据 Oracle 的文档所期望的事情。
我担心的是我的 enum
中的另一个 属性 可能会导致 Resin 实现做一些不同的事情。具体来说,我的 enum
class 有一个 .toString()
实现,returns 与 .name()
返回的字符串不同。这个怪癖不会在 Apache 服务器中造成任何问题,或者至少 none 我所见过的。如果 Resin 通过将枚举常量转换为字符串(通过 .toString()
,而不是 .name()
)而不是将字符串转换为 enum
类型来实现比较,那么事情将无法始终如一地进行。
请注意,在所有其他方面,我在 JSP/JSTL/EL 中以各种其他方式使用我的 enum
类型(其中很多都是这样)没有任何问题。事实上,JSP 中只有少数地方有 EL 逻辑,因为应用程序通过客户端模板渲染完成大部分工作。
edit — 我很确定我确认 Resin 以不同的方式进行比较,尽管我不知道那是什么。我在自己的 EL 函数库中有一个(由于我不记得的原因)"name" EL 函数,所以我可以用它来解决这个问题。
很遗憾,Resin 处理不正确。我已在 http://bugs.caucho.com/view.php?id=5925
提交错误
给定一个 JSP 页面,并且一些对象绑定到一个名为 "foo" 的请求属性,我可以参考 "foo" 与:
${foo}
如果 "foo" 的值有一个 bean 属性 调用,比如说 "type",并且 "type" 的类型是一些 enum
class,那么为了进行比较,我会使用一个字符串:
<c:if test='${foo.type == "WHATEVER"}'>
然后假设我的 enum
class 中的常量之一具有名称 "WHATEVER",该比较应该有效,并产生 true
或 false
.
现在我想知道 servlet 容器应该如何准确地执行该比较。一些 Oracle 文档(here)暗示(模糊地)发生的事情是将字符串常量转换为 enum
类型,然后进行比较。
我正在调查一种情况,我 认为 在 Jetty/Tomcat(即 Apache)和 Resin 之间工作方式不同。 Apache 世界似乎在做正确的事情,或者至少是我根据 Oracle 的文档所期望的事情。
我担心的是我的 enum
中的另一个 属性 可能会导致 Resin 实现做一些不同的事情。具体来说,我的 enum
class 有一个 .toString()
实现,returns 与 .name()
返回的字符串不同。这个怪癖不会在 Apache 服务器中造成任何问题,或者至少 none 我所见过的。如果 Resin 通过将枚举常量转换为字符串(通过 .toString()
,而不是 .name()
)而不是将字符串转换为 enum
类型来实现比较,那么事情将无法始终如一地进行。
请注意,在所有其他方面,我在 JSP/JSTL/EL 中以各种其他方式使用我的 enum
类型(其中很多都是这样)没有任何问题。事实上,JSP 中只有少数地方有 EL 逻辑,因为应用程序通过客户端模板渲染完成大部分工作。
edit — 我很确定我确认 Resin 以不同的方式进行比较,尽管我不知道那是什么。我在自己的 EL 函数库中有一个(由于我不记得的原因)"name" EL 函数,所以我可以用它来解决这个问题。
很遗憾,Resin 处理不正确。我已在 http://bugs.caucho.com/view.php?id=5925
提交错误