嵌套JSF复合组件中Facet内容无法渲染的问题求助
JSF嵌套复合组件Facet渲染问题解决
问题描述
在嵌套JSF复合组件中传递Facet内容时,已确认Facet不为空,但其中的内容无法在最终页面显示。相关代码如下:
1. draft_scenario_details.xhtml
<ui:composition template="/virets/templates/base_template.xhtml" xmlns="http://www.w3.org/1999/xhtml" xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:f="http://xmlns.jcp.org/jsf/core" xmlns:p="http://primefaces.org/ui" xmlns:virets="http://java.sun.com/jsf/composite/composite"> <ui:define name="content"> <virets:scenarioDetails> <f:facet name="additionalButtons"> <p:outputLabel value="MY DRAFT"/> </f:facet> </virets:scenarioDetails> </ui:define> </ui:composition>
2. scenarioDetails.xhtml
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:cc="http://java.sun.com/jsf/composite" xmlns:f="http://java.sun.com/jsf/core" xmlns:p="http://primefaces.org/ui" xmlns:virets="http://java.sun.com/jsf/composite/composite"> <cc:interface> <cc:facet name="additionalButtons"/> </cc:interface> <cc:implementation> <virets:scenarioDetailsData> <f:facet name="additionalButtonsFacet"> <cc:renderFacet name="additionalButtons"/> </f:facet> </virets:scenarioDetailsData> </cc:implementation> </ui:composition>
3. scenarioDetailsData.xhtml
<ui:composition xmlns:ui="http://java.sun.com/jsf/facelets" xmlns:cc="http://java.sun.com/jsf/composite" xmlns:p="http://primefaces.org/ui"> <cc:interface> <cc:facet name="additionalButtonsFacet"/> </cc:interface> <cc:implementation> <cc:renderFacet name="additionalButtonsFacet"/> </cc:implementation> </ui:composition>
问题现象
通过virets:scenarioDetails的additionalButtons Facet传递的标签“MY DRAFT”,未在scenarioDetailsData中渲染显示。
已尝试方案
- 确认各组件间Facet名称一致
- 在中间组件中直接渲染Facet验证其存在性
解决方法
问题根源在于中间组件scenarioDetails.xhtml中传递Facet的方式错误:<cc:renderFacet>会直接输出Facet内容,而非将其作为子组件的Facet传递。需替换为<cc:insertFacet>,让子组件正确接收Facet内容。
修改后的scenarioDetails.xhtml实现部分:
<cc:implementation> <virets:scenarioDetailsData> <f:facet name="additionalButtonsFacet"> <cc:insertFacet name="additionalButtons"/> </f:facet> </virets:scenarioDetailsData> </cc:implementation>
原理说明
<cc:renderFacet>:用于直接输出当前复合组件中指定Facet的内容,适用于在当前组件内渲染Facet。<cc:insertFacet>:用于将当前复合组件中指定Facet的内容插入到目标位置(如子组件的Facet中),保留组件结构,允许子组件后续渲染。
修改后,additionalButtons的内容会正确传递到scenarioDetailsData的additionalButtonsFacet中,最终在页面上显示“MY DRAFT”标签。
内容的提问来源于stack exchange,提问作者AndySpu
相关产品推荐
相关产品推荐

