我想要一个包含属性 data-target、data-spy 和 data-twwttr-rendered 的(正文),最后看起来像这样:
<body data-target=".bs-docs-sidebar" data-spy="scroll" data-twttr-rendered="true">
你能帮我吗?
我想要一个包含属性 data-target、data-spy 和 data-twwttr-rendered 的(正文),最后看起来像这样:
<body data-target=".bs-docs-sidebar" data-spy="scroll" data-twttr-rendered="true">
你能帮我吗?
默认情况下,这在服务器端是不可能的。您必须覆盖现有的ViewRootRenderer。
1. 创建一个新的 Java 类,它扩展了 XPages 的现有 ViewRootRenderer。此类必须重写方法encodeHtmlBodyStart生成body属性的 HTML 代码:
package ch.hasselba.jsf;
import com.ibm.commons.util.StringUtil;
import com.ibm.xsp.component.UIViewRootEx;
import javax.faces.context.FacesContext;
import javax.faces.context.ResponseWriter;
import java.io.IOException;
public class ViewRootRenderer extends
com.ibm.xsp.renderkit.html_basic.ViewRootRendererEx2 {
@Override
protected void encodeHtmlBodyStart(FacesContext fc, UIViewRootEx uiRoot,
ResponseWriter rw) throws IOException {
String str = null;
// begin with body element
rw.startElement("body", uiRoot);
// add style attribute
str = uiRoot.getStyle();
if (StringUtil.isNotEmpty(str)) {
rw.writeAttribute("style", str, "style");
}
// add class attribute
str = uiRoot.getStyleClass();
if (StringUtil.isNotEmpty(str)) {
rw.writeAttribute("class", str, "styleClass");
}
// add your own attributes here
rw.writeAttribute("data-target", ".bs-docs-sidebar", "data-target");
rw.writeAttribute("data-spy", "scroll", "data-spy");
rw.writeAttribute("data-twttr-rendered", "true", "data-twttr-rendered");
// add new line
writeln(rw);
}
}
如您所见,您要添加的属性在上面是硬编码的。硬编码部分(样式和类属性)之前的代码是必需的,因为这是默认代码。
2.在faces-config.xml中注册这个ViewRootRenderer:
<?xml version="1.0" encoding="UTF-8"?>
<faces-config>
<render-kit>
<renderer>
<component-family>javax.faces.ViewRoot</component-family>
<renderer-type>ch.hasselba.jsf.ViewRootRenderer</renderer-type>
<renderer-class>ch.hasselba.jsf.ViewRootRenderer</renderer-class>
</renderer>
</render-kit>
</faces-config>
3. 使用XPage 的renderType属性来添加这个 Renderer 而不是默认的:
<?xml version="1.0" encoding="UTF-8"?>
<xp:view
xmlns:xp="http://www.ibm.com/xsp/core"
rendererType="ch.hasselba.jsf.ViewRootRenderer">
</xp:view>
这是仅将呈现器添加到特定 XPage 的方法。如果要在整个应用程序中覆盖它,则必须更改现有的渲染器类(第 2 步)。
<?xml version="1.0" encoding="UTF-8"?>
<faces-config>
<render-kit>
<renderer>
<component-family>javax.faces.ViewRoot</component-family>
<renderer-type>com.ibm.xsp.ViewRootEx</renderer-type>
<renderer-class>ch.hasselba.jsf.ViewRootRenderer</renderer-class>
</renderer>
</render-kit>
</faces-config>
您现在可以跳过第 3 步,但请注意这会影响应用程序中的每个 XPage。
onClientLoad
您可以在事件上设置正文属性:
<xp:eventHandler
event="onClientLoad"
submit="false">
<xp:this.script><![CDATA[
document.body.setAttribute('data-target', '.bs-docs-sidebar');
document.body.setAttribute('data-spy', 'scroll');
document.body.setAttribute('data-twttr-rendered', 'true');
]]></xp:this.script>
</xp:eventHandler>
呈现的页面正文具有您想要的属性: