Учитывая страницу JSP, и какой-то объект связан с атрибутом запроса называется «Foo», я могу сослаться на «Foo» с:В JSTL/EL, как точно должны выполняться сравнения перечислимых строк?
${foo}
Если значение «Foo» имеет свойство компонента под названием, скажем, , «тип», а тип «типа» некоторые enum
класс, то для сравнения я хотел бы использовать строку:
<c:if test='${foo.type == "WHATEVER"}'>
Тогда в предположении, что одна из констант в моем enum
классе имеет название «WHATEVER », это сравнение должно работать и производить либо true
, либо false
.
Теперь мне интересно, как именно это сравнение должно выполняться контейнером сервлетов. В некоторых документах Oracle (here) предлагается (неопределенно), что происходит то, что строковая константа преобразуется в тип enum
, а затем производится сравнение.
Я изучаю ситуацию с кодом, который I считает, что работает по-разному между Jetty/Tomcat (то есть Apache) и Resin. Мир Apache, кажется, делает правильные вещи или, по крайней мере, то, что я ожидаю в соответствии с этой документацией от Oracle.
Я боюсь, что другое свойство моего enum
может привести к тому, что реализация Resin сделает что-то другое. В частности, мой класс enum
имеет реализацию .toString()
, которая возвращает другую строку, чем возвращаемая .name()
. Эта причуда не вызывает проблем на сервере Apache или, по крайней мере, никого, что я когда-либо видел. Если Resin реализует сравнение путем преобразования константы enum в строку (через .toString()
, а не .name()
) вместо преобразования строки в тип enum
, тогда все будет работать не последовательно.
Обратите внимание, что во всех других отношениях у меня нет проблем с использованием типов enum
(многие из них похожи на другие) в JSP/JSTL/EL. На самом деле существует только небольшое количество мест, где в JSP есть логика EL, потому что приложение выполняет большую часть своей работы с помощью рендеринга на клиентской стороне.
Редактировать — Я уверен, что подтвердил, что Resin выполняет сравнения по-другому, хотя я точно не знаю, что это такое. У меня есть (по причинам, которые я не помню) функция «имя» EL в моей собственной библиотеке функций EL, поэтому я могу использовать ее для решения этой проблемы.
Вы пробовали, чтобы удостовериться, что значение name() является тем, что является используется для сравнения строк [при условии, что это приведение toString(), которое подвешивает вас]? –
alfreema
@alfreema да, но мой собственный Jetty (7.6.15, это самый новый, который я могу получить для работы с обычным файлом '.war'), не поддерживает этого. Моя собственная функция EL, однако, работает вокруг проблемы. – Pointy