Почему динамически создаваемое выражение JSF EL не разрешается? - PullRequest
1 голос
/ 14 октября 2010

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

<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);

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

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

1 Ответ

1 голос
/ 10 мая 2011

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

...