我的一个页面/ bean在第一页加载时发出两次preRenderView
事件,然后每次回发发送2 + n
次,其中n
是回发数(包括当前回发数)一)已经发生。
在此处阅读了其他一些帖子之后,我将<f:event type="preRenderView" listener="myBean.preRenderView"/>
移到了<f:metadata/>
之外,这使preRenderView
次来电的数量减少了一个。也就是说,在整页加载时调用一次,每次回发调用1 + n
次。我甚至尝试将<f:event/>
标记移到<f:view/>
之外,但它没有效果。
我不确定这是否相关:页面使用模板:
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:fb="http://www.facebook.com/2008/fbml">
<f:view contentType="text/html">
<ui:insert name="metadata"/>
<h:head>
<!-- Some stuff here -->
<ui:insert name="content"/>
<!-- More stuff here -->
</h:head>
<h:body>
</h:body>
</f:view>
</html>
页面的相关位:
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets">
<h:head>
<title></title>
</h:head>
<h:body>
<ui:composition template="/WEB-INF/templates/myLayout.xhtml">
<ui:define name="windowTitle">My Page</ui:define>
<ui:define name="metadata">
<f:event type="preRenderView" listener="#{myBean.preRenderView}"/>
</ui:define>
<ui:define name="content">
<!-- Some content here -->
<h:panelGroup id="reRenderable" layout="block">
<!-- More content here -->
<h:form prependId="false">
<h:outputLabel for="mySelector" value="Item:"/>
<h:selectOneMenu id="mySelector"
value="#{myBean.item}"
converter="#{myConverter}"
validator="#{itemActiveValidator.validate}">
<f:selectItems value="#{myBean.myItems}"/>
<f:ajax render=":reRenderable"/>
</h:selectOneMenu>
</h:form>
<!-- More content here -->
</h:panelGroup>
<!-- More content here -->
</ui:define>
</ui:composition>
</h:body>
</html>
答案 0 :(得分:5)
它看起来像是另一个Mojarra bug:JAVASERVERFACES-2162
我按如下方式应用了解决方法,但它确实有效:
<ui:define name="metadata">
<f:metadata>
<f:viewParam name="dummy"/>
<f:event type="preRenderView" listener="#{myRecordsBean.preRenderView}"/>
</f:metadata>
</ui:define>
剩下要做的就是将dummy
推到模板上,以保持使用它的页面免受此污染。
答案 1 :(得分:-1)
试
@ManagedBean
@XScoped --sessionScope,viewScope
Public class MyRecordsBean{
public void preRenderView(){
if (!FacesContext.getCurrentInstance().isPostback(){
//put initView codes here
}
}
答案 2 :(得分:-1)
试试这个。我不知道你的代码和我的代码之间的技术差异。我改变了<ui:insert name="content"/>
从头部标签到身体标签之间的位置。并添加f:metadata
。
但是,当我这样使用时,这不会调用两次。 工作正常。它可以是关于页面结构。也许关于两次使用html标签。您必须有一个。但完整的页面缺少部分,只缺少具有组合块的部分。
<!DOCTYPE html>
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:fb="http://www.facebook.com/2008/fbml">
<f:view contentType="text/html">
<f:metadata>
<ui:insert name="metadata"/>
</f:metadata>
<h:body>
<!-- Some stuff here -->
<ui:insert name="content"/>
<!-- More stuff here -->
</h:body>
</f:view>
</html>
<?xml version="1.0" encoding="UTF-8"?>
<ui:composition xmlns="http://www.w3.org/1999/xhtml"
xmlns="http://www.w3.org/1999/xhtml"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:ui="http://java.sun.com/jsf/facelets"
template="/WEB-INF/templates/myLayout.xhtml">
<ui:define name="windowTitle">My Page</ui:define>
<ui:define name="metadata">
<f:event type="preRenderView" listener="#{myBean.preRenderView}"/>
</ui:define>
<ui:define name="content">
<!-- Some content here -->
<h:panelGroup id="reRenderable" layout="block">
<!-- More content here -->
<h:form prependId="false">
<h:outputLabel for="mySelector" value="Item:"/>
<h:selectOneMenu id="mySelector"
value="#{myBean.item}"
converter="#{myConverter}"
validator="#{itemActiveValidator.validate}">
<f:selectItems value="#{myBean.myItems}"/>
<f:ajax render=":reRenderable"/>
</h:selectOneMenu>
</h:form>
<!-- More content here -->
</h:panelGroup>
<!-- More content here -->
</ui:define>
</ui:composition>