Я столкнулся с проблемой рендеринга контента, передаваемого через фасеты во вложенных составных компонентах. Несмотря на то, что фасеты распознаются как не пустые, содержимое этих фасетов не отображается на последней странице. Ниже приведены соответствующие части моей реализации:
<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>
<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>
<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>
Проблема:
Метка «МОЙ ЧЕРНОВИК», переданная через фасет «дополнительные кнопки» в viretsScenarioDetails, должна отображаться в сценарииDetailsData, но она не отображается на странице.
Что я пробовал:
Вопрос:
Как я могу гарантировать, что контент, проходящий через фасеты во вложенных составных компонентах JSF, правильно отображается в конечном выводе?
Любая помощь или идеи будут очень признательны!
Двойной рендеринг фасета — это не то, что вам нужно. Первый «рендеринг» должен быть просто передачей грани.
сценарийДетали.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:demo = "urn:be:e-contract:ejsf:demo">
<cc:interface componentType = "scenarioDetails">
<cc:facet name = "additionalButtons"/>
</cc:interface>
<cc:implementation>
<div id = "#{cc.clientId}">
<demo:scenarioDetailsData binding = "#{cc.scenarioDetailsData}"/>
</div>
</cc:implementation>
</ui:composition>
Подробности сценария.java:
package be.e_contract.demo;
import javax.faces.component.FacesComponent;
import javax.faces.component.NamingContainer;
import javax.faces.component.UIComponent;
import javax.faces.component.UIComponentBase;
import javax.faces.component.UINamingContainer;
import javax.faces.event.AbortProcessingException;
import javax.faces.event.ComponentSystemEvent;
import javax.faces.event.ComponentSystemEventListener;
import javax.faces.event.ListenerFor;
import javax.faces.event.PostAddToViewEvent;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
@FacesComponent(ScenarioDetails.COMPONENT_TYPE)
@ListenerFor(systemEventClass = PostAddToViewEvent.class)
public class ScenarioDetails extends UIComponentBase implements NamingContainer, ComponentSystemEventListener {
private static final Logger LOGGER = LoggerFactory.getLogger(ScenarioDetails.class);
public static final String COMPONENT_TYPE = "scenarioDetails";
private UIComponent scenarioDetailsData;
public void setScenarioDetailsData(UIComponent scenarioDetailsData) {
this.scenarioDetailsData = scenarioDetailsData;
}
public UIComponent getScenarioDetailsData() {
return this.scenarioDetailsData;
}
public ScenarioDetails() {
setRendererType(null);
}
@Override
public String getFamily() {
return UINamingContainer.COMPONENT_FAMILY;
}
@Override
public void processEvent(ComponentSystemEvent event) throws AbortProcessingException {
UIComponent facet = getFacet("additionalButtons");
this.scenarioDetailsData.getFacets().put("additionalButtonsFacet", facet);
}
}
@AndySpu Нет проблем. Начиная экспериментировать с компонентами поддержки, убедитесь, что они всегда остаются «без состояния». Для более глубокого изучения этой темы ознакомьтесь с разделом 2.9.1 «Вспомогательный компонент» на странице github.com/e-Contract/enterprise-jsf/releases/download/…
Привет, Фрэнк! Я очень ценю время и усилия, которые вы потратили, чтобы помочь мне решить мою проблему с аспектами JSF. Ваше решение дало мне ясность, необходимую для понимания базовой механики, и значительно улучшило мою реализацию. Благодаря вашему руководству теперь я могу правильно отображать фасетное содержимое с помощью вложенных составных компонентов. Еще раз спасибо за содержательную и подробную помощь!