Составные компоненты JSF: фасетный контент не отображается через вложенные компоненты

Я столкнулся с проблемой рендеринга контента, передаваемого через фасеты во вложенных составных компонентах. Несмотря на то, что фасеты распознаются как не пустые, содержимое этих фасетов не отображается на последней странице. Ниже приведены соответствующие части моей реализации:

  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>
  1. сценарийDetails.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>
  1. сценарийDetailsData.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>

Проблема:

Метка «МОЙ ЧЕРНОВИК», переданная через фасет «дополнительные кнопки» в viretsScenarioDetails, должна отображаться в сценарииDetailsData, но она не отображается на странице.

Что я пробовал:

  • Обеспечение единообразия имен фасетов для всех компонентов.
  • Непосредственный рендеринг фасета в промежуточных компонентах для проверки его присутствия.

Вопрос:

Как я могу гарантировать, что контент, проходящий через фасеты во вложенных составных компонентах JSF, правильно отображается в конечном выводе?

Любая помощь или идеи будут очень признательны!

Стоит ли изучать PHP в 2023-2024 годах?
Стоит ли изучать PHP в 2023-2024 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
0
77
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Двойной рендеринг фасета — это не то, что вам нужно. Первый «рендеринг» должен быть просто передачей грани.

сценарийДетали.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);
    }
}

Привет, Фрэнк! Я очень ценю время и усилия, которые вы потратили, чтобы помочь мне решить мою проблему с аспектами JSF. Ваше решение дало мне ясность, необходимую для понимания базовой механики, и значительно улучшило мою реализацию. Благодаря вашему руководству теперь я могу правильно отображать фасетное содержимое с помощью вложенных составных компонентов. Еще раз спасибо за содержательную и подробную помощь!

AndySpu 10.06.2024 11:19

@AndySpu Нет проблем. Начиная экспериментировать с компонентами поддержки, убедитесь, что они всегда остаются «без состояния». Для более глубокого изучения этой темы ознакомьтесь с разделом 2.9.1 «Вспомогательный компонент» на странице github.com/e-Contract/enterprise-jsf/releases/download/…

Frank Cornelis 10.06.2024 22:27

Другие вопросы по теме