我正在使用PrimeFaces 3.5,我遇到了部分页面渲染的问题。我需要将Facelet文件中的内容加载到模板的“动态”部分。
index.xhtml
:
<f:view>
<h:form id="form1">
<p:outputPanel layout="block">
<p:commandButton action="content-2?faces-redirect=false" update="display" />
</p:outputPanel>
<p:outputPanel id="display" layout="block">
content 1
</p:outputPanel>
</h:form>
</f:view>
content-2.xhtml
:
<h:body>
content 2 loaded
</h:body>
当我点击<p:commandButton>
时,将会打开content-2.xhtml
。但是,这会刷新整个页面。 XML响应包含如下:
<partial-response><changes><update id="javax.faces.ViewRoot">
当我将action
属性更改为方法表达式时:
<f:view>
<h:form id="form1">
<p:outputPanel layout="block">
<p:commandButton action="#{myBean.increment}" update="display" />
</p:outputPanel>
<p:outputPanel id="display" layout="block">
#{myBean.count}
</p:outputPanel>
</h:form>
</f:view>
然后display
块按预期更新。 XML响应包含如下:
<partial-response><changes><update id="form:display">
为什么action="content-2?faces-redirect=false"
方式会更新整个页面?
我也试过<ui:composition>
,但在这种情况下,这会重新加载模板的“静态”部分。我不想要它。
答案 0 :(得分:0)
如果您通过在null
属性中提供非action
结果导航到其他视图,则这是完全正常和预期的行为。然后,JSF将使用@all
的渲染来否决部分渲染。 JSF / Facelets不会以某种方式自动保留树中的常见组件,如您所期望的那样。如果您打算在部分页面呈现期间动态更改组件树,那么您需要在<p:outputPanel id="display" layout="block">
内部动态包含类似这样的内容(section
只是一个整数)
<ui:include src="section#{bean.section}.xhtml" />
或多个有条件渲染的部分
<ui:fragment rendered="#{bean.section == 1}"><ui:include src="section1.xhtml" /></ui:fragment>
<ui:fragment rendered="#{bean.section == 2}"><ui:include src="section2.xhtml" /></ui:fragment>
<ui:fragment rendered="#{bean.section == 3}"><ui:include src="section3.xhtml" /></ui:fragment>
<ui:fragment rendered="#{bean.section == 4}"><ui:include src="section4.xhtml" /></ui:fragment>
每个都有自己的优点和缺点,具体取决于包含文件是否包含表单/输入/命令组件和/或引用视图范围bean。 <ui:include>
在视图构建期间运行,就像JSTL一样。有关详细信息,请参阅JSTL in JSF2 Facelets... makes sense?
faces-redirect=false
的存在并不重要,因为它已经是默认值。如果是true
,则会在目标网址上调用JavaScript window.location
。