2015-07-03 11 views
1

Учитывая страницу 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, поэтому я могу использовать ее для решения этой проблемы.

+0

Вы пробовали , чтобы удостовериться, что значение name() является тем, что является используется для сравнения строк [при условии, что это приведение toString(), которое подвешивает вас]? – alfreema

+0

@alfreema да, но мой собственный Jetty (7.6.15, это самый новый, который я могу получить для работы с обычным файлом '.war'), не поддерживает этого. Моя собственная функция EL, однако, работает вокруг проблемы. – Pointy

ответ

1

К сожалению, смола обрабатывается неверно. Я подал ошибку в http://bugs.caucho.com/view.php?id=5925

+0

Thanks; вот что я подозревал. Раньше у меня были другие «интересные» проблемы с преобразованием типов с EL в Resin. – Pointy