Jsp 在JSTL/EL中,枚举到字符串的比较到底应该如何工作?
给定一个JSP页面,以及一些绑定到一个名为“foo”的请求属性的对象,我可以通过以下方式引用“foo”: 如果“foo”的值有一个名为“type”的bean属性,并且“type”的类型是某个Jsp 在JSTL/EL中,枚举到字符串的比较到底应该如何工作?,jsp,jakarta-ee,enums,jstl,resin,Jsp,Jakarta Ee,Enums,Jstl,Resin,给定一个JSP页面,以及一些绑定到一个名为“foo”的请求属性的对象,我可以通过以下方式引用“foo”: 如果“foo”的值有一个名为“type”的bean属性,并且“type”的类型是某个enum类,那么为了进行比较,我将使用一个字符串: <c:if test='${foo.type == "WHATEVER"}'> 然后假设我的enum类中的一个常量的名称为“WHATEVER”,那么比较应该有效,并生成true或false 现在我想知道的是,servlet容器究竟应该如何执
enum
类,那么为了进行比较,我将使用一个字符串:
<c:if test='${foo.type == "WHATEVER"}'>
然后假设我的enum
类中的一个常量的名称为“WHATEVER”,那么比较应该有效,并生成true
或false
现在我想知道的是,servlet容器究竟应该如何执行这种比较。一些Oracle文档()暗示(模糊地)所发生的事情是将字符串常量转换为enum
类型,然后进行比较
我正在调查一种情况,其中涉及我认为在Jetty/Tomcat(即Apache)和Resin之间工作方式不同的代码。Apache世界似乎正在做正确的事情,或者至少是我从Oracle的文档中所期望的事情
我担心的是我的enum
的另一个属性可能会导致树脂实现做一些不同的事情。具体来说,我的enum
类有一个.toString()
实现,该实现返回的字符串与.name()
返回的字符串不同。这种怪癖不会在Apache服务器上造成任何问题,至少我从未见过这样的问题。如果Resin通过将enum常量转换为字符串(通过.toString()
,而不是.name()
)而不是将字符串转换为enum
类型来实现比较,那么事情将无法始终如一地工作
请注意,在所有其他方面,在JSP/JSTL/EL中以各种其他方式使用我的enum
类型(很多类型都是这样)都没有问题。事实上,JSP中只有少数地方有EL逻辑,因为应用程序通过客户端模板呈现完成大部分工作
编辑-我很确定我确认了树脂做比较的方式不同,尽管我不知道到底是什么。我自己的EL函数库中有一个“name”EL函数(原因我不记得了),所以我可以用它来解决这个问题。不幸的是,Resin处理不正确。我在上提交了一个bug,您是否尝试确保name()值是用于字符串比较的值[假设是toString()怪癖让您挂断了]?@alfreema是的,但我自己的Jetty(7.6.15;这是我可以使用常规
.war
文件的最新版本)不支持这一点。不过,我自己的EL函数确实解决了这个问题;这就是我所怀疑的。我以前在树脂中遇到过EL的其他“有趣”类型转换问题。
<c:if test='${foo.type == "WHATEVER"}'>