2012-10-04 2 views
4

보기 매개 변수에서 제공된 값에 따라 페이지의 일부 (이 경우 바닥 글)를 포함하려는 페이지가 있습니다.ui : viewParam에 종속 포함

나는 나의 ViewScoped 백업 콩이 포함되는 바닥 글의 이름을 얻을 수있는 데이터베이스를 쿼리 preRenderView

<f:metadata> 
    <f:viewParam name="racecode" value="#{displayResults.racecode}" /> 
    <f:event type="preRenderView" listener="#{displayResults.init}" /> 
</f:metadata> 

에 초기화합니다. 그러면 다음과 같은 방식으로 사용됩니다.

<h:panelGroup id="customFooter" display="block"> 
    <ui:include src="#{displayResults.customFooter}" /> 
</h:panelGroup> 

이렇게하면 항상 누락 된 페이지가 표시됩니다. 그러나 수동으로 페이지 이름을 입력하면 작동합니다. ui:includeh:outputText으로 바꾸어도 마찬가지입니다.

나는 그것이 JSF의 단계와 관련이 있고, ui:include이 완료 될 때 값이 아직 설정되지 않았다는 것을 알고 있습니다. (단계를 읽고 더 잘 이해하는 것이 나의 TODO 목록에있는 것입니다).

질문이 남아 있습니다. 정렬 작업을 어떻게하면 완료 할 수 있습니까? bean이 viewParam을 사용하고, 데이터베이스를 쿼리하고 ui:include에 해당 값을 사용합니까?

답변

3

@wemu는 이미 원인을 설명했습니다. 은 init() 메서드가 호출되기 전에 평가됩니다. 그의 제안 된 <f:phaseListener> 솔루션은 어색합니다.

@RequestScoped 콩에 @ManagedProperty/@PostConstruct을 사용하면됩니다.

@ManagedProperty("#{param.racecode}") 
private String racecode; 

@PostConstruct 
public void init() { 
    // ... 
} 
+0

이것은 총체적으로 의미가 있습니다. 나는 종종 베스트 프랙티스와 이것에 관한 것들을 염려한다. (OCD 조금 생각한다.) 이제이 한 페이지로드에 대해 두 개의 빈을로드한다고 가정 해 봅시다. 그러면 데이터베이스에 대한 추가 호출이 생성됩니다. 물론, 나는이 일을하기 위해 필요한 정보를 가지고있다. 현재의'preRenderView'를 완전히 이것으로 바꾸고 모든 것을 한곳에 모으는 것이 낫겠습니까? 또한'@ RequestScoped'가 왜 여기에 있습니까? – blo0p3r

+2

콩을 서로'[@ManagedProperty'] (http://balusc.blogspot.com/2011/09/communication-in-jsf-20.html#InjectingManagedBeansInEachOther)로 삽입 할 수 있습니다. 1)'# {param} '은 요청 범위입니다 2)' '은 [태그 핸들러]입니다. (http://balusc.blogspot.com/2011/09/communication -in-jsf-20.html # ViewScopedFailsInTagHandlers). 그래서'@ ViewScope'은 절대적으로 옵션이 아닙니다. – BalusC

+0

이것은 내가하고 싶은 일에 효과가있었습니다. 그러나 또 다른 문제를 풀어 놓은 것 같습니다. 나는 resquest 범위와 view scope bean을 같은 페이지에 가지고있다.viewScope bean에서 메소드를 트리거 할 것으로 가정되는 페이지에서 actionListener를 트리거 할 때, 요청 범위 bean을 호출 할 뿐이며 문제의 메소드로 전달하지 않습니다. – blo0p3r

1

PreRenderView 리스너는 TagHandler가 호출 된 후 구성 요소가 렌더링되기 전에 RenderResponsePhase 내에서 호출됩니다. 즉, TagHandlers는 PreRenderView 이벤트에서 초기화 된 데이터를 볼 수 없습니다.

<ui:include value="#{myBean.myViewId}" />을 사용하여 포함을 동적으로 전환하는 경우 PreRenderView 이벤트 수신기를 사용하여 myViewId 속성을 myBean으로 설정할 수 없습니다.

이 작업을 수행하려면 <f:phaseListener>을 사용해야합니다.

+0

나는 당신이 말하는 것을 이해합니다. 그러나 내가 이해하고 [이 링크] (http://stackoverflow.com/questions/9844526/when-to-use-prerenderview-versus-postconstruct)에 따라 'preViewView'를 통해'myViewId'를 수행해야합니다. 'viewParam' ->에 의존하기 때문에 여전히 업데이트 모델 값 단계까지 "기다려야"합니다. – blo0p3r

+0

그래, 나도 그렇게 생각 하겠지만 나 자신을 믿기 위해 나는 그것을 시험해 볼 필요가있다. – wemu