UIViewRoot имеет метод для добавления компонента ресурса к цели head представления:
public void addComponentResource (контекст FacesContext, UIComponent componentResource): Добавьте componentResource, который, как предполагается, представляет экземпляр ресурса, к текущему представлению.Экземпляр ресурса визуализируется средством визуализации ресурса (таким как ScriptRenderer, StylesheetRenderer), как описано в стандартном HTML-рендер-комплекте.Этот метод приведет к отображению ресурса в элементе «head» представления.
В вашем случае компонент представляет собой UIOutput с атрибутом name и тип рендеринга javax.faces.resource.Stylesheet .
Вы можете добавить ресурс таблицы стилей после добавления вашего пользовательского компонента в представление.Вы делаете это, регистрируя его для прослушивания PostAddToViewEvent.UIInput уже реализует ComponentSystemEventListener, поэтому вам нужно переопределить processEvent.
Это рабочий пример компонента, который добавляет таблицу стилей.
@FacesComponent("CustomComponent")
@ListenerFor(systemEventClass=PostAddToViewEvent.class)
public class CustomComponent extends UIInput{
@Override
public void processEvent(ComponentSystemEvent event) throws AbortProcessingException {
if(event instanceof PostAddToViewEvent){
UIOutput resource=new UIOutput();
resource.getAttributes().put("name", "theme.css");
resource.setRendererType("javax.faces.resource.Stylesheet");
FacesContext.getCurrentInstance().getViewRoot().addComponentResource(FacesContext.getCurrentInstance(), resource);
}
super.processEvent(event);
}
}
Интересно, не проще ли использовать составной компонент?за то, что вы пытаетесь сделать.