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