Пользовательский JSF-компонент, который добавляет нового дочернего элемента к фасету "head" страницы - PullRequest
3 голосов
/ 27 августа 2010

Я хочу создать пользовательский компонент, который добавляет новый дочерний элемент к фасету "head" страницы.

Этот пользовательский компонент основан на h: selectOneMenu.При использовании на странице jsf пользователь может просто изменить текущую тему.Что мне нужно сделать этот компонент, это добавить дочернюю таблицу стилей к фасету головы.

Мой компонент поддерживает Java.Я пытался изменить "голову" в методе encodeBegins (), но мой ребенок не отображается вообще.Посмотрите на реализацию:



@FacesComponent(value = "com.ramps.util.ThemeSelector")
public class ThemeSelector extends UIInput implements NamingContainer {

 public void encodeBegin(FacesContext context) throws IOException {

   UIComponent headFacet = context.getViewRoot().getFacet("javax_faces_location_HEAD");     
   Resource res = new Resource();       
   res.setName("...");
   ...
   List <UIComponent> headChildren = headFacet.getChildren();
   headChildren.add(res);

   super.encodeBegin(context);
  }
 }

Можно ли изменить фасет "head" напрямую из поддержки Java моего пользовательского компонента?Если да, то чего мне не хватает?
С уважением

1 Ответ

4 голосов
/ 07 февраля 2011

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);
    }

}

Интересно, не проще ли использовать составной компонент?за то, что вы пытаетесь сделать.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...