0

使用在 NSF 中创建 Java 控件的教程,我能够创建一个简单的 Java 控件。现在我想扩展它以便它显示图像,所以我按以下方式修改了代码:

这是现在扩展UIGraphicEx类而不是扩展类的示例控件类UIComponentBase

package com.example.component;
import com.ibm.xsp.component.UIGraphicEx;
public class ExampleControl extends UIGraphicEx {
    public ExampleControl() {
        super();
        setRendererType("com.ibm.xsp.ImageEx");

    }
    @Override
    public String getFamily() {
        return "com.example.examplecontrol";
    }
}

这是xsp-config上面定义的示例控件类的文件。我通过添加<base-component-type>value ascom.ibm.xsp.component.UIGraphicEx并设置<renderer-type>为 来修改它com.ibm.xsp.ImageEx

<faces-config>
    <faces-config-extension>
        <namespace-uri>http://example.com/xsp/control</namespace-uri>
        <default-prefix>eg</default-prefix>
    </faces-config-extension>
    <component>
        <description>Example</description>
        <display-name>Example Control</display-name>
        <component-type>com.example.examplecontrol</component-type>
        <component-class>com.example.component.ExampleControl</component-class>
        <component-extension>
            <base-component-type>com.ibm.xsp.component.UIGraphicEx</base-component-type>
            <component-family>com.example.examplecontrol</component-family>
            <renderer-type>com.ibm.xsp.ImageEx</renderer-type>
            <tag-name>exampleControl</tag-name>
            <designer-extension>
                <category>Example</category>
                <selected-event>onclick</selected-event>
            </designer-extension>
        </component-extension>
    </component>
</faces-config>

我的渲染器类看起来像这样。ResponseWriter在这里,我没有使用类,而是将UIComponent对象转换为UIGraphicEx并设置其 URL(图像存在于同一数据库中)。

package com.example.renderkit.html_basic;
import javax.faces.render.Renderer;
import java.io.IOException;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import com.ibm.xsp.component.UIGraphicEx;
public class ExampleRenderer extends Renderer {
    @Override
    public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
        UIGraphicEx g = (UIGraphicEx)component;
        g.setUrl("review_icon.gif");
        g.setRendered(true);
        System.out.println("-----------" + g.getUrl());
    }
    @Override
    public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
    }
}

当我将此控件放在 XPage 中时,没有给出输出,但是System.out.println方法中的语句encodeBegin会在控制台中启动。我在这里做错了什么?这是正确的方法吗?

我的最终目标是动态生成图像数据(基于一些输入),然后通过渲染器将其放入图像控制中。我怎样才能做到这一点?

4

2 回答 2

1

请务必确保在组件 xsp-config 和 faces-config 中定义相同的族。另外,正如 Toby 所说,您没有向 ResponseWriter 写任何内容。您需要使用 ResponseWriter 将一些 html 输出到屏幕上。或者,如果您只想输出与 UIGraphicEx 渲染器完全相同的内容,请让您的渲染器扩展它(UIGraphicEx Renderer 类)并调用 super.encodeBegin() 和 super.encodeEnd()。

package com.example.renderkit.html_basic;
import javax.faces.render.Renderer;
import java.io.IOException;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import com.ibm.xsp.component.UIGraphicEx;
public class ExampleRenderer extends Renderer {
    @Override
    public void encodeBegin(FacesContext context, UIComponent component) throws IOException {
        UIGraphicEx g = (UIGraphicEx)component;
        g.setUrl("review_icon.gif");
        g.setRendered(true);
        ResponseWriter writer = context.getResponseWriter();
        writer.append("<img src='http://someserver/somedb.nsf/review_icon.gif' />");
        System.out.println("-----------" + g.getUrl());
    }
    @Override
    public void encodeEnd(FacesContext context, UIComponent component) throws IOException {
    }

}

于 2012-08-21T22:38:23.103 回答
0

编辑:您不能包装 xagent 并将其部署在服务器范围内。我建议使用 servlet 并通过 OSGI 插件部署它。

于 2012-08-21T17:19:00.357 回答