2011-08-23 90 views
0

我必須將Facebook社交插件集成到JSF應用程序中。這建議我將fbml命名空間添加到它在響應中呈現的xhtml文件中。Facebook社交插件和JSF

我在XHTML文件:

<!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:ui="http://java.sun.com/jsf/facelets" 
    ... 
    xmlns:fb="http://www.facebook.com/2008/fbml" 
    xmlns:og="http://ogp.me/ns#"> 

fbog命名空間將不會在渲染源,只有XHTML命名空間中顯示。我怎樣才能將這些命名空間寫入響應?

有這個問題:https://stackoverflow.com/questions/5199176/include-facebook-social-plugins-in-a-jsf2-page但它還沒有被回答。

我唯一的想法是製作一個iframe幷包含一個簡單的XHTML文件(不是Facelet,只是純粹的XHTML),但這似乎很髒。

我希望有人有更好的解決方案。


附加信息:我正在使用facelets和seam 2.2。

我假設ResponseWriter.startDocument()打印Doctype和<html>元素,是否正確?或者它只是另一個UIComponent,呈現<html>元素?如果我可以實現自定義ResponseWriter並覆蓋startDocument()並將我的自定義書寫器設置爲默認,那將會很好。

這使我2個問題:

  1. 我應該覆蓋哪些類,所以我沒有實現的抽象ResponseWriter的每一個方法是什麼?
  2. 我該如何告訴我的應用程序使用我的自定義ResponseWriter

或者是否實現了一個自定義組件來呈現<html>標記作業?我問這個,因爲facelets好像自己渲染了<html>標籤,似乎沒有辦法改變這個,所以我想出了覆蓋ResponseWriter的原因。

回答

1

我發現,我只是寫了一個自定義組件:

public class CvHTML extends UIOutput { 
    @Override 
    public void encodeBegin(final FacesContext context) throws IOException { 
     final ResponseWriter writer = context.getResponseWriter(); 
     writer.startDocument(); 
     writer.startElement("HTML", null); 
     writer.writeAttribute("xmlns", "http://www.w3.org/1999/xhtml", null); 
     writer.writeAttribute("xmlns:fb", "http://www.facebook.com/2008/fbml", null); 
     writer.writeAttribute("xmlns:og", "http://ogp.me/ns#", null); 
    } 

    @Override 
    public void encodeEnd(final FacesContext context) throws IOException { 
     final ResponseWriter writer = context.getResponseWriter(); 
     writer.endElement("HTML"); 
     writer.endDocument(); 
    } 
} 

,並在主模板現在撥打:

<cv:html xmlns="http://www.w3.org/1999/xhtml" lang="en" 
    xmlns:s="http://jboss.com/products/seam/taglib" 
    .... 
    xmlns:cv="http://your.name.space/foo">