3

私は JSF を初めて使用し、含まれているページを動的にレンダリングすることに苦労しています。私のコードは次のようになります。

MenuBean

@ViewScoped
public class MenuBean implements Serializable {

    private MenuItem[] menuItems = new MenuItem[] {
        new MenuItem("page_1", "/page_1.xhtml"),
        new MenuItem("page_2", "/page_2.xhtml"),
    };

    private String selectedItemLabel;

    //...
}

メニュー項目

public class MenuItem implements Serializable {

    private String label;
    private String page;

    //...
}

index.xhtml

    <ui:repeat var="menuItem" value="#{menuBean.menuItems}">                                    
        <h:panelGroup rendered="#{menuBean.selectedItemLabel eq menuItem.label}" layout="block">
            <h:outputText value="#{menuBean.selectedItemLabel}" />                              
            <ui:include src="#{menuItem.page}" />                                           
        </h:panelGroup>                                                                     
    </ui:repeat>                                                                            

その結果、2 つのボタンがレンダリングされます。ボタンをクリックすると、条件付きでレンダリングされた panelGroup 内のラベルが表示されますが、含まれているページは表示されません。「menuItem1」変数を最初の ui:repeat から変更すると機能しますが、実際には予測できません。たとえば、setSelectedItemLabel パラメータを「page_1」にハードコードすると、button_1 をクリックすると page_1 が表示されますが、button_2 をクリックしても page_2 (!?) が表示されます...

4

1 に答える 1

5

ビューのビルド時間とビューのレンダリング時間の問題に直面しています。これは本質的に、JSF2 Facelets の JSTL ですでに詳細に回答されている問題と同じです...意味がありますか? その回答で、「JSTL」を「ui:include」に置き換えます。要点として、<ui:repeat>はビューのレンダリング時に実行されますが、<ui:include>はビューのビルド時に既に実行されています。

<ui:repeat>唯一の解決策は、ビューのビルド時に実行される JSTL などの別のタグに置き換えることであることがわかります<c:forEach>

あなたが念頭に置いている具体的な機能要件を解決することを保証するものではないことに注意してください。JSTL を使用すると、望ましくない「副作用」が発生する可能性があります (ただし、説明可能で、理解可能で、回避策があります)。

以下も参照してください。

于 2013-02-17T03:13:04.693 に答える