2010-12-17 4 views
2

Getter 메서드에서 호출하는 구성 요소의 ID를 가져 오는 방법은 무엇입니까?

다음 예제를 보자 :

<h:inputText id="foo" size="#{configBean.size}" /> 

foo.length의 키로 속성 파일에서 크기를 반환 할 수 있도록 getter 메서드에서 foo라는 호출 구성 요소의 id을 얻고 싶습니다.

public int getSize() { 
    String componentId = "foo"; // Hardcoded, but I should be able to get the id somehow 
    int size = variableConfig.getSizeFor(componentId); 
    return size; 
} 

어떻게하면됩니까?

답변

3

JSF 2.0부터 구성 요소 범위에 새로운 암시 적 EL 변수가 있습니다. #{component}은 현재 UIComponent 인스턴스를 나타냅니다. getter 메소드 중에는 getId()이 필요합니다.

그래서 당신은 다만 할 수 있습니다

<h:inputText id="foo" size="#{configBean.getSize(component.id)}" /> 

또는

public int getSize(String componentId) { 
    return variableConfig.getSizeFor(componentId); 
} 

당신은 또한 당신이 단지 수 있도록 variableConfig @ApplicationScoped @ManagedBean을 만들 수 있습니다

<h:inputText id="foo" size="#{variableConfig.getSizeFor(component.id)}" /> 

(전체 메서드를 사용하여 na 대신 속성 이름의 EL 나를 당신이 방법에 인수를 전달할 때마다 필요하다, 그래서 그냥 variableConfig.sizeFor(component.id) 작동하지 않습니다, 또는 당신은

+0

와우! 정말 고맙습니다 ! – bertie

1

내가 생각하는) 클래스에 sizeFor()에 실제 getSizeFor() 방법의 이름을 변경해야합니다 BalusC가 준 응답은 가능한 가장 좋은 대답입니다. JSF 2.0이 1.x를 크게 향상시킨 이유 중 하나를 보여줍니다.

1.x를 사용하는 경우 EL 메소드를 사용하여 백킹 빈 메서드에서 선택할 수있는 이름으로 구성 요소의 ID를 요청 범위에 넣을 수 있습니다.

예.

<h:inputText id="foo" size="#{my:getWithID(configBean.size, 'foo')}" /> 

전계 발광 방식의 구현이이 같은 것을 볼 수 있었다 :이 경우

public static Object getWithID(String valueTarget, id) { 
    FacesContext context = FacesContext.getCurrentInstance(); 
    ELContext elContext = context.getELContext(); 

    context.getExternalContext().getRequestMap().put("callerID", id); 

    ValueExpression valueExpression = context.getApplication() 
     .getExpressionFactory() 
     .createValueExpression(elContext, "#{"+valueTarget+"}", Object.class); 

    return valueExpression.getValue(elContext); 
} 

을의 설정 빈의의 getSize() 메서드가 호출 될 때마다 호출 구성 요소의 ID를 사용할 것 요청 범위의 "callerID"를 통해 좀 더 깔끔하게하기 위해 호출이 끝난 후 범위에서 변수를 제거하기 위해 finally 블록을 추가해야합니다. (위의 코드는 시도하지 않았지만 잘하면 아이디어를 보여줍니다.)

다시 말하지만 JSF 1.x를 사용할 때 마지막 수단이 될 것입니다. 가장 깨끗한 솔루션은 JSF 2.0을 사용하고 BalusC가 설명하는 방법입니다.

+0

OP는 질문에'[jsf-2.0]'태그를 붙 였으므로 JSF 2.0을 사용하고 있습니다 :) – BalusC

+0

맞다! 나는 이것을 간과했다. 내 잘못이야. –