0

我必须将 Facebook 社交插件集成到 JSF 应用程序中。这建议我将 fbml 命名空间添加到它在响应中呈现的 xhtml 文件中。

我的 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#">

但是fbandog命名空间不会显示在呈现的源代码中,只有 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()并将我的自定义编写器设置为默认值,那就太好了。

这让我想到了两个问题:

  1. 我应该重写哪个类,这样我就不必实现抽象的每个方法ResponseWriter
  2. 我将如何告诉我的应用程序使用我的自定义ResponseWriter

还是实现一个呈现<html>标签的自定义组件?我问这个是因为 facelets 似乎自己渲染<html>标签,而且似乎没有办法改变它,这就是为什么我想出覆盖ResponseWriter.

4

1 回答 1

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">
于 2011-08-26T13:36:37.150 回答