5

p1パラメータを別のページに渡していますpage.xhtml:

<ui:include src="page.xhtml">
    <ui:param name="p1" value="#{someObject}"/>
</ui:include>

#{p1}のバッキング Bean の @PostConstruct メソッド内で評価することは可能page.xhtmlですか? 次のコードを使用して#{p1}も解決できません:

FacesContext currentInstance = FacesContext.getCurrentInstance();
currentInstance.getApplication().evaluateExpressionGet(currentInstance, "#{p1}", String.class);

なぜこれが必要なのですか?

カスタム UI コンポーネントとして xhtml ファイル (component.xhtml など) を使用しています。このファイルには、コンポーネント データを取得するバッキング Bean があります。この xhtml ファイルをメインの JSF ページに 2 回以上インクルードしているので、コンポーネントがインクルードされるたびにカスタム データで動作するように、それぞれの component.xhtml に異なるオブジェクトを渡したいと考えています。

4

3 に答える 3

10

Mojarra では、 の属性として取得できますFaceletContext@PostConstructインクルードされたページで初めて参照/構築されることが保証されているマネージド Bean で取得できます (したがって、コンポーネント ツリーで が宣言されるの親ページではありません)。<ui:param>

FaceletContext faceletContext = (FaceletContext) FacesContext.getCurrentInstance().getAttributes().get(FaceletContext.FACELET_CONTEXT_KEY);
Object p1 = faceletContext.getAttribute("p1");

MyFaces では、FaceletContextマネージド Bean で全体を使用することはできません。これは、ビューのビルド時間の終わりまでに破棄され、この構成が機能しなくなるためです。JSF の実装に依存しないようにするには、<c:set scope="request">代わりに via を設定することを検討してください。その後、リクエスト属性として使用できます。

具体的な機能要件については、バッキング コンポーネントを使用して複合コンポーネントを作成することを検討してください。いくつかの例については、複合コンポーネントの wiki ページと、複合コンポーネントでの複数の入力コンポーネントの使用に関するこのブログを参照してください。<ui:include>、タグ ファイル、複合コンポーネント、および/またはカスタム コンポーネントを使用する場合も参照してください。

于 2013-01-22T16:33:49.967 に答える