3

我想要一个包含属性 data-target、data-spy 和 data-twwttr-rendered 的(正文),最后看起来像这样:

<body data-target=".bs-docs-sidebar" data-spy="scroll" data-twttr-rendered="true">

你能帮我吗?

4

2 回答 2

7

默认情况下,这在服务器端是不可能的。您必须覆盖现有的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。

于 2013-10-20T11:44:19.767 回答
2

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>

呈现的页面正文具有您想要的属性:

在此处输入图像描述

于 2013-10-19T11:55:02.640 回答