我必须将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#">
但是在呈现的源代码中不会显示fb
和og
名称空间,只显示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>
元素,这是正确的吗?或者它只是另一个呈现<html>
元素的UIComponent
?如果我能实现自定义ResponseWriter
和覆盖startDocument()
,并将我的自定义作家设置为默认值,那就太好了。
这让我想到了两个问题:
- 我应该重写哪个类,这样我就不必实现抽象
ResponseWriter
的每个方法? - 我如何告诉我的应用程序使用自定义
ResponseWriter
?
或者实现呈现<html>
标记的自定义组件是任务吗?我问这个,因为facelets似乎自己渲染<html>
标签,似乎没有办法改变这一点,这就是为什么我想到了覆盖ResponseWriter
。
我发现我只需要编写一个自定义组件:
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">