我有一个典型的 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>
我有两种菜单类型,一种更改报告类型,另一种更改报告数据(基于实体 ID)。
我的包含页面有 preRenderEvent 来处理基于使用顶部 selectOneMenu 更改 entityId 的更新。
这是我的一个包含 xhtml 的代码
<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 事件的方式有问题。
- 有没有其他方法可以使报告更新工作?