在JSTL/EL中,枚举到字符串的比较究竟应该如何工作



给定一个JSP页面,以及一些绑定到名为"foo"的请求属性的对象,我可以用引用"foo

${foo}

如果"foo"的值有一个名为"type"的bean属性,并且"type"是某个enum类,那么为了进行比较,我会使用一个字符串:

<c:if test='${foo.type == "WHATEVER"}'>

然后,假设enum类中的一个常量的名称为"WHATEVER",则该比较应该有效,并产生truefalse

现在我想知道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

最新更新