2013-08-16 2 views
1

JSF 컴포넌트 트리를 반복하고 컴포넌트를 사용 불가능으로 설정하는 간단한 메소드를 구현합니다. (따라서 사용자는 값을 변경할 수 없습니다). 그러나이 방법은 복합 구성 요소에서는 작동하지 않습니다. 적어도 복합 컴포넌트를 어떻게 찾을 수 있습니까? 그런 다음 특수 특성을 사용 안 함으로 설정하려고 할 수 있습니다.JSF 컴포넌트 트리에서 복합 컴포넌트를 찾는 방법은 무엇입니까?

+0

복합 컴포넌트 백킹 빈 유형의 유일한 제한은'NamingContainer'를 구현하는 것이기 때문에 어떤 것이 복합 클래스인지 여부를 감지 할 수 없지만 그 인터페이스를 구현하는 많은 것들이 있습니다. – rdcrng

+0

질문 당 하나의 질문을하십시오. 기존 질문을 카멜레온 화하지 마십시오. 답변이 불완전하거나 심지어 무효가됩니다. – BalusC

+0

@BalusC 미안하지만, 이것이 내 첫 번째 질문이었고 보안에 대한 생각은 나중에 이것에 대해 생각할 때 나온다. 답을 다시 만들 수 있습니까? 당신의 대답은 매우 유용했습니다. – Tony

답변

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; 

} 

은 따라서 "javax.faces.application.Resource.ComponentResource" 값을 갖는 Resource.COMPONENT_RESOURCE_KEY으로 정의 된 이름의 구성 요소 속성이 있는지 여부로 식별됩니다.

+0

도움을 주셔서 감사합니다. 하지만 지금은 보안 문제를 생각하고 있습니다. 내 질문을 편집했습니다. – Tony

+0

내 보안 질문 [보안 문제 JSF에 대한 링크. 서버 측에서 비활성화 된 속성] (http://stackoverflow.com/questions/18274010/security-issues-jsf-disabled-attribute-on-server-side) – Tony

관련 문제