在 JSTL/EL 中,枚举到字符串的比较究竟应该如何工作?
Posted
技术标签:
【中文标题】在 JSTL/EL 中,枚举到字符串的比较究竟应该如何工作?【英文标题】:In JSTL/EL, how exactly are enum-to-string comparisons supposed to work? 【发布时间】:2015-09-21 15:29:16 【问题描述】:给定一个 JSP 页面,以及一些绑定到名为“foo”的请求属性的对象,我可以通过以下方式引用“foo”:
$foo
如果 "foo" 的值有一个名为 "type" 的 bean 属性,并且 "type" 的类型是某个 enum
类,那么为了进行比较,我会使用一个字符串:
<c:if test='$foo.type == "WHATEVER"'>
然后假设我的enum
类中的一个常量名为“WHATEVER”,那么该比较应该有效,并产生true
或false
。
现在我想知道的是,servlet 容器应该如何进行比较。一些 Oracle 文档 (here) 暗示(含糊地)将字符串常量转换为 enum
类型,然后进行比较。
我正在调查涉及我认为在 Jetty/Tomcat(即 Apache)和 Resin 之间工作方式不同的代码的情况。 Apache 世界似乎在做正确的事情,或者至少是我根据 Oracle 的文档所期望的事情。
我担心的是我的enum
的另一个属性可能会导致 Resin 实现做一些不同的事情。具体来说,我的enum
类有一个.toString()
实现,它返回的字符串与.name()
返回的字符串不同。这个怪癖在 Apache 服务器中没有引起任何问题,或者至少没有我见过的问题。如果 Resin 通过将枚举常量转换为字符串(通过.toString()
,而不是.name()
)而不是将字符串转换为enum
类型来实现比较,那么事情将无法始终如一地工作。
请注意,在所有其他方面,我在 JSP/JSTL/EL 中以各种其他方式使用我的 enum
类型(很多都是这样的)没有任何问题。事实上,JSP 中只有少数地方有 EL 逻辑,因为应用程序的大部分工作都是通过客户端模板呈现来完成的。
edit — 我很确定我确认 Resin 以不同的方式进行比较,但我不知道具体是什么。我(因为我不记得的原因)在我自己的 EL 函数库中有一个“名称”EL 函数,所以我可以用它来解决这个问题。
【问题讨论】:
您是否尝试过.war
文件的最新版本)不支持该功能。然而,我自己的 EL 函数确实可以解决这个问题。
【参考方案1】:
很遗憾,Resin 处理不正确。我在http://bugs.caucho.com/view.php?id=5925提交了一个错误
【讨论】:
谢谢;这就是我的怀疑。我之前在 Resin 中遇到过其他“有趣”的类型转换问题。以上是关于在 JSTL/EL 中,枚举到字符串的比较究竟应该如何工作?的主要内容,如果未能解决你的问题,请参考以下文章
在 JavaScript 中访问 Java / Servlet / JSP / JSTL / EL 变量