JSTL работает во время сборки представления.Он выполняется в тот момент, когда JSF анализирует шаблон представления в полноценное и воспроизводимое дерево компонентов JSF.JSF работает во время просмотра.Он выполняется в тот момент, когда JSF кодирует дерево компонентов в связку HTML.Вы можете визуализировать это следующим образом: JSTL сначала работает сверху вниз и выдает результат только с тегами JSF.Затем, во время фазы ответа рендеринга JSF, JSF будет работать сверху вниз и производить HTML-результат.
Другими словами, JSTL и JSF не работают синхронно, как вы ожидаете от кодирования.Обычно вы хотели бы использовать Facelets '<ui:param>
вместо JSTL <c:set>
.
<ui:param name="targetClientId" value="#{component.clientId}" />
Обратите внимание, что это на самом деле ничего не устанавливает в любой области видимости.Это просто создает своего рода «псевдоним» для данного выражения.Я не уверен, работает ли он в вашем конкретном случае так, как вы намереваетесь, но, насколько я понимаю, функциональное требование, вы хотели бы иметь возможность получить идентификатор клиента <rich:dataTable>
далее, после компонента.В этом случае лучше использовать binding
:
<rich:dataTable binding="#{table}" ...>
...
</rich:dataTable>
<script>
var $table = jQuery("[id='#{table.clientId}']");
// ...
</script>