2011-08-23 91 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">