Почему динамическое выражение значения JSF EL не разрешается?

Я получил простую настройку (и большую проблему): страница JSP с пустым контейнером элемента сетки панели и привязкой к bean-компоненту.

<h:panelGrid binding="#{ bean.container }" id="container" />

При вызове геттера бина контейнер заполняется случайным количеством столбцов со ссылкой на команду внутри. Все идет нормально. Контейнер заполнен нужным количеством элементов, и с помощью ActionListener для ссылок я получаю все события кликов.

А вот и сложная часть: я хочу пометить столбец «выбранный» или «нажатый» с помощью другого класса стиля. При статической настройке я бы сделал это с помощью такого выражения:

<h:column styleClass="#{ bean.selectedColumn eq 'id' ? 'btnSelected' : 'btn' }">
    <!-- command link and some blahblah -->
</h:column>

Компонент содержит простой геттер getSelectedColumn(), который возвращает идентификатор. Прямо вперед, так что это работает идеально!

Но когда я пытаюсь сделать то же самое внутри компонента,

ELContext elContext = FacesContext.getCurrentInstance().getELContext();
String expression = "#{ bean.selectedColumn eq 'id' ? 'btnSelected' : 'btn' }";
new ExpressionFactoryImpl().createValueExpression(elContext, expression, String.class);
column.setValueExpression("styleClass", valueExpression);

выражение никогда не будет разрешено. Чтобы было понятно: обе ссылки на команды, столбцы и выражения значений генерируются внутри bean-компонента. Это причина?

Кто-нибудь может сказать мне, почему? Заранее спасибо!


person Christian Smolka    schedule 14.10.2010    source источник


Ответы (1)


Когда JSP скомпилирован, bean-компонент не будет вызываться! Это делается во время выполнения, потому что вы хотите видеть живые данные в bean-компоненте. Поэтому сгенерированный (позже) EL не виден при компиляции. EL не будет разрешен во время выполнения.

person leonardo12    schedule 09.05.2011
comment
Хорошо, это имеет смысл. Я попробую что-нибудь еще. Спасибо. - person Christian Smolka; 21.06.2011