Pracuję z dynamicznym pulpitem, na którym użytkownicy mogą przypinać i usuwać elementy według własnego uznania. Teraz mam problem, że chcę dodać istniejący komponent kompozytowy do widoku z komponentu bean. Próbowałem znaleźć prawidłowy sposób na zrobienie tego z internetu, ale jak dotąd nie udało się. Oto prosty składnik kompozytu chcę dodać:Programowe tworzenie i dodawanie komponentu kompozytowego w komponencie bean fasoli
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:cc="http://java.sun.com/jsf/composite"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:p="http://primefaces.org/ui"
xmlns:composite="http://java.sun.com/jsf/composite">
<!-- INTERFACE -->
<cc:interface>
</cc:interface>
<!-- IMPLEMENTATION -->
<cc:implementation>
<h:outputText value="TEST"/>
</cc:implementation>
</html>
Oto kod, który powinien wrócić zespolonej:
public static UIComponent getCompositeComponent(String xhtml, String namespace) {
FacesContext fc = FacesContext.getCurrentInstance();
Application app = fc.getApplication();
Resource componentResource = app.getResourceHandler().createResource(xhtml, namespace);
UIPanel facet = (UIPanel) app.createComponent(UIPanel.COMPONENT_TYPE);
facet.setRendererType("javax.faces.Group");
UIComponent composite = app.createComponent(fc, componentResource);
composite.getFacets().put(UIComponent.COMPOSITE_FACET_NAME, facet);
return composite;
}
A oto jak używam funkcji:
Column column = new Column();
UIComponent test = HtmlUtil.getCompositeComponent("test.xhtml", "comp");
column.getChildren().add(test);
Ale nic nie jest renderowane wewnątrz kolumny. Jakieś pomysły, jak to zrobić? Nie chcę używać metody rendered = "# {bean.isThisRendered}", ponieważ nie pasuje ona do mojego przypadku użycia.
Spośród zainteresowania (wątek jest strasznie źle pokryta, a to przyniesie mi lata naprzód lekkie): Gdzie jesteś Wywoływanie 3-liniowe wywoływanie 'HtmlUtil.getCompositeComponent'? –