4

ビュー パラメータから指定された値に応じて、ページの一部 (この例ではフッター) を含めたいページがあります。

preRenderViewViewScopedでバッキング Bean を初期化しています

<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:includeですh:outputText

これは JSF のフェーズと関係があることと、その時点でui:includeはまだ値が設定されていないことを理解しています。(フェーズを読んで理解を深めることは、私の TODO リストに含まれています)。

疑問は残ります。どうすればそのようなことを成し遂げることができますか。Bean に viewParam を使用させ、データベースにクエリを実行し、その値をui:include?

4

2 に答える 2

3

@wemuはすでに原因を説明しています。メソッドが呼び出される前<ui:include src>に評価されます。init()しかし、彼が提案した<f:phaseListener>解決策はぎこちないものです。

Beanで@ManagedProperty/@PostConstructを使用するだけです。@RequestScoped

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

@PostConstruct
public void init() {
    // ...
}
于 2012-10-04T14:26:15.320 に答える
1

PreRenderView リスナーは、RenderResponsePhase 内で、コンポーネントがレンダリングされる前に呼び出されますが、TagHandler が呼び出された後です。これは、TagHandlers が PreRenderView イベント内で初期化されたデータを認識しないことを意味します。

を使用してインクルードを動的に切り替える場合、PreRenderView イベント リスナーを使用して のプロパティ<ui:include value="#{myBean.myViewId}" />を設定することはできません。myViewIdmyBean

それを行う必要がある場合は、<f:phaseListener>.

于 2012-10-04T14:09:27.493 に答える