Я реализую простой метод, который перебирает дерево компонентов JSF и отключает компоненты. (Таким образом, пользователь не может изменить значения). Но этот метод не работает для составных компонентов. Как я могу обнаружить составной компонент по крайней мере? Затем я могу попытаться отключить специальный атрибут.Как найти составной компонент в дереве компонентов JSF?
ответ
Класс UIComponent
имеет вспомогательный метод isCompositeComponent()
для этой цели.
Таким образом, это должно просто сделать:
for (UIComponent child : component.getChildren()) {
if (UIComponent.isCompositeComponent(child)) {
// It's a composite child!
}
}
Для заинтересованного в "под одеялом" выработки, вот источник реализации кода из Mojarra 2.1.25:
public static boolean isCompositeComponent(UIComponent component) {
if (component == null) {
throw new NullPointerException();
}
boolean result = false;
if (null != component.isCompositeComponent) {
result = component.isCompositeComponent.booleanValue();
} else {
result = component.isCompositeComponent =
(component.getAttributes().containsKey(
Resource.COMPONENT_RESOURCE_KEY));
}
return result;
}
Таким образом, это определяется наличием атрибута компонента с именем, определяемым Resource.COMPONENT_RESOURCE_KEY
, который имеет значение "javax.faces.application.Resource.ComponentResource"
.
Благодарим за помощь! Но теперь я думаю о проблемах безопасности. Я отредактировал мой вопрос. – Tony
Ссылка на мой вопрос безопасности [Проблемы безопасности JSF. Отключенный атрибут на стороне сервера] (http://stackoverflow.com/questions/18274010/security-issues-jsf-disabled-attribute-on-server-side) – Tony
Вы не можете определить, является ли что-то составным, поскольку единственное ограничение на составной компонент бэк-компонента составного компонента реализует «NamingContainer», но есть много других вещей, реализующих этот интерфейс. – rdcrng
Пожалуйста, задайте один вопрос на вопрос. Не хамелеонизируйте существующие вопросы. Он делает ответы неполными или даже недействительными. – BalusC
@BalusC Извините, но это был мой первый вопрос, и идея о безопасности появилась позже, когда я подумал об этом. Не могли бы вы восстановить свой ответ? Ваш ответ был очень полезен. – Tony