У меня была такая же проблема некоторое время назад, просто для информации я проверил источники реализации jsf mojara; вот как это работает:
Класс ajaxBehaviorRendered при обнаружении элемента f: ajax для рендеринга анализирует содержимое атрибута render через его метод getResolvedId:
private static String getResolvedId(UIComponent component, String id) {
UIComponent resolvedComponent = component.findComponent(id);
if (resolvedComponent == null) {
...
Точка - это метод findComponent: для этого нужна базовая база компонентов как начальная точка для поиска в дереве компонентов. Если идентификатор начинается с символа «:», компонентной базой является viewRoot.
UIComponent base = this;
if (expr.charAt(0) == sepChar) {
// Absolute searches start at the root of the tree
while (base.getParent() != null) {
base = base.getParent();
}
expr = expr.substring(1);
}
В противном случае базовый компонент является ближайшим родителем текущего компонента типа NamingContainer (т. Е. Вашего составного компонента, в котором вы определяете свой компонент AJAX).
//Treat remainder of the expression as relative
else if (!(base instanceof NamingContainer)) {
// Relative expressions start at the closest NamingContainer or root
while (base.getParent() != null) {
if (base instanceof NamingContainer) {
break;
}
base = base.getParent();
}
}
Затем в обоих случаях он начинает поиск компонента с заданным идентификатором с этого запуска.
Это поведение, указанное в jsf.
С моей точки зрения, если вам нужно сослаться на компонент вне композита, вы должны определить полное имя, используя префикс «:», за которым следует атрибут «cc.clientId».