До сих пор у меня была та же проблема, о которой вы упоминали, и ваше сообщение дало мне ключ к ее решению.Я намеревался сделать именно то, что вы пытаетесь сделать, поэтому я надеюсь, что мое решение может помочь вам.
Моя страница указателя, которая содержит меню и контейнер, в котором обновляется содержимое:
<ui:composition template="./../resources/templates/template.xhtml">
<ui:define name="content">
<h:form>
<h:panelGroup layout="block" styleClass="menu">
<ui:include src="./../resources/templates/menu.xhtml"/>
</h:panelGroup>
<h:panelGroup layout="block" id="content">
<h:panelGroup layout="block" styleClass="content" rendered="#{menuBacking.albums}">
<ui:include src="albums.xhtml"/>
</h:panelGroup>
<h:panelGroup layout="block" styleClass="content" rendered="#{menuBacking.band}">
<ui:include src="band.xhtml"/>
</h:panelGroup>
<h:panelGroup layout="block" styleClass="content" rendered="#{menuBacking.concerts}">
<ui:include src="concerts.xhtml"/>
</h:panelGroup>
<h:panelGroup layout="block" styleClass="content" rendered="#{menuBacking.contacts}">
<ui:include src="contacts.xhtml"/>
</h:panelGroup>
</h:panelGroup>
</h:form>
</ui:define>
</ui:composition>
Меню, входящее в первую группу панелей:
<p:menu>
<p:menuitem value="Albums" action="#{menuBacking.active}" update="content">
<f:setPropertyActionListener value="albums" target="#{menuBacking.selection}"/>
</p:menuitem>
<p:menuitem value="Band" action="#{menuBacking.active}" update="content">
<f:setPropertyActionListener value="band" target="#{menuBacking.selection}"/>
</p:menuitem>
<p:menuitem value="Concerts" action="#{menuBacking.active}" update="content">
<f:setPropertyActionListener value="concerts" target="#{menuBacking.selection}"/>
</p:menuitem>
<p:menuitem value="Contacts" action="#{menuBacking.active}" update="content">
<f:setPropertyActionListener value="contacts" target="#{menuBacking.selection}"/>
</p:menuitem>
</p:menu>
Это одна из страниц, которые я хочу отобразить в области содержимого (только для целей тестирования):
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets">
<body>
Contacts
</body>
И, наконец, компонент:
@ManagedBean
@SessionScoped
public class MenuBacking implements Serializable {
private String selection;
private boolean albums;
private boolean band;
private boolean concerts;
private boolean contacts;
public MenuBacking() {
albums = false;
band = true; // You can define the default page that will be show
concerts = false;
contacts = false;
}
// getters & setters
public void active() throws IllegalArgumentException, IllegalAccessException, NoSuchFieldException {
setAlbums(selection.equals("albums"));
setBand(selection.equals("band"));
setConcerts(selection.equals("concerts"));
setContacts(selection.equals("contacts"));
}
}
Обратите внимание на разницу междуaction и actionListener.Действие сначала назначает значение свойству, а затем выполняет метод, в то время как actionListener выполняет метод, а затем назначает значение.