Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
为映像组件创建Java控件_Java_Jsf_Xpages_Xpages Extlib - Fatal编程技术网

为映像组件创建Java控件

为映像组件创建Java控件,java,jsf,xpages,xpages-extlib,Java,Jsf,Xpages,Xpages Extlib,使用的教程,我能够创建一个简单的Java控件。现在我想对其进行扩展,使其显示图像,因此我以以下方式修改了代码: 这是示例控件类,它现在扩展了UIGraphicEx类,而不是UIComponentBase package com.example.component; import com.ibm.xsp.component.UIGraphicEx; public class ExampleControl extends UIGraphicEx { public ExampleControl

使用的教程,我能够创建一个简单的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
文件。我修改了它,添加了
,值为
com.ibm.xsp.component.UIGraphicEx
,并将
设置为
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>
当我将此控件放入XPage时,没有给出任何输出,但是方法
encodeBegin
中的
System.out.println
语句在控制台中启动。我做错了什么?这是正确的方法吗


我在这里的最终目标是动态生成图像数据(基于一些输入),然后通过渲染器将其放入图像控制中。如何实现这一点?

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

确保在组件xsp配置和faces配置中定义了相同的系列。另外,正如托比所说,你没有给回复者写任何东西。您需要使用ResponseWriter将一些html输出到屏幕。或者,如果您只想输出与UIGraphicEx渲染器完全相同的内容,请让渲染器扩展它(UIGraphicEx渲染器类),并调用super.encodeBegin()和super.encodeEnd()

package com.example.renderkit.html\u basic;
导入javax.faces.render.Renderer;
导入java.io.IOException;
导入javax.faces.component.UIComponent;
导入javax.faces.context.FacesContext;
导入com.ibm.xsp.component.UIGraphicEx;
公共类ExampleRenderer扩展了渲染器{
@凌驾
public void encodeBegin(FacesContext上下文,UIComponent)引发IOException{
UIGraphicEx g=(UIGraphicEx)组件;
g、 setUrl(“review_icon.gif”);
g、 设置渲染(真);
ResponseWriter=context.getResponseWriter();
作者。追加(“”);
System.out.println(“------------”+g.getUrl());
}
@凌驾
public void encodeEnd(FacesContext上下文,UIComponent)引发IOException{
}

}

我尝试添加您的代码,但它抛出错误
javax.servlet.ServletException:java.lang.StackOverflowerError
。我添加了如下代码:
g.encodeBegin(context);g、 setUrl(“review_icon.gif”);g、 编码结束(上下文)是,在你看了我的答案后,它将不起作用,你能更好地描述你想要渲染的内容吗?您希望此组件与UIGraphicExI有何不同?我计划在XPage中使用XAgent生成图像数据,然后将其放入
src
属性中。我的形象将在飞行中创建。我可以将XPage路径放在
src
中,但是如何将XPage放在Java控件中呢?有没有其他方法可以做到这一点?我不确定你的意思,在过去我使用Xagent将图像/jpeg数据写入响应编写器,我只是能够将xpage路径放入src属性中。你想添加其他变量还是什么?不,你不能用xagent真正做到这一点,但是我建议你可以构建一个Servlet来返回图像,而不是使用xagent。要做一个真正的servlet,请查看Niklas Heidloff的视频。然后您可以将其打包为domino服务器上的osgi插件。是否要在XPage中呈现图形图像?看看OpenNTF上的条形码插件。谢谢你,西蒙。你给我指明了确切的方向。但条形码控件对图像使用Base64字符串。我的图像会更复杂,所以将它们转换为Base64不是一个好主意。此外,我的图像将使用XAgent和XPage生成。我可以将XPage路径放在
src
中,但是如何将XPage放在Java控件中呢?有没有其他方法可以做到这一点?base64转换是这样的,IMG标记可以内联呈现它。因此,如果它对最终用户来说是一个静态图像,那么它应该可以满足您的需要。还是需要用户修改图形?如果是这样的话,看看HTML5画布吧。你的解决方案是可行的,但在我的例子中,图像是动态生成的。西蒙·奥多尔蒂(Simon O'Doherty)在评论中建议我查看条形码控件(),它使用Base64字符串作为图像。我的图像会更复杂,所以将它们转换为Base64不是一个好主意。此外,我的图像将使用XAgent和XPage生成。我可以将XPage路径放在src中,但是如何将XPage放在Java控件中呢?有没有其他方法可以做到这一点?我知道这有点复杂:)也许可以将它添加为iFrame?不知道,从没做过那种事。或者,从XAgent获取作为BuffereImage的图像,然后将其临时保存到磁盘或其他类似的地方。你可能会/可能不会从我博客上的这篇文章中得到一些想法
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 {
    }
}
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 {
    }