我实现了一个简单的方法,它迭代JSF组件树并将组件设置为禁用。 (因此用户无法更改值)。但是这种方法对复合组件不起作用。我怎样才能至少检测到复合材料成分?然后我可以尝试将特殊属性设置为禁用。
答案 0 :(得分:2)
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"
。