2013-06-09 2 views
1

Я пытаюсь отобразить элемент head с атрибутом prefix. Для того, чтобы сделать это в JSF:Пользовательские атрибуты рендеринга заголовка не передаются через

<h:head prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# XXXX: http://ogp.me/ns/fb/XXXX#"> 

Я создал пользовательский head рендерер:

public class FacebookHeadRenderer extends HeadRenderer{ 
    @Override 
    public void encodeBegin(FacesContext context, UIComponent component) 
      throws IOException { 
     ResponseWriter writer = context.getResponseWriter(); 
     writer.startElement("head", component); 
     RenderKitUtils.renderPassThruAttributes(context, 
               writer, 
               component, 
               HEAD_ATTRIBUTES); 
     System.out.println("FacebookHeadRenderer!"); 
    } 

    private static final Attribute[] HEAD_ATTRIBUTES; 
    static { 
     Attribute[] baseAttributes = AttributeManager.getAttributes(
       AttributeManager.Key.OUTPUTHEAD); 
     HEAD_ATTRIBUTES = new Attribute[baseAttributes.length + 1]; 
     for (int i = 0; i < baseAttributes.length; ++i) { 
      HEAD_ATTRIBUTES[i] = baseAttributes[i]; 
     } 
     HEAD_ATTRIBUTES[HEAD_ATTRIBUTES.length - 1] = Attribute.attr("prefix"); 
    } 
} 

и зарегистрировал его в faces-config.xml:

<render-kit> 
    <renderer> 
     <component-family>javax.faces.Output</component-family> 
     <renderer-type>javax.faces.Head</renderer-type> 
     <renderer-class>com.localgp.jsf.FacebookHeadRenderer</renderer-class> 
    </renderer> 
</render-kit> 

FacebookRenderer вызывается (проверяется FacebookHeadRenderer! печатается), но атрибут prefix не отображается.

Подобно тому, как проверки вменяемости, я добавил lang атрибут:

<h:head lang="en_AU" 
     prefix="og: http://ogp.me/ns# fb: http://ogp.me/ns/fb# XXXX: http://ogp.me/ns/fb/XXXX#"> 

и все, что я получил, был

<head lang="en_AU"> 

Идеи?

+0

Это необязательно с помощью [JSF 2.2] (http://download.oracle.com/intl/ru/topic/spb/jsf-2_2-fr-eval-spec/index.html), раздел 10.1.4, Pass Through Атрибуты. – Mike

ответ

3

Ну, кажется, я supposed to call super.encodeBegin(context, component) first. (. Спасибо BalusC)

Так что я изменил рендерер:

public class FacebookHeadRenderer extends HeadRenderer { 
    private static final Attribute[] EXTRA_HEAD_ATTRIBUTES = 
      { Attribute.attr("prefix") }; 

    @Override 
    public void encodeBegin(FacesContext context, UIComponent component) 
      throws IOException { 
     super.encodeBegin(context, component); 
     ResponseWriter writer = context.getResponseWriter(); 
     RenderKitUtils.renderPassThruAttributes(context, 
               writer, 
               component, 
               EXTRA_HEAD_ATTRIBUTES); } 

}

Он работает в настоящее время.