Динамический ‹ui:include src› в зависимости от ‹ui:repeat var› ничего не включает

Я новичок в JSF, и я борюсь с динамическим рендерингом включенных страниц. Мой код выглядит так:

МенюБоб

@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 кнопки. Всякий раз, когда я нажимаю любую кнопку, появляется метка внутри условно отображаемой панелиGroup, но включенная страница не отображается. Если я изменю 'menuItem1' var с первого пользовательского интерфейса: повтор, это сработает, но это действительно непредсказуемо. Например, если я жестко задал для параметра SelectedItemLabel значение «page_1», тогда, когда я нажму кнопку_1, отобразится страница_1, но даже если я нажму кнопку_2, страница_2 (!?) отобразится...


person svobol13    schedule 16.02.2013    source источник


Ответы (1)


Вы столкнулись с проблемой времени сборки представления и времени рендеринга представления. По сути, это та же проблема, на которую уже подробно дан ответ в JSTL в JSF2 Facelets... имеет смысл? В этом ответе замените JSTL на ui:include. К слову, <ui:repeat> запускается во время рендеринга представления, в то время как <ui:include> уже выполнялось во время сборки представления ранее.

Вы поймете, что единственным решением является замена <ui:repeat> другим тегом, который запускается во время сборки представления, например JSTL <c:forEach>.

Обратите внимание, что я не гарантирую, что это решит конкретное функциональное требование, которое вы имеете в виду. Использование JSTL может иметь нежелательные побочные эффекты (которые, тем не менее, объяснимы, понятны и обходимы).

Смотрите также:

person BalusC    schedule 17.02.2013