典型的な JSF テンプレートのメニュー構造とページがあります。以下は私のメインページのコードです
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<ui:composition template="/templates/internal3section.xhtml">
<ui:define name="events">
<f:event listener="#{mainBean.entryGate}" type="preRenderView" />
</ui:define>
<ui:define name="headerarea">
<p:panel style="margin:10px;">
<h:outputText value="WelCome "></h:outputText><br/>
<h:outputText value="You are using the application to view data for"></h:outputText><br/>
<p:selectOneMenu value="#{mainBean.selectedId}">
<p:ajax update=":extPane:content" />
<f:selectItems value="#{mainBean.ids}" var="id"
itemLabel="#{id.name}
itemValue="#{id.entityId}"/>
</p:selectOneMenu>
</p:panel>
</ui:define>
<ui:define name="contents">
<h:form id="extPane">
<div>
<p:menubar style="margin-bottom:5px;">
<p:menuitem value="Schedule" icon="ui-icon-star" ajax="true"
actionListener="#{mainBean.setSelectedPage('schedule')}"
update="content">
</p:menuitem>
<p:menuitem value="Assignments" icon="ui-icon-star" ajax="true"
actionListener="#{mainBean.setSelectedPage('Assignments')}"
update="content">
</p:menuitem>
<p:menuitem value="Write to Us" icon="ui-icon-star" ajax="true"
actionListener="#{mainBean.setSelectedPage('writetous')}"
update="content">
</p:menuitem>
</p:menubar>
</div>
<div>
<p:panel>
<p:outputPanel id="content" layout="block" autoupdate="true" style="border-style: none; padding: 0;">
<c:if test="#{mainBean.selectedPage!=null}">
<ui:include src="external/#{mainBean.selectedPage}.xhtml" />
</c:if>
</p:outputPanel>
</p:panel>
</div>
</h:form>
</ui:define>
2 つのメニュー タイプがあります。1 つはレポート タイプを変更するもので、もう 1 つはレポート データを変更するものです (エンティティ ID に基づく)。
私のインクルード ページには、最上位の selectOneMenu を使用して、entityId の変更に基づいて更新を処理する preRenderEvent があります。
これが私のインクルードxhtmlの1つのコードです
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:em="http://java.sun.com/jsf/composite/emcomp"
xmlns:p="http://primefaces.org/ui"
xmlns:c="http://java.sun.com/jsp/jstl/core">
<f:event listener="#{noteBean.loadRequests}" type="preRenderView" />
<h:head>
</h:head>
<h:body>
<div>
<p:panel header="Send a New Note for #{mainBean.selectedEntity.name}" id="notePanel" toggleable="TRUE" collapsed="FALSE" >
...
</p:panel>
</div>
</h:body>
私の問題は、インクルード ファイルの preRenderView イベントが発生しないことです。ページが初めて表示されたときでも、それらは起動されません。
これが ui:include が ajax リクエストを介して発生しているためかどうかはわかりません。ajaxの更新が発生したときに、ページロードのようなイベントが発生しないと思います。
エンティティの選択に基づいてページ自体を更新する必要があるため、メニュー項目に対して actionEvent を使用できません。したがって、唯一の方法は、イベント preRenderView イベントを発生させることです。
私にお知らせください
- ui:include ファイルから preRenderView イベントを発生させようとしている方法に問題がある場合。
- レポートの更新を機能させる他の方法はありますか?