2014-12-16 10 views
1

다음과 같은 문제가 자주 발생합니다. , 주어진 시간에 myBean.foo을 평가하는 문제가 없습니다, 변수로, 충분히 생명을 가지고JSF에서 EL 가변 해상도 : 발생 시점을 제어 할 수있는 방법이 있습니까?

<h:outputText value="#{myBean.foo}"> 

만큼 myBean 같은 : 나는이 같은 EL 표현식 쓰기 JSF 응용 프로그램과 facelet이 그러나 myBean이 짧은 기간 내에 일부 bean을 참조하는 변수 인 경우 myBean.foo이 평가되면 너무 늦을 수 있으므로 myBeannull으로 해결된다는 JSF의 불만이 있습니다. 이것은 잘 알려진 것이지만 문제는 다른 상황에서 무엇을 기대해야하는지 분명하지 않다는 것입니다.

구체적인 예 n. 1 :

<p:orderList value="#{bean.myValue}" var="item"> 
    <p:column> 
    <p:commandLink action="#{bean.doSomething(item)}" /> 
    </p:column> 
</p:orderList>` 

doSomething가 호출 될 때 (가 참조하는 객체가 아직 살아 있지만)의 item 변수가 더 이상 정의되어 있기 때문에, 일을 않을 따라서되지 않은 : 당신은 PrimeFaces OrderList와 함께 다음 시도하는 경우 그것은 null으로 해결되었습니다. known issue입니다. 그러나 동일한 패턴은 <p:dataTable>과 같이 잘 작동합니다. 어쨌든, 나는이 특정한 문제에 지금 관심이 없으며 단지 의심을 설명하려고합니다.

구체적인 예 n. 2 : 나는 backing bean을 가진 복합 컴포넌트를 작성했다. 백킹 빈은 UINamingContainer을 확장하고 StateHelper을 사용하여 모델 객체를 보유합니다. 이 복합 아동 태그를 쓸 수 있습니다 나는 이런 식으로 뭔가를 쓰고 싶습니다으로

<myns:myCc var="myVar"> 
    <h:inputText value="#{myVar.foo}" /> 
</myns> 

"myVar에"나는 모델 객체에 이름을주고 싶다. 이 작업을 수행하기 위해 모델 객체를 encodeChildren 메소드의 시작 부분에있는 요청 맵에 저장하고 나중에 제거하려고 시도했습니다.이 작업은 렌더링을 위해 작동하지만 commandButton 액션으로 입력을 처리하면 다음과 같은 이유로 작동하지 않습니다. 동작이 실행되면 myVar을 확인할 수 없다는 메시지가 표시됩니다. 즉, 너무 늦게 전체 표현식을 해결하려고 시도합니다. 그런 다음 모델 객체를 뷰 범위 맵에 "영구적으로"저장하려고했지만 그 중 하나는 작동하지 않습니다. 나는이로 변경하는 경우에는 : 는

작동 (modelObject 가정 나의 모델 객체를 저장하는 백업 빈의 속성 필드입니다). 그래서, 내 모델에 문제가되지 않지만, 그 방법으로 모델 태그를 EL 표현식에서 사용할 수있게하려고합니다.

구체적인 예 n. 3 : 자주 <ui:param> 태그를 사용하여 콩에 더 짧은 이름을 지정하고 템플릿을 쉽게 만들 수 있습니다. 예를 들어 :

<ui:param name="bean" value="#{longNamedAndPageSpecificBean}" /> 

그래서, 페이지의 나머지 부분에서 난 그냥 #{bean.foo} 대신 #{longNamedAndPageSpecificBean.foo} 사용할 수 있습니다. 이 명령 단추에 전달 된 작업을 잘 작동합니다. 그러나 #{bean.myActionMethod}과 같은 메서드 표현식을 method-signature으로 선언 된 복합 컴포넌트 속성에 전달하면이 메서드 표현식이 실제로 호출 될 때 bean이 해결됩니다. null ... 하나의 경우에 작동하는 이유는 commandButton 액션) 및 다른 구성 요소 (복합 구성 요소에서 사용하는 동작 포함)는 나를 혼란스럽게합니다.

누군가가이 JSF 측면을 더 잘 이해하고 앞에서 언급 한 구체적인 예를 사용하여 더 나은 접근 방법/해결 방법을 제안 할 수 있다면 감사하게 생각합니다.

답변

0

귀하의 질문은 너무 커 보이지만, 빌드 시간에만 세션 및 요청 범위 값만 사용 가능하다고 말할 수 있습니다.

실행 단계에서도 마찬가지입니다.

렌더링 단계에서만 시간적 변수 "myVar"의 사용 가능성을 보장해야합니다.

는 정말이 생긴 그 구성 요소의 구현 내 (사례 2) 인 경우에 대한 구성 요소 구현

+0

그리고 무엇에 의존하기 때문에 디버깅하는 것입니다 무엇을 이해하는 가장 좋은 방법? 어쨌든 많은 경우 JSF 생산성을 마이닝하는 것이 바로 이러한 불확실성 (상황을 이해하기 위해 디버깅 할 필요성)입니다. 상황은 "선형"방식으로 작동하지 않습니다. 왜냐하면 "의존적"이기 때문입니다. 물론, 다른 행동을 설명하는 어림짐작이 없으면 이것이 질문의 핵심입니다. –